我遇到了一个奇怪的编译问题,我甚至不知道它是编译或链接或语法问题还是什么问题。很抱歉这么模糊,但我甚至都在努力解决这个问题。
解释:无论如何,我正在编写一个相当大的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;还是什么?
答案 0 :(得分:2)
在Java中,您可以在类中声明实例字段,也可以初始化它。所以当你写
widget[] myWidgets = new widget[3];
myWidgets[0] = new widget("Blue");
在类的中间,但在任何方法之外,第一行是允许的,因为它定义了一个实例字段myWidgets
并初始化它。
但第二行不属于这种类型。这只是一些可执行代码。在方法之外不允许这样做。
具体来说,编译器抱怨0
,因为可能如果该行以
myWidgets[]
和myWidgets
是一个班级。换句话说,直到编译器到达0
它才意识到这不可能是实例字段或方法签名的开头(它没有检查myWidgets
是否是类型到那时),这就是抱怨的地方。