显然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 在Parser.start(Parser.java:25) 在SudoCode.go(SudoCode.java:10) 在SudoCode.main(SudoCode.java:6)
那么......这笔交易是什么?为什么构造函数在未参数化时会被忽略?这不是很直观。这是某种设计选择,我看不出明显的含义吗?如果是这样,请赐教。我应该添加一个任意参数,以便执行构造函数,还是应该创建并显式调用一个专门用于初始化我的ArrayList的方法?
谢谢!
答案 0 :(得分:6)
你的假设是假的。如果没有执行构造函数,则无法实例化对象。
如果你定义一个没有构造函数的类,Java将创建一个没有参数的隐式(“默认”)构造函数。
答案 1 :(得分:2)
如果可能的话,初始化类属性的最佳方法是声明。初始化将在构造函数中的代码执行之前执行,与您使用的构造函数无关。因此,如果您有多个构造函数,则可以保存代码行。在您的情况下使用:
public class DataManager {
ArrayList<Variable> vars = new ArrayList<Variable>();
public DataManager() {
}
}
答案 2 :(得分:0)
如果没有定义构造函数,JAVA使用默认构造函数:
public MyClass() {
}