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

时间:2014-12-02 19:24:38

标签: java arrays object compiler-errors

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

解释:无论如何,我正在编写一个相当大的Java程序 - 对我而言。在我的代码中,我设置了一个"小部件"对象。小部件被定义为" 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>

是什么给出的?当我在第129行创建小部件数组时,编译器不会抱怨,但是当我尝试插入小部件时,我得到了上述错误。我尝试过很多尝试,但无法弄清楚我做错了什么。

我不认为它是语法错误,因为此代码适用于玩具版本。这是某种链接问题吗?创建/填充小部件数组的代码无法看到&#34; widget.java&#34;还是什么?

1 个答案:

答案 0 :(得分:2)

在Java中,您可以在类中声明实例字段,也可以初始化它。所以当你写

 widget[] myWidgets = new widget[3];

 myWidgets[0] = new widget("Blue");

在类的中间,但在任何方法之外,第一行是允许的,因为它定义了一个实例字段myWidgets并初始化它。

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

具体来说,编译器抱怨0,因为可能如果该行以

开头有效
myWidgets[]

myWidgets是一个班级。换句话说,直到编译器到达0它才意识到这不可能是实例字段或方法签名的开头(它没有检查myWidgets是否是类型到那时),这就是抱怨的地方。