2011-12-06 48 views
0

我有两个字段:长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); 

该构造函数工作正常,但创建没有。什么是解释,功能应该如何?谢谢。

+0

根据代码,'lines'当你调用'创建()'为空。你的代码应该抛出一个'NullPointerException'。你究竟想达到什么目的? – loscuropresagio

回答

1

你永远不会在你的代码中调用new Vector<Long>()创建载体的实例。此外,如果您的类别变量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); 
} 

} 
1

构造函数中的行将您的Vector设置为null,因此您稍后无法添加它。

if (line!=0) lines.add(linie); 
     else lines=null; // <-- cant call add later on lines 

顺便说一句,如果你打电话给你的构造与其他任何参数,因为你永远不初始化向量线在所有它wouldnt甚至工作。

我不知道你到底尝试做,但您可以在字段定义更改为

public Vector<Long> lines = new Vector<Long>(); 

,然后删除其他在你的构造器。

2

两个问题:

  • 你的构造函数将永远为非零值工作;它会抛出一个空指针异常。这是因为你永远不会初始化lines。您将需要初始化或者当您将它定义为一个成员或构造(如lines = new Vector<Long>();

  • 你总是会得到一个空指针异常,因为你设置的变量linesnull当你调用构造函数与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(line); }其他{ ... }

    • 使用描述性的变量名。 nrap不是很清楚。
    • nrlines真的需要是public?这是例外而非规则。
+0

构造函数正在工作,因为他从来不用任何东西调用它。0 – Stefan

+0

@Stefan好点 - 将解决。 –

0

首先,我不知道类的名称的行为相匹配。像nr这样的名称使代码工作非常困难。考虑将其重命名为更有意义的内容。

关键是你永远不会创建一个Vector对象,只有引用。

,所以我将让你的构造做到这一点:

public Pair(long ap, long line){ 
    this.nr=ap; 
    lines = new Vector<Long>(); 
    if (line!=0) lines.add(line); 
} 
1

lines矢量永远不会初始化。使用0以外的值调用构造函数也会抛出NullPointerException。

您可以将字段声明更改为Vector<Long> lines = new Vector<Long>();或在构造函数的开头调用lines = new Vector<Long>();,如果第二个参数的值为0,则不执行任何操作。

0

行的构造函数丢失。

无论是在线路的定义或者你必须初始化线对的构造函数:

lines = new Vector<Long>();