-3

显然,Java 认为我的构造函数代码并不重要,因此它完全忽略它,然后当我尝试访问我认为已初始化的 ArrayList 时用 NullPointerException 对我大喊大叫。只有当我向构造函数添加任意参数时,Java 才会认为它值得一看。

import java.util.ArrayList;

public class DataManager {
    ArrayList<Variable> vars;

    public DataManager() {
        vars = new ArrayList<Variable>();
    }

    public void createVar(String type, String name, String strValue, int numValue) {
        vars.add(new Variable(type, name, strValue, numValue));
    }
}

以及调用它的代码:

DataManager data = new DataManager();
data.createVar(...);

变量类:

class Variable {
    String type;
    String name;
    String strValue;
    int numValue;

    public Variable(String type, String name, String strValue, int numValue) {
            this.type = type; this.name = name;
            this.strValue = strValue;
            this.numValue = numValue;
    }
}

运行此结果

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 1 at Parser.start(Parser.java:25) at SudoCode.go(SudoCode.java:10) at SudoCode.main(SudoCode.java:6)

所以……有什么关系?为什么构造函数没有参数化时会被忽略?这不是很直观。这是某种我看不到明显含义的设计选择吗?如果有,请赐教。我应该添加一个任意参数以便执行构造函数,还是应该创建并显式调用一个专门用于初始化我的 ArrayList 的方法?

谢谢!

4

3 回答 3

6

你的假设是错误的。如果不执行其构造函数,则无法实例化对象。

如果您定义一个没有构造函数的类,Java 将创建一个没有参数的隐式(“默认”)构造函数。

于 2013-01-20T22:43:02.153 回答
2

如果可能,初始化类属性的最佳方法是在声明点。初始化将在构造函数中的代码之前执行,与您使用的构造函数无关。因此,如果您有多个构造函数,则可以节省代码行。在你的情况下使用:

public class DataManager {
    ArrayList<Variable> vars = new ArrayList<Variable>();

    public DataManager() {
    }
}
于 2013-01-20T23:01:43.083 回答
0

如果不定义构造函数,JAVA 使用默认构造函数:

public MyClass() {
}
于 2013-01-20T22:44:51.397 回答