try {} catch {}不起作用

时间:2012-04-25 19:27:59

标签: android android-intent android-widget

这是对EditText表中输入的值进行检查的代码片段,如果输入值错误,请正确显示alertdialog,我更正输入,再次按下按钮完成输入和应用程序崩溃,为什么?

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)

3 个答案:

答案 0 :(得分:2)

如果您不确定要捕获的异常类型,请按照以下方式进行修改:

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

答案 1 :(得分:1)

根据您的堆栈跟踪,当它尝试将双精度分配给array[t]时,它会失败,因为索引t对于数组array无效。

编辑:在考虑@ Gophermofur的评论后,如果此代码段之外的其他代码是正确的,要修复它,请在catch块中重置t。例如如果t开始为0,则在捕获NumberFormatException时将其重置为0。

第二次修改:如果即使在接受正确的输入后也允许编辑这些值,您可能希望在t之后将finally重置为{{1}}块。捕获而不是捕获内部。

答案 2 :(得分:1)

我相信它会在您的错误消息中告诉您要捕获的异常类型:

ArrayIndexOutOfBoundsException

所以

catch (ArrayIndexOutOfBoundsException aioobe) { }