2011-01-08 1 views
1

JFrame을 여는 테스트 클래스를 만들려고합니다. 주 스레드가 종료되는 순간 창을 닫지 않게하려면 다른 스레드에서 창을 여는 코드를 추가해야합니다.다른 스레드에서 JFrame을 열려고 할 때 java.lang.ExceptionInInitializerError 오류의 원인과 해결 방법은 무엇입니까?

 
Exception in thread "Test Thread" java.lang.ExceptionInInitializerError 
    at java.lang.Runtime.addShutdownHook(Runtime.java:192) 
    at java.util.logging.LogManager.(LogManager.java:237) 
    at java.util.logging.LogManager$1.run(LogManager.java:177) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.util.logging.LogManager.(LogManager.java:158) 
    at java.util.logging.Logger.getLogger(Logger.java:273) 
    at java.awt.Component.(Component.java:173) 
    at reflector.ApplicationRunner.startObjectsPool(ApplicationRunner.java:18) 
    at reflector.ReflectorEndToEndTest$1.run(ReflectorEndToEndTest.java:20) 
Caused by: java.lang.IllegalStateException: Shutdown in progress 
    at java.lang.Shutdown.add(Shutdown.java:62) 
    at java.lang.ApplicationShutdownHooks.(ApplicationShutdownHooks.java:21) 
... 9 more 

코드는 다음과 같습니다 : 나는 응용 프로그램을 실행할 때마다 나는 다음과 같은 예외가 나는 문제를 얻고 왜

@Test 
public void createIntegerClass() throws Exception { 
    Thread t = new Thread("Test Thread") { 
     @Override 
     public void run() { 
      try { 
       application.startObjectsPool(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    t.start(); 
    t.setDaemon(true); 
} 

public class ApplicationRunner { 

    public final static String[] NO_ARGS = null; 

    public void startObjectsPool() throws Exception { 

     ObjectsPoolFrame frame = new ObjectsPoolFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

public ObjectsPoolFrame() { 
    setTitle("Objects Pool"); 

    // get screen dimension 
    Toolkit kit = Toolkit.getDefaultToolkit(); 
    Dimension screenSize = kit.getScreenSize(); 
    int screenHeight = screenSize.height; 
    int screenWidth = screenSize.width; 

    // center frame in screen 
    setSize(screenWidth/2, screenHeight/2); 
    setLocation(screenWidth/4, screenHeight/4); 

    op = new ObjectPool(); 

    // add buttons on the top 
    j1 = new JButton("Create Object"); 
    j2 = new JButton("Delete Object"); 
    j3 = new JButton("Display Methods"); 
    j4 = new JButton("Invoke Method"); 
    JPanel buttonPanel = new JPanel(); 
    buttonPanel.add(j1); 
    buttonPanel.add(j2); 
    buttonPanel.add(j3); 
    buttonPanel.add(j4); 
    add(buttonPanel, BorderLayout.NORTH); 
    j1.addActionListener(new CreateObjectAction()); 
    j2.addActionListener(new DeleteObjectAction()); 
    j3.addActionListener(new DisplayMethodAction()); 
    j4.addActionListener(new InvokeMethodAction()); 

    comboBox = new JComboBox(); 
    comboBox.addActionListener(new ComboBoxClearAction()); 
    addComboBoxItem(); 

    comboBox2 = new JComboBox(); 

    JPanel comboPanel = new JPanel(); 
    comboPanel.add(new JLabel("Objects")); 
    comboPanel.add(comboBox); 

    comboPanel.add(new JLabel("Methods")); 
    comboPanel.add(comboBox2); 
    add(comboPanel, BorderLayout.CENTER); 

    displayMessage = new JLabel(); 
    JPanel displayPanel = new JPanel(); 
    displayPanel.add(displayMessage); 
    add(displayPanel, BorderLayout.SOUTH); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
} 

나는 알아낼 수 없습니다.

+0

서식있는 코드; 잘못된 경우 되돌려주십시오. – trashgod

답변

1

예외 메시지는 정확히 무엇이 잘못되었는지를 알려주며 JVM이 종료되는 동안 새 스레드를 만들려고합니다.

주 스레드가 종료 될 때 JVM이 종료되는 이유는 이벤트 스레드에서 setDaemon(true)을 호출하기 때문입니다. 해당 줄을 제거하면 JVM은 해당 스레드가 살아있는 한 계속 남아 있습니다.

+0

나는 setDaemon 코드를 주석 처리했으며 여전히 예외가 발생합니다. – user305801

+0

무슨 일이 일어나고 있는지보기가 어렵습니다. 질문 서식을 수정 해 주시겠습니까? 어쨌든 이미 종료 된 상태에서 새 스레드를 시작하여 JVM을 저장하려고하면 정말 이상한 접근 방식입니다. :-) –

+0

문제점을 발견했습니다. 그 이유는 Nat Pyrce의 Window Licker 라이브러리를 사용하지 않으면 다른 스레드를 생성 할 필요가 없기 때문입니다. 제 의도는 스윙 GUI 테스트를 자동화하는 것이 었습니다. – user305801

0

스레드를 데몬 (true)으로 설정하려고하면 문제가 발생합니다. 응용 프로그램을 종료하면 스레드를 중지 할 수 없습니다 당신은 명시 적으로가 shotdownhook을 추가하여, 어쨌든 스레드를 닫 런타임에게 에있는이 문제에 걸쳐 왔을 때 따라서 java.lang.IllegalStateException: Shutdown in progress

가 발생합니다.

public void createIntegerClass() throws Exception { 
    Thread t = new Thread("Test Thread") {...}; 

    Runtime.getRuntime().addShutdownHook(t);//explicit! 
    t.start(); 
    t.setDaemon(true); 
} 
+0

난 내 문제를 해결하기 때문에 내가 upvote 수 있기를 바란다 : http://stackoverflow.com/questions/39891680/illegalstateexception-only-when-running-from-command-shell?noredirect=1#comment67070446_39891680 –

관련 문제