两个try语句更好的解决方案?

时间:2014-09-01 00:20:37

标签: java exception

我正在尝试使用一个按钮来连接和接受传入连接。我喜欢像这样对按钮的动作监听器进行编码:

button1.addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent evt) 
    {
        try 
        {
            socket = serversocket.accept();  //accepts incoming connections
            socket = new Socket(ip, port);   //tries to connect if
        }                                    //servsock.accept() times out
        catch (Exception e) 
        {

        }
    }
}

如果serversocket.accept()超时,则会导致异常,因此会跳过下一行。我必须把它们放在两个不同的试块中,还是有更好的方法呢?我不能在这里抛出异常,但是如果异常被抛出它会允许代码在出现异常时继续到下一行吗?

我不想编写自己的异常处理程序,我应该只使用两个try语句吗?

3 个答案:

答案 0 :(得分:1)

你需要两个尝试阻止你尝试做的事情 - 然而,我不认为你应该做你正在做的事情。

如果抛出异常,粘贴的代码将不会执行第二行socket = new Socket行。如果您想要执行第二行,那么您是正确的,您必须将其弹出到catch块中,并在其中包含另一个try / catch以防止爆炸。

像这样:

    try 
    {
        socket = serversocket.accept();  //accepts incoming connections
    } catch (Exception e) 
    {
        try {
            socket = new Socket(ip, port); 
        } catch (Exception e) {
          //catch this and deal with it. 
        }
    }

这里的问题是你不需要做你正在做的事情 - 我不是100%熟悉套接字(我只是阅读api {{3} }) - 但我认为你的代码应该是:

    button1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            try {
                //create a server socket to wait on some ip and port
                ServerSocket serverSocket = new ServerSocket(ip, port);   

                //create a socket when a connection hits the ip and port
                socket = serversocket.accept();  //accepts incoming connections

            }
            catch (IOException e){
               //deal with io exception, depends on what you're doing.

            }
            catch (SecurityException e){
               //deal with this, i don't know what it is. 
               //Probably you don't have a security manager(?), 
               // so you can leave this empty
            } 
            catch (SocketTimeoutException e){
               //no timeout, because we didn't set one in the ServerSocket constructor.
               //leave this empty
            }
            catch (IllegalBlockingModeException e){
               //wow sockets have exceptions, huh?
            }
            catch (Exception e) {
               //you no longer need this catch block. Technically you shouldn't have
//one, but given the number of exceptions this thing throws that you aren't doing 
//anything about because they're probably not relevant, you might want to just have 
// this one... your call.


            }
        }
    }

当然,也许你的按钮是点击时坐着等待套接字连接的东西,你在其他地方用超时定义了ServerSocket,你想要在超时失败的情况下发生事情。

如果 是这种情况,那么您将需要从catch块中调用重新启动套接字的相关函数。

像这样:

    try 
    {
        socket = serversocket.accept();  //accepts incoming connections
    } catch (SocketTimeoutException e) {
    //i left out the other exception handlers for clairty
        //call a function here that does recreates the serversocket on the port
        //in *that* function you will do exception handling for that call. 
        makeANewServerSocketFunctionBecauseTimedOut();
    }

    ...
    private void makeANewServerSocketFunctionBecauseTimedOut(){
        try {
            socket = new Socket(ip, port);   //tries to connect 
        } catch (Exception e) { //consider putting all the specific exceptions here
            // i don't know what you'd want to happen if this failed.
        } 
    }

但在阅读完评论后 - 再次,我真的不熟悉套接字和套接字 - 您可能需要将所有这些包装在某种SwingWorker中,这是一种多线程工具,因为我认为实际上,您的整个应用程序将挂起,直到您获得连接...或超时发生。如同,没有其他按钮可以工作。

你可能根本不想要那个。

所以我写的一切都很疯狂!悲伤。

答案 1 :(得分:0)

只要将引发异常的代码放入try中,就需要两个try catch

此尝试中发生的任何事情都会被捕获。

try 
{
     socket = serversocket.accept();  //accepts incoming connections
     socket = new Socket(ip, port);   //tries to connect if
}                                    //servsock.accept() times out

catch (Exception e) 
{
    // Do something here, because an exception happened above.
}

你的括号几乎都在说:内部任何东西抛出异常,抓住它。

答案 2 :(得分:0)

  

如果serversocket.accept()超时,则会导致异常,因此会跳过下一行。

跳过try块的其余部分。

  

我必须将它们放在两个不同的试块中

无论如何,你需要将它们放入不同的块中。你永远不想一个接一个地执行这两行代码。如果接受失败,你只想尝试连接(为什么你这样做)。

  

我不能在这里抛出异常,但是如果抛出异常,它会允许代码在出现异常时继续到下一行吗?

在任何情况下,你都想要继续下一行。您希望处理已接受的套接字(如果有),并在接受失败时尝试连接。 Ergo,不同的街区。

  

我不想编写自己的异常处理程序

为什么不呢?

  

我应该使用两个try语句吗?

使用两个try语句。一到try/catch SocketTimeoutException accept(),,如果你想在这种情况下尝试连接,你必须有一个新的try,除非你已经为这个方法做好了准备将IOException扔给来电者。