2011-07-26 6 views
6

XML 스키마 (JAXFront 라이브러리 사용)에서 양식을 생성하고 사용자가 채운 데이터를 XML 문서에 저장하는 애플리케이션을 만들기 위해 javax.swing과 협력 중입니다.javax.swing 애플리케이션에서 예외 캐치

필요할 때 try-catch-finally 블록을 넣었지만 주 스레드가 끝날 때 예외가 잡히는 문제가 있습니다 (AWT 스레드는 여전히 실행 중입니다).

  • Main 클래스 :

    나는 질문을 위해 중요하지 않은 주요 작업과 다른 클래스를 할 두 개의 클래스를 가지고 그것은 다음과 같은 구조를 가지고 있습니다. 응용 프로그램을 초기화하고

    public class Main { 
        public static void main(String[] args) { 
         readArgs(); // An INI file with the app config 
         Model model = initializeElements(args); // My model class 
         try { 
          MyFrame mfr = new MyFrame(title,model); 
          mfr.visualize(); // Assembling view and setting visible 
         } catch(Excepion e) { 
          doCleanUp(); 
          System.exit(-1); 
         } 
        } 
    }
  • 프레임 클래스 메인 프레임 실행 : 를 :보기를 생성을 듣는 이벤트

    public class MyFrame extends JFrame implements ActionListener,MenuListener { 
        // Some attributes 
        // Other mthods without importance 
        /** 
        * Compose the elements, add listeners and set visible the frame 
        */ 
        public void visualize() { 
         generateFormPanel(); 
         setListeners(); 
         validate(); 
         setVisible(true); 
        } 
    
        public MyFrame(String title, Modele model) { 
         super(title); 
         createElementsUsing(model); 
        } 
    
        public void actionPerformed(ActionEvent e) { 
         // Code to manage events 
        } 
    }

음, 문제는 다음과 같다 시각화 기능이 기본 방법에서 발췌되면보기가 생성되어 표시됩니다. 그 순간 나는 예외 잡기에 대한 통제력을 상실합니다. 그럼 내 질문은 이 지점 이후 던져 가능한 RuntimeExceptions를 잡을 수있는 방법이 있다면입니다.

영어를 이해하고 질문에 답변 해 주시면 감사하겠습니다.

미리 감사드립니다.

답변

19

간단한 버전은 기본 캐치되지 않는 예외 핸들러 설정하는 것입니다 :

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    public void uncaughtException(Thread t, Throwable e) { 
     // do something 
    } 
}); 

을하지만 그 프로그램 aswell의 다른 부분에 던져 캐치되지 않는 예외를 잡는다.

당신은 그러나 프록시를 사용하여 스레드를 파견 스윙 이벤트를 던져에만 런타임 예외를 잡을 수있다 (거기에서 자세한 내용을 복사 코드를 this 페이지를 참조하십시오) :

class EventQueueProxy extends EventQueue { 

    protected void dispatchEvent(AWTEvent newEvent) { 
     try { 
      super.dispatchEvent(newEvent); 
     } catch (Throwable t) { 
      // do something more useful than: t.printStackTrace(); 
     } 
    } 
} 

을 지금과 같은를 설치 :

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueueProxy()); 
+0

고마워요. 귀하의 첫 번째 해결책은 제 문제를 해결합니다. 투표 할 수는 없지만 가져가! – Charliemops

1

visualize()을 호출 한 후에는 실행중인 유일한 스레드는 Swing/AWT 이벤트 발송 스레드입니다. 예외를 잡으려면이 스레드에서 호출되는 리스너 메소드에서 수행해야합니다.

public void actionPerformed(ActionEvent e) { 
    try { 
    // Some code here 
    } catch(RuntimeException e) { 
    // Handling code here 
    } 
} 

이 코드는 수퍼 클래스로 만들 수 있습니다.

스윙/AWT 스레드에서 처리하지 않은 내용을 잡으려면 default uncaught exception handler을 설정할 수도 있습니다.

또한 일반적으로 RuntimeException의 하위 클래스를 catch하지 않는 것이 좋습니다.추가

0

시도 : MyFrame을 생성자에

setDefaultCloseOperation(EXIT_ON_CLOSE); 

. 확실하지 않지만, 노력할만한 가치가 있습니다.

+0

종료 이벤트를 제어하기 위해 정리를 수행하는'setDefaultCloseOperation (DO_NOTHING_ON_CLOSE); 및'addWindowListener (새 WindowAdapter() {{}});가 있습니다. – Charliemops

관련 문제