2010-11-02 84 views
2

冒着像第一次程序員那樣的風險,我在問「關於空指針」怪物的無處不在的問題。這裏是一個代碼段:關於「空指針」怪物

public class pixel 
{ 
    private String type = "empty"; 

    private void Type(String t){type = t;} 
    private String Type(){if(type!=null)return type; else return "empty";} 
} 

意識到這一點:在我的整個代碼中沒有任何一點是否將null傳遞給Type。爲什麼類型不返回一個值? (作爲一個方面說明,我在我的paintComponent的擴展中調用了這個方法,爲了排除一個空數組的可能性(其中存儲了像素對象),我做了相應的檢查)

+7

你是對的,你的代碼看起來就像是第一次-Java程序員,因爲Java codestyle的不正確使用(類名小寫,方法名大寫)和硬的不換行和空格讀線在適當情況下。 – Mot 2010-11-02 05:55:21

+3

當你說「類型不返回值」時,這意味着什麼?它會拋出一個異常,返回'null'還是返回''空''? – Gabe 2010-11-02 06:01:36

+2

代碼更糟糕:所有變量和方法都是私有的,這個類可以被刪除而沒有任何副作用。 – Mot 2010-11-02 15:48:24

回答

0

遵循邏輯。

從你的代碼中,類型永遠不能爲空,所以沒有點檢查。

+2

哦,親愛的,我回答了一個Java問題; P – leppie 2010-11-02 05:52:52

+3

如果一個調用'pixel.Type(null)','type'可以爲null;'雖然Jay說他不知道(但是誰知道)。 – Mot 2010-11-02 05:56:47

+0

@mklhmnn:好點。 +1 – leppie 2010-11-02 05:58:51

3

我同意Type()永遠不會返回null。它不會返回"empty",除非Type(String)從未被呼叫或最近的呼叫通過null。請注意,您的類設計令人困惑(例如兩個名稱相同但用途不同的方法,沒有構造函數)。

1

首先,明確地說,即setType(String t)getType()。相反,現在在您的二傳手中檢查null

public class pixel { 

    private String type = "empty"; 

    private void setType(String t){if (t!=null) type = t;} 
    private String getType(){return type;} 
} 

啊哈!我只注意到你的方法是private。你認真嗎?鬆散地說,你的變量永遠不會改變。我建議的代碼,而無需應用程序的任何知識,

public class pixel { 

    private String type = ""; 

    public void setType(String t){ 
     if (t != null) 
      type = t; 
    } 

    public String getType(){ 
     return type; 
    } 
} 
0

在這種情況下,類型永遠不會爲空,但它是一個非常簡單的例子。順便說一下,如果它在某些情況下變爲空,則應根據您的設計返回空字符串"",或者僅爲空。在這種情況下,"empty"可能是可以容忍的,但不要真正使用這樣的東西。

0

也許我在這裏錯過了點,但不是很明顯(不僅僅是Java),讓我們死後代碼:

public class pixel 
{ 
    private String type = "empty"; //type string with a value of "empty" is available everywhere in the class --- (1) 

    private void Type(String t) 
    { 
     type = t; 
    } 
    private String Type() 
    { 
     if(type!=null) //How can type is null or anything else, you have defined it in (1) 
     { 
      return type; 
     } 

     else 
     { 
      return "empty"; //Type RETURNS "empty" as a value. 
     } 
    } 

    public static void main(String[] args) 
    { 
     pixel obj = new pixel(); 
     System.out.println(obj.Type()); //You call Type() here 
    } 
} 

如果你在類的範圍內使用全局變量的任何位置,如果將提供給你。

+0

'obj.Type()'!類型()是私人的 – 2010-11-02 08:00:38

+0

http://ideone.com/s4pST – zengr 2010-11-02 08:09:57

+0

感謝您的回答。但是,我確實改變了我的方法的可訪問性,因爲這個類是嵌套的,所以訪問不是必須改變的。該問題已通過向該方法添加構造函數得到解決,我認爲在Java API的廣泛網絡中的某處,我遇到了代碼中的一個小問題。但是,我解決了它。謝謝。 – Jay 2010-11-02 22:58:56

1

如果你知道,你從來沒有通過null的類型,使用這個模式:

public final class Pixel { 

    private String type; 

    private Pixel(String type) { 
    setType(type); 
    } 

    private void setType(String type) { 
    type.getClass(); 
    this.type = type; 
    } 

    private String getType() { 
    return type; 
    } 
} 

每個任務之前到type領域,代碼檢查所分配的值不爲空。這與getter和setter結合在一起可以確保這個不變量將成立。當然,除非這是一個內部類,並且您可以從封閉代碼修改它。