【问题标题】:Weird Compiling/Linking Issue While Adding Objects in an Array在数组中添加对象时出现奇怪的编译/链接问题
【发布时间】:2014-12-02 19:24:37
【问题描述】:

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

解释一下:我正在编写一个相当大的 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 行创建一个小部件数组时,编译器没有抱怨,但是当我尝试插入一个小部件时,我得到了上述错误。我已经尝试了很多实验,但无法弄清楚我做错了什么。

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

【问题讨论】:

  • 看起来你是在方法之外编写代码,这在 Java 中是无效的。
  • 嗯,所以澄清一下,上面的程序是可以工作的,而你问的是一个不工作的不同程序?大海捞针?
  • Luiggi 完全正确;我在一个方法之外写,完全没有抓住它。菜鸟失误!

标签: java arrays object compiler-errors


【解决方案1】:

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

 widget[] myWidgets = new widget[3];

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

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

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

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

开头,它可能是有效的
myWidgets[]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2023-02-05
    • 2010-10-03
    • 2016-06-23
    相关资源
    最近更新 更多