用于更改类字段的构造函数或函数

时间:2011-12-06 15:53:29

标签: java oop class constructor

我有两个字段: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不行。什么是解释,该功能应该如何?感谢很多。

6 个答案:

答案 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语法和命名约定。始终用大括号包围ifelse

    if(line!= 0){    lines.add(线); } else {    ... }

    • 使用描述性变量名称。 nrap不是很清楚。
    • nrlines真的需要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>();