【问题标题】:Constructor or function to change class fields用于更改类字段的构造函数或函数
【发布时间】:2011-12-06 15:53:28
【问题描述】:

我有两个字段:long nr 和一个 long 向量,如下所示:

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 不行。解释是什么,函数应该是什么样子?非常感谢。

【问题讨论】:

  • 根据代码,当您调用create() 时,lines 为空。你的代码应该抛出一个NullPointerException。你到底想达到什么目的?

标签: java oop class constructor


【解决方案1】:

两个问题:

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

  • 您总是会得到一个空指针异常,因为当您使用line 参数作为0 调用构造函数时,您将变量lines 设置为null。后续调用create时,lines.add(line)运行时会出现空指针异常。

为了解决您的问题,我会这样做:

lines = new Vector<Long>();

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

注意没有else。我不确定您为什么需要将lines 设置为null,但请注意,如果您这样做,以后将无法使用它。这也是一个非常奇怪的副作用,势必会给你的类的用户造成混淆。

其他一些建议。

  • 请使用正确的 Java 语法和命名约定。始终用大括号包围您的 ifelse

    如果(行!= 0){ 线。添加(线); } 别的 { ... }

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

【讨论】:

  • 构造函数正在工作,因为他从不使用除了 0 之外的任何东西来调用它。
【解决方案2】:

您从未通过在代码中调用 new Vector&lt;Long&gt;() 创建 Vector 实例。此外,如果line == 0,您将您的类变量lines 设置为null

你的代码应该是这样的:

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】:

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

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

    顺便说一句,如果你用任何其他参数调用你的构造函数,它甚至不会工作,因为你根本没有初始化你的行向量。

    我不知道你到底想做什么,但你可以将你的字段定义更改为

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

    然后删除你的构造函数中的 else。

    【讨论】:

      【解决方案4】:

      您的lines 向量永远不会被初始化。使用0 以外的值调用构造函数也会引发 NullPointerException。

      您可以将字段声明更改为Vector&lt;Long&gt; lines = new Vector&lt;Long&gt;(); 或在构造函数的开头调用lines = new Vector&lt;Long&gt;();,如果第二个参数的值为0,则什么也不做。

      【讨论】:

        【解决方案5】:

        首先,我不确定类的名称是否与行为匹配。像nr 这样的名称使代码工作变得非常困难。考虑将其重命名为更有意义的名称。

        关键是你从不创建 Vector 对象,只创建引用。

        所以我会让你的构造函数这样做:

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

        【讨论】:

          【解决方案6】:

          缺少行的构造函数。

          无论是在行的定义中还是在 Pair 的构造函数中,你都必须初始化行:

          lines = new Vector<Long>();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-04-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-12
            • 2012-07-02
            • 2012-09-22
            相关资源
            最近更新 更多