2012-04-25 2 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(); 
     } 
    } 
});​ 

당신이 잡을 수있는 예외의 종류를 알 수없는 경우 로그 캣

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

로그 캣의 오류 (스택 추적) 란 무엇입니까? –

+3

나는 NumberFormatException이 던져지지 않는다고 생각합니다. – thumbmunkeys

+1

NPE에 $ 5가 있습니다. 어떤 사람? –

답변

1

당신의 스택 트레이스에 따르면, 때 double을 array[t]에 할당하려고 시도하면 인덱스 t이 배열 array에 유효하지 않으므로 실패합니다.

편집이 조각의 외부 코드의 나머지 부분이 맞다면, Gophermofur의 코멘트 @ 고려 후, 그것을 해결 catch 블록 내부 t를 재설정합니다. 예 : t이 0으로 시작된 경우 NumberFormatException이 잡히면 0으로 재설정하십시오.

2 편집 : 값이도 정확한 입력을 수신 한 후 편집 할 수있는 경우, 당신은 아마 캐치 후 대신 캐치 내부 finally 블록에 t의 리셋을 고수하고자합니다.

+0

어떻게이 문제를 해결할 수 있습니까? 나는 안드로이드 프로그래밍에 익숙하지 않다. – 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'에만 유효합니다. 나는 그 대화 상자에서 모든 예외를 잡는 것에 대해 강력히 권할 것이다. – yincrash

+0

하지만 그는 어떤 예외를 잡을 지 안다. 내 솔루션으로 적어도 catch 유형을 알 수있는 예외 유형을 기록 할 수 있습니다. – waqaslam

+0

솔루션의 문제점은 코드의 버그가 발견되어 개발자에게보고되지 않는다는 것입니다. 이상적으로 개발자는 근본적인 원인과 아무런 관련이없는 오류를 표시하는 대화 상자를 보여주는 것보다는 프로그래밍 오류에 대해 알고 싶어합니다. [여기] (http://c2.com/cgi/wiki?DontCatchRuntimeExceptions)는 왜 모든 예외를 잡아서는 안되는 지에 대한 합리적인 설명입니다. '예외 '를 모두 잡는다면 적절한 행동을 취해야합니다. – yincrash

1

나는 예외의 종류 잡으려고 오류 메시지에 당신을 알려줍니다 믿습니다

ArrayIndexOutOfBoundsException 

그렇게

catch (ArrayIndexOutOfBoundsException aioobe) { }