2011-12-06 49 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>();