Как закрыть соединение ServerSocket при перехвате IOException? - PullRequest
3 голосов
/ 04 ноября 2011

Извините за вопрос, но я совершенно нуб в Java.Как лучше всего выполнять ServerSocket.close() при получении IOException из ServerSocket?Согласно документации, ServerSocket.close() выдает IOException, и компилятор просит нас его перехватить.Как правильно закрыть соединение на IOException?

try {
    server = new ServerSocket(this.getServerPort());
    while(true) {
        socket = server.accept();
        new Handler( socket );
    }
} catch (IOException e) {
    if (server != null && !server.isClosed()) {
        server.close(); //compiler do not allow me to do because I should catch IOExceoption from this method also...
    }
}

Спасибо!

Ответы [ 4 ]

7 голосов
/ 04 ноября 2011

Если вы в любом случае собираетесь закрыть ServerSocket вне try {} catch {}, вы можете также поместить его в, наконец, {}

try {
    server = new ServerSocket(this.getServerPort());
    while(true) {
        socket = server.accept();
        new Handler( socket );
    }
} catch (IOException e) {
    // Do whatever you need to do here, like maybe deal with "socket"?
}
finally {
    try {  
        server.close();
    } catch(Exception e) {
        // If you really want to know why you can't close the ServerSocket, like whether it's null or not
    }
}
6 голосов
/ 04 ноября 2011

Это ужасно в Java. Я ненавижу это, но это то, как вы должны это сделать: завернуть в другую попытку:

try {
    server = new ServerSocket(this.getServerPort());
    while(true) {
        socket = server.accept();
        new Handler( socket );
    }
} catch (IOException e) {
    if (server != null && !server.isClosed()) {
        try {
            server.close();
        } catch (IOException e)
        {
            e.printStackTrace(System.err);
        }
    }
}
4 голосов
/ 11 ноября 2015

В Java SE 7 или новее вы можете использовать оператор try-with-resources , ServerSocket implements java.io.Closeable, поэтому вам не нужно явно #close() сокет при использовании таким способом.

try (ServerSocket server = new ServerSocket(this.getServerPort())) {
    while(true) {
        socket = server.accept();
        new Handler( socket );
    }
} catch (IOException e) {
    // It's already closed, just print the exception
    System.out.println(e);
}
2 голосов
/ 04 ноября 2011

Вы можете закрыть ресурсы в блоке finally,

http://download.oracle.com/javase/tutorial/essential/exceptions/finally.html

 } finally {
      try {
        socket.close();
      } catch(IOException e) {
         e.printStackTrace(); 
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...