2009-10-22 7 views
2

다음 코드가 있습니다.단일 예외에 대해 catch 블록이 두 번 실행되는 이유는 무엇입니까?

try{ 
    Twitter twitter = new Twitter(user,password); 
    twitter.setStatus(txtStatus.getText()); 

    JOptionPane.showMessageDialog(null, "Success"); 
    txtStatus.setText(""); 
    txtStatus.requestFocus(); 

}catch(Exception e){ 
    JOptionPane.showMessageDialog(null, "Some Error.\n" + 
        " If you see this after Success Message..Ignore"); 
} 

"성공 메시지"대화 상자가 나타난 후에도 "일부 오류"대화 상자가 나타납니다. 이유는 무엇일까요? 런타임 오류가없는 경우 흐름 제어가 catch 블록을 벗어나지 않아야합니다.

예외가 발생하더라도 "일부 오류"대화 상자가 두 번 나타납니다. 왜 이런 현상이 발생합니까?

+1

실제 printStack은 어떻습니까? – ukanth

+2

프로 팁 : ** 절대로 ** 예외를 잡으십시오. **. 그렇게하면 catch 절이 초콜릿 상자처럼 보일 것입니다. – gustafc

+4

* 절대로 말하지 말아라. * - 예외 잡기 (catch Exception) 또는 '잡을 수있는 잡기 (catch Throwable)'를하기를 원할지도 모르는 곳이 몇 군데있다. 프레임 워크 코드에서 광범위한 catch 문을 사용하여 구성 요소를 호출하는 코드를 래핑하면 한 구성 요소로 인해 전체 프레임 워크가 실패하지 않습니다. 또한이 경우 코드가 '오류 처리'보다 '오류보고'가 더 많은 경우입니다. 오류 코드가 실제로 무엇인지 정확히 알 수있는 방법이 없으므로이 특정 코드는 좋지 않습니다. 일반적으로 '오류보고'는 가능하면 앱의 전역에서 한 곳에서 이루어지며, 필요에 따라 오류가 감싸거나 재연되는 경우가 있습니다. – Nate

답변

1

코드를 실제로 두 번 호출 할 수 있습니다. System.out.println 문을 코드 맨 위에 놓거나 디버거에서 실행하고 실제로 한 번만 호출되는지 확인하십시오.

8

다음에 코드 중 하나가 성공 대화 상자가 표시되면 예외가 발생했을 가능성이 있습니다. 특정 예외를 포착하지 않고 백 트레이스를 표시하지 않으므로 말할 방법이 없습니다. catch 된 예외의 printStackTrace 메서드를 사용하여 디버깅을 시작하여 어디서 왔는지 알아냅니다.

1

스택 e.printStackTrace()를 인쇄 - (? 예 txtStatusNullPointerException) 거기에 당신이 잡고있는 예외와 스택 추적에서

+1

아니요,'txtStatus'를 사용하면'NullPointerException'을 throw 할 수 없습니다. 첫 번째 대화 상자 앞에 이미 사용되어 있습니다. – Bombe

+0

맞음, 그 중 하나를 발견하지 못했습니다 :-) – msparer

2

봐 성공 메시지 이후에 예외가있을 수 있습니다, 당신은 계몽 될 수있다 .

첫 번째 대화 후 txtStatus이 null이거나 예외를 throw하는 메서드가 requestFocus()입니다.

txtStatus.setText(""); 
txtStatus.requestFocus(); 
0

예외는이 두 줄 중 하나에 던져 질 수있는 코드가 여러 번 호출되고있다. finally 블록 + 더 현명한 오류 피드백을 추가하십시오.

+0

showMessageDialog()가 예외를 throw하는 경우 두 번째 매개 변수가 "성공"인 경우에만 예외가 표시되지 않는 한 아무 것도 표시되지 않습니다. – quosoo

+0

죄송합니다, 귀하의 생각을 이해하지 못합니다 ... 나는 문제가이 줄에없는 것보다 lakshmanan이 성공 메시지를 보았다고 믿습니다. 예외를 throw 할 수있는 코드는 두 줄 밖에 남지 않습니다. – user132371

0

는 여기 atomice에 동의 :

+0

귀하의 솔루션을 선택했는데 성공 메시지 다음에 "마지막으로"대화 상자가 표시되고 다시 "일부 오류"및 "마지막으로"대화 상자가 표시됩니다. 이 성공 대화 상자가 마지막 대화 일부 오류 대화 상자 마지막으로이 대화 – Anand

+0

당신이 가서 내가 얻을 순서입니다. 즉, 블록을 반복하면서 성공과 오류 메시지가 모두 표시되는 것을 예상하지 못합니다. 여러 번 호출됩니다. – alphazero

0

그리고 두 개의 센트도 넣을 것입니다.

첫 번째 줄에 중단 점을 지정하고 디버거를 통해 봅니다. 두 번 실행되고 있는지, 무언가가 널 (null)인지, 오류가 어디에 있는지 빠르게 확인할 수 있습니다.

디버거가 당신의 친구입니다 :

+0

디버거 모드에서 확인한 결과 위의 코드는 실제로 actionPerformed() 메서드 (버튼 클릭 이벤트의 이벤트 리스너)에 있습니다. 동일한 메소드가 두 번 실행됩니다. – Anand

+0

actionListener 클래스 (버튼 클릭 이벤트에 응답)가 있으며 actionPerformed() 메소드가 있습니다. 위의 코드는 해당 메서드에서 유일한 코드입니다. 왜 이것이 두 번 실행되는거야 ?? – Anand

관련 문제