Java 在数组中添加对象时出现奇怪的编译/链接问题

Java 在数组中添加对象时出现奇怪的编译/链接问题,java,arrays,object,compiler-errors,Java,Arrays,Object,Compiler Errors,我遇到了一个奇怪的编译问题,我甚至不知道这是一个编译、链接或语法问题还是什么。很抱歉这么含糊,但我甚至都在努力诊断这个问题 解释一下:我正准备编写一个相当大的java程序——不管怎样,我都在编写。在我的代码中,我设置了一个“widget”对象数组。这些小部件被定义为一个“widget.java”文件;创建和填充小部件数组的代码位于另一个文件中。在我发布任何东西之前,我试图弄清楚这一点,我简化了代码并编写了一个小玩具版本,如下所示: import java.io.*; import java.la

我遇到了一个奇怪的编译问题,我甚至不知道这是一个编译、链接或语法问题还是什么。很抱歉这么含糊,但我甚至都在努力诊断这个问题

解释一下:我正准备编写一个相当大的java程序——不管怎样,我都在编写。在我的代码中,我设置了一个“widget”对象数组。这些小部件被定义为一个“widget.java”文件;创建和填充小部件数组的代码位于另一个文件中。在我发布任何东西之前,我试图弄清楚这一点,我简化了代码并编写了一个小玩具版本,如下所示:

import java.io.*;
import java.lang.String;
import java.lang.NullPointerException;

public class arrayObjTest {

    public static void main(String[] args) throws IOException {

    widget yellow = new widget("Yellow");

    widget[] myWidgets = new widget[3];

    myWidgets[0] = new widget("Blue");  
    myWidgets[1] = new widget("Red");   
    myWidgets[2] = yellow;  

    }
}

class widget {

    String color;

    public widget(String a) {
      color = a;
    }
}
玩具版(上图)编译得很好。但当我只导入这个

129      widget[] myWidgets = new widget[3];
130      
131      myWidgets[0] = new widget("Blue");
…在我的大代码中,我得到了以下编译错误:

C:\Users\Pete\Desktop\Java Playground\widgetSim>
C:\Users\Pete\Desktop\Java Playground\widgetSim>
C:\Users\Pete\Desktop\Java Playground\widgetSim>"C:\Program Files\Java\jdk1.8.0_20\bin\javac.exe" widgetMachine.java
.\widgetObject.java:131: error: ']' expected
        myWidgets[0] = new widget("Blue");
                  ^
.\widgetObject.java:131: error: ';' expected
        myWidgets[0] = new widget("Blue");
                   ^
.\widgetObject.java:131: error: illegal start of type
        myWidgets[0] = new widget("Blue");
                     ^
.\widgetObject.java:131: error: <identifier> expected
        myWidgets[0] = new widget("Blue");
                      ^
.\widgetObject.java:131: error: ';' expected
        myWidgets[0] = new widget("Blue");
                          ^
.\widgetObject.java:131: error: illegal start of type
        myWidgets[0] = new widget("Blue");
                                 ^
.\widgetObject.java:131: error: <identifier> expected
        myWidgets[0] = new widget("Blue");
                                  ^
.\widgetObject.java:131: error: ';' expected
        myWidgets[0] = new widget("Blue");
                                        ^
.\widgetObject.java:131: error: cannot find symbol
        myWidgets[0] = new widget("Blue");
        ^
  symbol:   class myWidgets
  location: class widgetObject

9 errors

C:\Users\Pete\Desktop\Java Playground\widgetSim>
C:\Users\Pete\Desktop\Java Playground\widgetSim>
C:\Users\Pete\Desktop\Java Playground\widgetSim>
C:\Users\Pete\Desktop\Java游乐场\widgetSim>
C:\Users\Pete\Desktop\Java playway\widgetSim>
C:\Users\Pete\Desktop\Java playway\widgetSim>“C:\Program Files\Java\jdk1.8.0\u 20\bin\javac.exe”widgetMachine.Java
.\widgetObject.java:131:错误:']'
myWidgets[0]=新小部件(“蓝色”);
^
.\widgetObject.java:131:错误:';'预期
myWidgets[0]=新小部件(“蓝色”);
^
.\widgetObject.java:131:错误:类型的开头非法
myWidgets[0]=新小部件(“蓝色”);
^
.\widgetObject.java:131:错误:应为
myWidgets[0]=新小部件(“蓝色”);
^
.\widgetObject.java:131:错误:';'预期
myWidgets[0]=新小部件(“蓝色”);
^
.\widgetObject.java:131:错误:类型的开头非法
myWidgets[0]=新小部件(“蓝色”);
^
.\widgetObject.java:131:错误:应为
myWidgets[0]=新小部件(“蓝色”);
^
.\widgetObject.java:131:错误:';'预期
myWidgets[0]=新小部件(“蓝色”);
^
.\widgetObject.java:131:错误:找不到符号
myWidgets[0]=新小部件(“蓝色”);
^
符号:类myWidgets
位置:类widgetObject
9个错误
C:\Users\Pete\Desktop\Java playway\widgetSim>
C:\Users\Pete\Desktop\Java playway\widgetSim>
C:\Users\Pete\Desktop\Java playway\widgetSim>
有什么好处?当我在第129行中创建一个小部件数组时,编译器不会抱怨,但是当我尝试插入一个小部件时,会出现上述错误。我尝试了很多实验,但不知道我做错了什么


我不认为这是一个语法错误,因为这个代码在玩具版本中工作。这是某种链接问题吗?创建/填充小部件数组的代码看不到“widget.java”或其他内容?

在java中,您可以在类中声明实例字段,也可以对其进行初始化。所以当你写作的时候

 widget[] myWidgets = new widget[3];

 myWidgets[0] = new widget("Blue");
在类的中间,但在任何方法之外,第一行都是允许的,因为它定义了一个实例字段
myWidgets
,并对其进行初始化

但是第二行不是这种类型的。这只是一些可执行代码。这在方法之外是不允许的

具体地说,编译器正在抱怨
0
,因为如果该行以

myWidgets[]

myWidgets
已经成为了一个类。换句话说,直到编译器到达
0
时,它才意识到这不可能是一个实例字段或方法签名的开始(到那时它还没有检查
myWidgets
是否是一个类型),所以它会抱怨这一点。

看起来像是在方法之外编写代码,这在Java.Umm中是无效的,所以澄清一下,上面的程序是有效的,而你问的是另一个不起作用的程序?在干草堆里找到一根针而不是这根?Luiggi完全正确;我在一种方法之外写作,完全没有领会。新手失误!