2014-03-04 36 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