2014-01-07 187 views
0

我的MainActivity代碼空指針訪問警告

private void updateConnectionState() 
     { 
       Device localDevice = this.Controller.getConnectedDevice(); 
       if (localDevice == null) 

       updateModelSpinner(localDevice.getType()); //warning at this line   
       str2 = localDevice.getHostName(); 
       if (!TextUtils.isEmpty(str2)) 

      } 




private void updateSpinner(Device.Type paramType) 
     { 
     boolean bool = Device.Type.UNKNOWN.equals(paramType); 
     int i = 0; 
     if (!bool) 
      i = 1 + paramTvType.ordinal(); 
     this.ModelSpinner.setSelection(i); 
     } 

private void ModelSpinner(Device.Type paramType) 
     { 
     boolean bool = Device.Type.UNKNOWN.equals(paramType); 
     int i = 0; 
     if (!bool) 
      i = 1 + paramType.ordinal(); 
     this.ModelSpinner.setSelection(i); 
     } 

我的枚舉類是

public class Device { 

    private Type type = Type.A_LOGIC; 

    public static Type getTypeForId(int paramInt) 
     { 
     switch (paramInt) 
     { 
     default: 
      return Type.A_LOGIC;  
     case 0: 
      return TvType.B_LOGIC; 
     case 1: 
      return TvType.A_LOGIC; 
     case 2: 
      return TvType.D_LOGIC; 
     case 3: 
      return TvType.E_LOGIC; 
     case 4: 
     } 
     return TvType.F_LOGIC;   
     } 

    public void setType(Type paramType) 
     { 
     this.Type = paramType; 
     } 

    public enum Type 
    {  
     A_LOGIC("A_LOGIC"),     
     B_LOGIC ("B_LOGIC"),  
     C_LOGIC ("C_LOGIC"), 
     D_LOGIC("D_LOGIC"), 
     E_LOGIC ("E_LOGIC"), 
     UNKNOWN("UNKNOWN"); 

     private String object; 

     TvType(String localobj) 
     { 
      this.object; = localobj; 
     }  
     public String getLetter() 
     { 
      return this.object;; 
     }  
    } 

public Type getType() 
     { 
     return this.type; 
     } 

,並在我的方法中的主要活動正在呼叫的類型

updateSpinner(localDevice.getType());

但這裏它顯示的警告爲

Null pointer access: The variable localTVDevice can only be null at this location 

並在該行拋出一個零點錯誤。 對於枚舉的概念我不熟悉,所以請告訴我爲什麼拋出這個錯誤。我提到了堆棧溢出但找不到答案。

+0

您應該共享您的updateSpinner方法。 –

+1

和所有的調用代碼。您發佈的代碼和您的錯誤消息引用了不同的變量名稱,我們需要查看您實際編寫的內容。 – chrylis

+0

您可能希望使用帶有數字字段的枚舉,並在使用'object'的地方使用'name()'。同時檢查你的開關'情況1'這裏可能有一個錯字('C_LOGIC') – 2014-01-07 06:26:19

回答

1

問題是這樣的代碼

if (localDevice == null) 
    updateModelSpinner(localDevice.getType()); 

如果LocalDevice的是空, 然後調用updateModelSpinner(null.getType())

你可能想驗證碼:

if (localDevice != null) 
    updateModelSpinner(localDevice.getType()); 

你」必須決定當localDevice爲空時會發生什麼..

+0

讓我試試這個讓你知道。謝謝你的回答 – AndroidOptimist

+0

@AndroidOptimist這與RC的答案基本相同 - 你說因爲某種原因沒有幫助。 –

+0

感謝Rolf我解決了這個問題。這是我沒有注意到的愚蠢問題。 – AndroidOptimist

2

從代碼:

Device localDevice = this.Controller.getConnectedDevice(); 
if (localDevice == null) 

updateModelSpinner(localDevice.getType()); 

因爲如果沒有{},這個代碼是類似於:

Device localDevice = this.Controller.getConnectedDevice(); 
if (localDevice == null) { 
    updateModelSpinner(localDevice.getType()); 
} 

因此警告

FIX:

Device localDevice = this.Controller.getConnectedDevice(); 
if (localDevice != null) { 
    updateModelSpinner(localDevice.getType()); 
    // more code using localDevice 
} 
+0

我試過這個但仍面臨相同的錯誤 – AndroidOptimist

+0

感謝您指出錯誤 – AndroidOptimist

0

此編譯器警告表明一個變量(在這種情況下,localTVDevice)未分配一個值,並且通過此變量調用方法無疑會在運行時產生NullPointerException

還有一件事我看到你的代碼?您可以直接將枚舉值與'=='進行比較,而不是像在此行中那樣等於:

boolean bool = Device.Type.UNKNOWN.equals(paramType); 

boolean bool = paramType == Device.Type.UNKNOWN;