Что мне делать, если выбрасывается IOException? - PullRequest
5 голосов
/ 23 марта 2010

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

ServerSocket listeningSocket = new ServerSocket(earPort);
Socket serverSideSocket = listeningSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(serverSideSocket.getInputStream()));

Компилятор жалуется на все эти 3 строки, и его жалобы одинаковы для всех 3 строк: незарегистрированное исключение java.io.IOException; Более подробно, эти исключения генерируются new ServerSocket, accept() и getInputStream().

Я знаю, что мне нужно использовать try ... catch .... Но для этого мне нужно знать, что означают эти исключения в каждом конкретном случае (как мне их интерпретировать). Когда они случаются? Я имею в виду не в целом, а в этих 3 частных случаях.

Ответы [ 3 ]

5 голосов
/ 23 марта 2010

В частности, вы не знаете, потому что IO Exception также является «общим» исключением, которое может иметь много технических причин.Это означает, что произошла непредвиденная проблема с вводом / выводом, но, очевидно, она имеет другие причины на локальном жестком диске, чем в Интернете.

В общем, все три элемента решаются вокруг сокетов.Так что причины связаны с проблемами сети.Возможны следующие варианты:

  • Нет сети вообще, даже localhost (это будет серьезной технической проблемой).
  • Порт уже используется, когда дается номер порта (новый сокет сервера)(earPort))
  • Проблемы с сетью - например, кто-то случайно наткнулся на кабель во время некоторых вещей.Может также быть причиной плохого качества, DDOS-атаки и т. Д.
  • Исчерпание порта - нет порта на стороне клиента, доступного для нового соединения.

В основном вокруг этой линии.

То же самое произойдет или может произойти, когда вы на самом деле что-то делаете с потоками.

В этом случае у вас есть две возможные основные причины:

  • Первая строка:сокет уже используется (программа запускается 2 раза, тот же порт, что и другая программа).Очевидно, что это обычно невозможно исправить, если пользователь что-то не делает.
  • Общая ошибка времени выполнения в дальнейшем.Это может произойти во время нормальной работы.
1 голос
/ 23 марта 2010

В общем случае не имеет значения, что именно послужило причиной первоначального исключения IOException, поскольку ваше приложение мало что может сделать, чтобы исправить ситуацию.

Однако, как общий ответ на ваш вопрос «что делать», у вас есть несколько вариантов.

  • Попробуйте еще раз - Может работать, если проблема была неустойчивой. Не забудьте указать условие перерыва, если это не так.
  • Попробуйте что-то еще - Загрузите ресурс из другого места или другим способом.
  • Отказаться - Бросить / сбросить исключение и / или отменить действие или, возможно, всю программу. Вы можете захотеть предоставить дружественное пользователю сообщение на этом этапе ... ;-) Если ваша программа требует ввода для работы, то отсутствие ввода оставляет вам небольшой выбор, но не работает .
1 голос
/ 23 марта 2010

Самый простой способ - объявить вызывающий метод для выброса IOException, но вам необходимо очистить выделенные ресурсы в предложениях finally перед выходом из метода:

public void doSession ( ) throws IOException
{
  final ServerSocket listeningSocket = new ServerSocket(earPort);

  try
  {
    final Socket serverSideSocket = listeningSocket.accept();

    try
    {
      final BufferedReader in =
        new BufferedReader(
          new InputStreamReader(
            serverSideSocket.getInputStream()
          )
        );
    }
    finally
    {
      serverSideSocket.close( )
    }
  }
  finally
  {
    listeningSocket.close( )
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...