我有两个字段:long nr和一个长长的矢量:
public class Pair {
public long nr;
public Vector<Long> lines;
public Pair(long ap, long line){
this.nr=ap;
if (line!=0) lines.add(linie);
else lines=null;
}
public void create (long line){
nr++;
lines.add(line);
}
}
我想要一个函数(创建),以便修改类的字段。在主要班级我有
Pair per1=new Pair(0,0);
Pair per2=new Pair(0,0);
per1.create(3);
per2.create(4);
构造函数工作正常,但create不行。什么是解释,该功能应该如何?感谢很多。
答案 0 :(得分:2)
两个问题:
您的构造函数永远不会用于非零值;它会抛出一个空指针异常。这是因为您永远不会初始化lines
。当您将其定义为成员或构造函数时,您需要初始化它(如lines = new Vector<Long>();
)
当您使用lines
参数作为null
调用构造函数时,您将始终获得空指针异常,因为您将变量line
设置为0
。当您随后调用create
时,运行lines.add(line)
时将获得空指针异常。
为了解决你的问题,我会做这样的事情:
lines = new Vector<Long>();
if(line != 0) {
lines.add(line);
}
注意没有else
。我不确定为什么你需要将lines
设置为null
,但要意识到如果你这样做,你将无法在以后使用它。这也是一个非常奇怪的副作用,必然会引起你班级用户的困惑。
其他一些指示。
请使用正确的Java语法和命名约定。始终用大括号包围if
和else
:
if(line!= 0){ lines.add(线); } else { ... }
nr
和ap
不是很清楚。nr
和lines
真的需要public
吗?这是例外,而不是规则。答案 1 :(得分:1)
构造函数中的行将Vector设置为null,因此您以后无法添加它。
if (line!=0) lines.add(linie);
else lines=null; // <-- cant call add later on lines
顺便说一句,如果你用任何其他参数调用你的构造函数,它甚至都行不通,因为你根本就没有初始化你的行Vector。
我不知道你究竟想做什么,但你可以将你的字段定义更改为
public Vector<Long> lines = new Vector<Long>();
然后删除构造函数中的else。
答案 2 :(得分:1)
您从未在代码中调用new Vector<Long>()
来创建Vector实例。此外,如果lines
,您将类变量null
设置为line == 0
。
您的代码应该是这样的:
public class Pair {
public long nr;
public Vector<Long> lines = new Vector<long>();
public Pair(long ap, long line){
this.nr=ap;
if (line!=0) lines.add(linie);
}
public void create (long line){
nr++;
if (line!=0) lines.add(linie);
}
}
答案 3 :(得分:1)
您的lines
向量永远不会被初始化。使用除0
以外的值调用构造函数也会抛出NullPointerException。
您可以将字段声明更改为Vector<Long> lines = new Vector<Long>();
或在构造函数的开头调用lines = new Vector<Long>();
,如果第二个参数的值为0
,则不执行任何操作。
答案 4 :(得分:0)
首先,我不确定类的名称是否符合行为。像nr
这样的名称使得处理代码变得非常困难。考虑将其重命名为更有意义的内容。
关键是你从不创建Vector对象,只引用。
所以我会让你的构造函数这样做:
public Pair(long ap, long line){
this.nr=ap;
lines = new Vector<Long>();
if (line!=0) lines.add(line);
}
答案 5 :(得分:0)
缺少行的构造函数。
在行的定义或Pair的构造函数中,您必须初始化行:
lines = new Vector<Long>();