2012-04-25 10 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でエラー(スタックトレース)とは何ですか? –

+3

それは投げられるNumberFormatExceptionではないと思われます – thumbmunkeys

+1

NPEに$ 5があります。何かお手数ですか? –

答えて

1

あなたのスタックトレースによると、ときdoubleをarray[t]に割り当てようとすると、インデックスtが配列arrayに対して無効であるため、失敗します。

編集:このスニペットの外であなたのコードの残りの部分が正しい場合、それを修正するために、Gophermofurさんのコメント@を考慮に入れた後、catchブロック内tをリセットします。例えばtが0として起動した場合は、NumberFormatExceptionがキャッチされたときに0にリセットしてください。

第二編集:値がさえ正しい入力を受け付けた後に編集することが許可されている場合、あなたはおそらく、キャッチした後、代わりのキャッチ内finallyブロックにtのリセットを入れたいです。

+0

どうすればこの問題を解決できますか?私はAndroidでのプログラミングにあまり経験がありません – bisemanu

+0

't'と' array'がどのように初期化され使用されているか分かりません。私が知っていることは、入力が解析されたとき、 't'は' t< 0' or 't > = array.length'を意味する 'array'の範囲外です。 – yincrash

+0

値[i] [j]を処理するときにも発生しませんか?値が3行を持たず、各行が3列の場合、私はそれが爆発するだろうと思いますか? – Gophermofur

2

です:

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

表示されている特定のダイアログは 'NumberFormatException'に対してのみ有効です。私はそのダイアログで 'Exception'をすべてキャッチすることを強く推奨します。 – yincrash

+0

しかし、彼はキャッチするどのような例外を知っていない。私の解決策では、少なくとも彼は例外タイプを記録して、何をキャッチするべきかを正確に知ることができます。 – waqaslam

+0

あなたのソリューションの問題は、コード内のバグがキャッチされずに開発者に報告されることです。理想的には、開発者は基本的な原因とは関係のないエラーを表示するダイアログを表示するのではなく、プログラミングエラーについて知りたいと思うでしょう。 [Here](http://c2.com/cgi/wiki?DontCatchRuntimeExceptions)は、なぜあなたがすべての 'Exception'をキャッチしてはならないのかについての合理的な説明です。 'Exception'をすべてキャッチしたら、適切な振る舞いをする必要があります。 – yincrash

1

私はそれをキャッチする例外のエラー・メッセージがどのようなタイプでわかります信じる:

ArrayIndexOutOfBoundsException 

ので

catch (ArrayIndexOutOfBoundsException aioobe) { } 
関連する問題