2010-07-23 75 views
1

我在退出Java应用程序时无法关闭套接字。我认为,一个简单的方法,以确保插座被关闭是扣在的windowClosing在一个Swing JFrame中类似这样的:如何在Java窗口的windowClosing事件中关闭套接字或I/O流?

frame.addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
      input.close(); 
      output.close(); 
      socket.close(); 

      frame.dispose(); 
      System.exit(0); 
     } 
    }); 

但我必须处理IOException异常的密切()创建,我可以在重写事件方法时不会抛出它。

如何确保当程序执行时我的流和套接字会关闭?

谢谢。

回答

2

你不需要扔掉它。赶上它。

try { 
    if(null != input) { 
    input.close(); 
    } 
} catch(IOException ex) { 
    // Log or ignore the exception. 
} 

此外,您不需要调用dispose()或System.exit(0);方法,如果你的主应用程序框架已经关闭。

确保在主应用程序JFrame上设置了以下内容。

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
+0

当我捕捉到这样的异常时,窗口不关闭。它只是坐着,我不得不从IDE中终止运行。而且,套接字仍然没有关闭。不知道我该如何做到这一点。 – FrogOfDoom 2010-07-23 02:37:15

+0

您必须在主应用程序框架上设置以下内容。 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); – S73417H 2010-07-23 02:59:44

+0

我已经知道了。谢谢,不过。 – FrogOfDoom 2010-07-23 03:02:15

0

确保您不会阻塞事件分派线程 - 在某些情况下,close()方法可能会阻塞。

+0

我该如何判断它是否被阻挡?如果确实如此,我该如何防止它呢? 谢谢。 – FrogOfDoom 2010-07-23 03:00:37

+0

它可能取决于环境。例如,黑莓close()方法可能会阻塞2分钟。所以(尽管听起来很糟糕),解决方法是产生一个线程来关闭套接字! – seand 2010-07-23 03:24:11

0

通过捕捉IOException解决了这个问题,正如S73417H所说的,确保按照以下顺序关闭流:输出,输入,套接字。感谢所有回答的人。

+1

记住关闭Socket自己关闭输入和输出流,你正在做额外的工作。 – Ryan 2010-07-23 03:41:18

+0

StackOverflow不是论坛。你应该删除这篇文章,而是接受你认为最有帮助的答案。 – 2010-07-23 06:00:17