0

try/catch 문을 actionListener의 내부 클래스에서 사용하려고하지만 일부러 의도적으로 트리거 한 경우에도 예외를 catch하지 않습니다.try/catch 문이 예외를 catch하지 않습니다.

btnPerformCalculation.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent ae) { 

     double runtime = Math.abs(Double.parseDouble(txtRunTime.getText())); 
     double downtime = Math.abs(Double.parseDouble(txtDownTime.getText())); 
     double blockedtime = Math.abs(Double.parseDouble(txtBlockedTime.getText())); 
     double lineefficiency = 100 * runtime/(runtime + downtime + blockedtime); 

     try { 
      txtEfficiencyAnswer.setText(String.format("%.2f", lineefficiency)); 
     } catch (Exception e) { 
      JOptionPane.showMessageDialog(frame, "Error:" + e.getMessage()); 
      txtRunTime.setText("0"); 
      txtDownTime.setText("0"); 
      txtBlockedTime.setText("0"); 
     } 
    } 
}); 
+2

당신이 먼저 당신이의 스택 트레이스를 게시 할 수있는 당신은? –

+5

를 사용하는 언어 질문에 태그를 주시겠습니까 예외 – MahdeTo

+2

try에서 예외가 throw되고 이전에 행에서 수행 된 모든 변환에서 예외가 발생 했습니까? – bluesman

답변

0

잡는 유일한 예외는 txtEfficiencyAnswer.setText(String.format("%.2f", lineefficiency));입니다. 복식에 null의 가능성이있는 텍스트 값을 변환 다른 모든 계산은 (예를 들면 시도 블록 전에 완료, 따라서 적발되지 않습니다.

txtEfficiencyAnswer 중 하나라고 가정 할 JTextComponent 또는 JLabel, 그 블록에서 예외에 대한 유일한 명백한 이유 null하는 NullPointerExceptiontxtEfficiencyAnswer 경우 일 것이다. null가 아닌 경우에, 당신은 캐치 블록을 입력하지 않습니다.

+0

입력 해 주셔서 감사합니다. 응답하려면 txtEfficiencyAnswer가 JTextField입니다. IDE는 프로그램이 숫자를 예상 할 때 문자를 배치하여 프로그램을 테스트하기 때문에 NumberFormatException이라고 말합니다. 프로그램 번호를 입력하면 잘 작동합니다. NumberFormatException을 사용하여 try catch를 시도하지만 예외를 처리하지 못합니다. – ForgottenKahz

+0

@ForgottenKahz "다른 모든 계산 (예 : null 텍스트 값을 double 값으로 변환하는 것은 try-block 전에 수행되므로 잡히지 않습니다.") 이것은 Double.parseDouble에서 파싱 할 수없는 텍스트에도 적용되므로 NumberFormatException. –

+0

프로그램이 충돌하기 전에 try/catch 전에 숫자 형식 오류가 발생했다는 것을 이해하고 코드를 다시 방문한 다음 try/catch 문이 올바르게 작동하는 결과를 두 번 구문 분석 할 문자열을 포함하도록 try 문을 이동했습니다. – ForgottenKahz

-3

아마 setText 던져 RuntimeException : 여기에 코드를 발췌 한 것입니다. catch (RuntimeException e)

  • 인쇄 스택 트레이스에

    1. 변경 catch 문.
  • +3

    'RuntimeException'은'Exception'을 확장합니다. –

    0

    먼저 JOptionPane.showMessageDialog가 예외를 throw하지 않는 것을 어떻게 확신합니까? 출력이나 로깅을 캐치의 첫 번째 문으로 두는 것이 좋습니다. 둘째, 모든 "예외"가 Exception의 하위 클래스는 아닙니다. catch (Throwable e)를 사용하여 문제가 해결되었는지 확인하십시오.

    코드에 catch (Throwable e)를두면 매우 낮은 수준의 jvm 문제도 잡을 것이므로 권장하지 않습니다. 하지만 적어도 상황을 이해하는 데 도움이 될 것입니다.

    +0

    (Throwable e)가 작동하지 않았지만 시도할만한 가치가있었습니다. 프로그램이 충돌 한 후 IDE에 NumberFormatException 설명이 표시됩니다. JOptionPane.showMessageDialog를 주석 처리하고 간단한 System.out.Println()을 대신 작성했습니다. 같은 문제. 프로그램이 충돌했고 IDE의 대화 상자에서 NumberFormatException을 언급했습니다. 이 문제의 근본 원인은 의도적으로 필드 이외의 다른 부분에 내가 잡으려는 버그를 유발하는 필드를 입력 할 때 발생합니다. – ForgottenKahz

    +0

    @bluesman이 제안했듯이, 그것은 try가 블럭되기 전에 코드에 의해 예외가 발생했다는 것을 분명히합니다. –

    +0

    숫자 형식 오류는 try/catch 블록의 try 부분보다 먼저 발생했습니다. try {}를 옮기 자마자 프로그램은 문자열에서 나온 숫자 형식 예외를 두 번 파싱합니다. – ForgottenKahz