2014-03-04 38 views
0

我遇到空指針異常的問題。請說明它的一些一般情況。整型數組中的NullPointerException

這裏是我的代碼:

public class GuessActivity extends ListActivity implements OnClickListener 
{ 
EditText GNum; 
Button nxt; 
int[] a = new int[4]; 
int[] d = new int[4]; 
int t = 0; 
ArrayList<HashMap<String, String>> output = new ArrayList<HashMap<String, String>>(); 
HashMap<String, String> out = new HashMap<String, String>(); 
String KEY_NUM , KEY_BULLS , KEY_COWS; 


protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.guess_activity); 

    GNum = (EditText) findViewById(R.id.etGuessNum); 
    nxt = (Button) findViewById(R.id.btNxt); 
    a = getIntent().getExtras().getIntArray("num"); 

    nxt.setOnClickListener(this); 
} 


@Override 
public void onClick(View v) 
{ 
    if(v.getId() == R.id.btNxt) 
    { 
     String gN = GNum.getText().toString(); 
     int l = gN.length(); 
     int b =0; 
     int c =0; 
     if(l!=4) 
     { 
      Toast.makeText(getApplicationContext(),"Number should be of 4 digits", 
        Toast.LENGTH_LONG).show(); 
     } 
     else 
     { 
      t++; 
      int x = Integer.parseInt(gN); 

      for(int i=0;i<4;i++) 
      { 
       d[i] = x%10; 
       x = x/10; 
      } 
      if(t>8) 
       Toast.makeText(getApplicationContext(), "You Lost the Game", 
         Toast.LENGTH_SHORT).show(); 
      else 
      { 

       if(d[0] == a[0]) 
        b++; 
       if(d[0] == a[1] || d[0] == a[2] || d[0] == a[3]) 
        c++; 
       if(d[1] == a[1]) 
        b++; 
       if(d[1] == a[0] || d[1] == a[2] || d[1] == a[3]) 
        c++; 
       if(d[2] == a[2]) 
        b++; 
       if(d[2] == a[1] || d[2] == a[0] || d[2] == a[3]) 
        c++; 
       if(d[3] == a[3]) 
        b++; 
       if(d[3] == a[1] || d[3] == a[2] || d[3] == a[0]) 
        c++; 

       if(b == 4) 
        Toast.makeText(getApplicationContext(), "You Win", 
         Toast.LENGTH_SHORT).show(); 
      } 
      out.put(KEY_NUM , gN); 
      out.put(KEY_BULLS ,String.valueOf(b)); 
      out.put(KEY_COWS , String.valueOf(c)); 

      output.add(out); 


      ListAdapter adapter = new SimpleAdapter(this, output, 
        R.layout.list_item, 
        new String[] { KEY_NUM , KEY_BULLS , KEY_COWS}, new int[] { 
          R.id.tvGuessNum , R.id.tvBulls ,R.id.tvCows }); 

      setListAdapter(adapter); 
      ListView lv = getListView(); 
     } 
    } 
} 
} 

這裏是堆棧跟蹤:66

03-04 06:32:58.960: W/dalvikvm(844): threadid=1: thread exiting with uncaught exception (group=0xb3ab2ba8) 
03-04 06:32:58.970: E/AndroidRuntime(844): FATAL EXCEPTION: main 
03-04 06:32:58.970: E/AndroidRuntime(844): Process: com.example.game, PID: 844 
03-04 06:32:58.970: E/AndroidRuntime(844): java.lang.NullPointerException 
03-04 06:32:58.970: E/AndroidRuntime(844): at com.example.game.GuessActivity.onClick(GuessActivity.java:66) 
03-04 06:32:58.970: E/AndroidRuntime(844): at android.view.View.performClick(View.java:4438) 
03-04 06:32:58.970: E/AndroidRuntime(844): at android.view.View$PerformClick.run(View.java:18422) 
03-04 06:32:58.970: E/AndroidRuntime(844): at android.os.Handler.handleCallback(Handler.java:733) 
03-04 06:32:58.970: E/AndroidRuntime(844): at android.os.Handler.dispatchMessage(Handler.java:95) 
03-04 06:32:58.970: E/AndroidRuntime(844): at android.os.Looper.loop(Looper.java:136) 
03-04 06:32:58.970: E/AndroidRuntime(844): at android.app.ActivityThread.main(ActivityThread.java:5017) 
03-04 06:32:58.970: E/AndroidRuntime(844): at java.lang.reflect.Method.invokeNative(Native Method) 
03-04 06:32:58.970: E/AndroidRuntime(844): at java.lang.reflect.Method.invoke(Method.java:515) 
03-04 06:32:58.970: E/AndroidRuntime(844): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
03-04 06:32:58.970: E/AndroidRuntime(844): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
03-04 06:32:58.970: E/AndroidRuntime(844): at dalvik.system.NativeStart.main(Native Method) 

線是在onClick方法:d[i] = x % 10

+2

你檢查其值爲'null'在您在您的拋出異常行? – Smutje

+0

「儘快回覆」 - >不好。 –

+0

'一般情況下'。當您嘗試使用(「取消引用」)沒有分配對象的對象變量(它是「未初始化」)時,會發生空指針異常。在您初始化它們之前,Java中的所有對象變量均設置爲null。 'Object myObject; myObject.toString();'給出NullPointerException。 'Object myObject = new Object(); myObject.toString();'工作正常。順便說一句,學會使用調試器,然後找到這些非常簡單。 – Simon

回答

-1

改變這一點:

String gN = GNum.getText()的toString(); //可以爲空

到:

String gN = GNum.getText().toString(); //can be null 
if(gN == null) 
return; 

INT升= gN.length(); //如果編輯文本爲空,則將爲空

+5

getText永遠不會返回空值。檢查文檔 – Blackbelt

+1

和'Integer。parseInt(null)'會拋出一個不同的例外情況,在這種情況下, –

2

看起來像EditText(R.id.etGuessNum)在其中沒有值。

您應該清理輸入以避免空引用。我還建議你檢查一下他們輸入的值是否是一個有效的數字。

對於Java,我還將通過namingconventions快速閱讀。

+1

不會拋出'NumberFormatException'而不是'NullPointerException'嗎? –

+0

另外,他檢查「EditText」的長度。它會打印吐司。 – Manu

+0

@Manu - 如果長度不是4,它會進入else塊。 –

0
  1. Your 3 Strings KEY_NUM, KEY_BULLS, KEY_COWS are null。

  2. 另外,你確定a是不是空? a = getIntent().getExtras().getIntArray("num");可能會返回null。

  3. 變化

    if(l!=4) 
    { 
        Toast.makeText(getApplicationContext(),"Number should be of 4 digits", 
          Toast.LENGTH_LONG).show(); 
    } 
    

    if(l!=4) 
    { 
        Toast.makeText(getApplicationContext(),"Number should be of 4 digits", 
          Toast.LENGTH_LONG).show(); 
        return; 
    } 
    
+0

NPE在此之前。 –

+0

不是線路上的問題'd [i] = x%10;' –

+0

它不可能,因爲d,i和x是int(或int的數組),它不會拋出NPE – Manu