Могу ли я иметь исключение ввода-вывода при создании серверного сокета на Java?

StackOverflow https://stackoverflow.com/questions/2306342

Вопрос

У меня есть следующий код:

Socket clientSocket = null;
try {
   clientSocket = serverSocket.accept();
} catch (IOException e) {
   System.err.println("Accept failed.");
   System.exit(1);
}

Код взят из java.sun.com.

У меня есть несколько вопросов, касающихся приведенной выше короткой части кода.

  1. Почему мы хотим перехватить исключение IOException.Я думал, что исключение IOException - это то, что может произойти, когда мы используем методы ввода-вывода (не сетевые методы).

  2. В чем разница между "System.err.println" и "System.println"?

  3. В операторе catch у нас есть "e".Для чего?Используем ли мы его последним?

Это было полезно?

Решение

1:Почему мы хотим перехватить исключение IOException.Я думал, что исключение IOException - это то, что может произойти, когда мы используем методы ввода-вывода (не сетевые методы).

Сетевое взаимодействие - это также ввод-вывод.Потоки байтов через сокет.

2:В чем разница между "System.err.println" и "System.println"?

Первый пишет в stderr ( стерр ), второго не существует.

3:В операторе catch у нас есть "e".Для чего?Используем ли мы его последним?

Иметь ссылку на исключение, чтобы вы могли при необходимости записать его в журнал или повторно скопировать.

Другие советы

(a) Вы не "создаете серверный сокет" в этом коде, вы принимаете сокет от ServerSocket.

(b) Это может привести к сбою по множеству причин, включая закрытие ServerSocket;заканчиваются FDs;проблемы с сетевым стеком;истощение памяти;...таким образом, это вызывает исключение IOException .

Одной из распространенных причин, по которой accept выдает исключение IOException, является нехватка дескрипторов файлов.Для создания сокета требуются два дескриптора файлов, и если вы закончите, вы получите сообщение об ошибке типа "Открыто слишком много файлов".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top