2012-04-25 30 views
0

這是執行對EditText表格中輸入值的檢查的一段代碼,如果輸入值錯誤,則正確顯示alertdialog ,我糾正了輸入,再次按下按鈕來完成輸入和應用程序崩潰,爲什麼?try {} catch {}不起作用

button = new Button(this); 
button.setText("Riempi la prima Matrice"); 
tableLayout.addView(button); 
button.setOnClickListener(new OnClickListener() { 
    public void onClick(View arg0) { 
     try { 
      for (int i = 0; i < 3; i++) { 
       for (int j = 0; j < 3; j++) { 
        array[t] = Double.parseDouble(values[i][j].getText().toString()); 
        t++; 
       } 
      } 
     } 
     catch (NumberFormatException nfe) { 
      AlertDialog.Builder builder; 
      builder = new AlertDialog.Builder(SecondaAttivita.this); 
      builder.setTitle("Error"); 
      builder.setMessage("Wrong input format"); 
      builder.setIcon(android.R.drawable.ic_dialog_alert); 
      builder.setNeutralButton("OK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) {} 
      }); 
      builder.show(); 
     } 
    } 
});​ 

這是一個logcat的

FATAL EXCEPTION: main 
java.lang.ArrayIndexOutOfBoundsException 
it.bisemanuDEV.prodMatrix.SecondaAttivita$1.onClick(SecondaAttivita.java:96) 
android.view.View.performClick(View.java:2408) 
android.view.View$PerformClick.run(View.java:8816) 
android.os.Handler.handleCallback(Handler.java:587) 
android.os.Handler.dispatchMessage(Handler.java:92) 
android.os.Looper.loop(Looper.java:123) 
android.app.ActivityThread.main(ActivityThread.java:4627) 
java.lang.reflect.Method.invokeNative(Native Method) 
java.lang.reflect.Method.invoke(Method.java:521) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
dalvik.system.NativeStart.main(Native Method) 
+1

什麼是logcat的錯誤(堆棧跟蹤)? – 2012-04-25 19:30:06

+3

我懷疑它不是一個NumberFormatException被拋出 – thumbmunkeys 2012-04-25 19:30:12

+1

我在NPE上得到了5美元。任何接受者? – 2012-04-25 19:34:15

回答

1

根據您的堆棧跟蹤,它會嘗試將雙精度分配給array[t],因爲索引t對於數組array無效,所以失敗。

編輯:考慮到@ Gophermofur的評論,如果你的代碼的這個片斷之外,其餘是正確的之後,修復它,重新t catch塊內。例如如果t從0開始,則在捕獲NumberFormatException時將其重置爲0。

第二編輯:如果允許值甚至接受正確輸入之後進行編輯,你可能想的t復位粘成finally塊抓後,而不是抓內。

+0

那麼我該如何解決這個問題?我在Android中編程不是很有經驗 – bisemanu 2012-04-25 19:45:49

+0

沒有看到't'和'array'是如何被初始化和使用的,這是不可能知道的。我所知道的是,當輸入被解析時,'t'超出'array'的範圍,意味着't < 0' or 't > = array.length'。 – yincrash 2012-04-25 19:52:44

+0

處理值[i] [j]時是否也發生?如果值沒有3行,每行有3列,我猜會爆炸? – Gophermofur 2012-04-25 19:59:44

2

如果您不確定類型的異常捕捉的,然後使它如下一般:當

try{ 
    ... 
} 
catch (Exception ex) { 
    ... 
} 
+0

顯示的特定對話只對'NumberFormatException'有效。我會強烈建議不要使用該對話框捕捉所有的「Exception」。 – yincrash 2012-04-25 19:39:12

+0

但他不知道要捕捉什麼異常。使用我的解決方案,至少他可以記錄異常類型以確切知道要捕獲什麼 – waqaslam 2012-04-25 19:46:47

+0

解決方案的問題是代碼中的錯誤不會被捕獲並報告給開發人員。理想情況下,開發人員需要了解編程錯誤,而不是僅顯示一個對話框,顯示與底層原因無關的錯誤。 [Here](http://c2.com/cgi/wiki?DontCatchRuntimeExceptions)是一個合理的解釋,爲什麼你不應該只捕獲所有'Exception's。如果你確實捕獲了所有'Exception's,你應該有適當的行爲。 – yincrash 2012-04-25 20:11:33

1

我相信它會告訴你在你的錯誤信息捕捉異常的類型:

ArrayIndexOutOfBoundsException 

所以

catch (ArrayIndexOutOfBoundsException aioobe) { }