有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我希望有一个函数(create),以便它修改类的字段。在我的主课上

Pair per1=new Pair(0,0);
Pair per2=new Pair(0,0);

per1.create(3);
per2.create(4);

构造函数可以很好地工作,但是create不能。解释是什么,函数应该是什么样子?非常感谢


共 (6) 个答案

  1. # 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);
    }
    
    }
    
  2. # 2 楼答案

    构造函数中的行将向量设置为null,因此以后不能添加到该行中

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

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

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

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

    然后移除构造器中的else

  3. # 3 楼答案

    两个问题:

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

    • 当使用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不是很清楚
      • {}和{}真的需要成为{}吗?这是例外,而不是规则
  4. # 4 楼答案

    缺少行的构造函数

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

    lines = new Vector<Long>();
    
  5. # 5 楼答案

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

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

  6. # 6 楼答案

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

    关键是永远不要创建向量对象,只创建引用

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

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