簡體   English   中英

構造函數或函數來更改類字段

[英]Constructor or function to change class fields

我有兩個字段: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不能。 解釋是什么,函數應該是什么樣?非常感謝。

兩個問題:

  • 您的構造函數永遠不會對非零值起作用; 它將拋出一個空指針異常。 這是因為您永遠不會初始化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

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

    • 使用描述性的變量名。 nrap不太清楚。
    • nrlines真的需要public嗎? 那是例外,而不是規則。

構造函數中的行將Vector設置為null,因此以后無法添加。

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

順便說一句,如果您用任何其他參數調用構造函數,它甚至都不會起作用,因為您根本不會初始化行向量。

我不知道您到底想做什么,但是您可以將字段定義更改為

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

然后刪除contructor中的else。

您從未通過在代碼中調用new Vector<Long>()來創建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);
}

}

您的lines向量永遠不會初始化。 用非0的值調用構造函數也會引發NullPointerException。

您可以將字段聲明更改為Vector<Long> lines = new Vector<Long>(); 或調用lines = new Vector<Long>(); 在構造函數的開頭,如果第二個參數的值為0 ,則不執行任何操作。

首先,我不確定類的名稱是否與行為匹配。 諸如nr名稱使使用代碼非常困難。 考慮將其重命名為更有意義的名稱。

關鍵是您永遠不會創建Vector對象,而僅創建引用。

所以我會讓你的構造函數這樣做:

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

行的構造函數丟失。

在行的定義或Pair的構造函數中,您必須初始化行:

lines = new Vector<Long>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM