Вы получили хорошие ответы. Просто поймайте исключение и обработайте его локально. Если вам нужно передать это на другой код, но не может, поскольку метод run()
не позволяет исключить проверку, вы можете обернуть исключение в некотором исключении RuntimeException. Если метод запуска выполняется непосредственно в потоке (так как это возможно Runnable), вам следует позаботиться о повторном броске обернутого исключения.
Что касается результата от readLine()
, он вернет null
, когда читать больше нечего. В случае сокета это происходит, когда другая сторона полностью закрывает сокет (любое внезапное завершение или нечистое закрытие обычно приводит к исключению в вашем коде, поскольку ОС отправляет другое уведомление о закрытии сокета).
У меня есть одно слово предостережения, так как вы обертываете розетку в java.io.BufferedReader
. Вы должны быть очень осторожны при использовании этого в любом виде производственного кода.
Опасность состоит в том, что BufferedReader не справляется с исключениями в середине чтения. Это особенно важно, если вы включили тайм-аут в сокете, чтобы код автоматически получал периодические исключения из операционной системы. Тайм-аут (или другое исключение) может наступить, когда буфер внутри читателя заполняется. Если вы попытаетесь повторно использовать объект после исключения, он будет игнорировать любое предыдущее содержимое в буфере. Пакет (ы), которые были получены ранее, молча потеряны, и нет способа получить эти байты.
Обратите внимание, что существуют и другие виды исключений сокетов, которые не означают, что сокет был утерян. Например, посмотрите на определение java.io.InterruptedIOException
. Это имеет общедоступную переменную, которая сообщает количество успешно переданных байт в последнем запросе ввода/вывода (чтение или запись). Это означает, что операция ввода-вывода может быть выполнена снова для извлечения или отправки оставшихся байтов для пакета.
Если вы хотите, чтобы ваш дизайн был закрыт для чтения и сокета, ваш метод будет работать правильно.
Правильный способ чтения из сокета - напрямую использовать поток сокетов, использовать NIO (ByteBuffers и т. Д.) Или использовать хорошо написанную сетевую библиотеку с хорошими абстракциями над этими классами нижнего уровня (доступно несколько открытых исходных кодов).
@Roman - вы знаете сделку. Положите разные вопросы в разные вопросы! –
Stephen C, я думал, что добавленная часть также была частью «как я должен читать из буферизованного читателя?». Но я вижу вашу точку зрения. Я удалил добавленную часть. – Roman