Java io eofexception как исправить - IT Справочник
Llscompany.ru

IT Справочник
18 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java io eofexception как исправить

java io eofexception как исправить

Этот код бросает java.io.EOFException, и я не уверен, почему это происходит.

Содержимое входного файла:

После -1 нет обратного символа строки.

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

Я попытался изменить «int sum = 0» на «long sum = 0» и получил те же результаты.

Я прокомментировал следующее:

После этого я получил следующее исключение:

Если это помогает, я использую Ubuntu 18.04 LTS.

java version «1.8.0_181» Java (TM) SE Runtime Environment (сборка 1.8.0_181-b13) 64-разрядная серверная виртуальная машина Java HotSpot TM (сборка 25.181-b13, смешанный режим)

Я начинающий Java-программист, следуя java tutorials.

Я использую простую программу Java из учебных пособий Java Потоки данных Страница, и во время выполнения он продолжает показывать EOFException . Мне было интересно, нормально ли это, так как читатель должен в конце концов прийти к концу файла.

Он компилируется отлично, но вывод:

Обратите внимание, что DataStreams обнаруживает условие конца файла, перехватывая EOFException вместо проверки на недопустимое возвращаемое значение. Все реализации методов DataInput используют EOFException вместо возвращаемых значений.

Итак, означает ли это, что catching EOFException является нормальным, поэтому просто поймать его и не обрабатывать, это хорошо, что означает, что конец файла достигнут?

Если это означает, что я должен это обработать, пожалуйста, сообщите мне, как это сделать.

ИЗМЕНИТЬ

Из предложений я исправил его, используя in.available() > 0 для условия цикла while .

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

Я хочу прочитать файл и если там email существует — ничего не делать, а если не существует — записать email в файл.

2 ответа 2

Попробуйте добавить проверку в while

Во-первых, метод readObject не возвращает null в конце файла. Он выбрасывает исключение EOFException , когда достигнут конец файла. Ловите данное исключение и обрабатывайте его необходимым образом.

Во-вторых, вот здесь while ((email = (Email) objectInputStream.readObject()) == null || (email = (Email) objectInputStream.readObject()) != null) Вы выполняете что-то не совсем понятное. Как минимум, вы дважды вызываете метод readObject , читаете сразу два объекта из файла, переопределяете email и, как следствие, после обрабатываете лишь второй объект, теряя первый.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками java файлы или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.11.15.35459

java io eofexception как исправить

Этот код бросает java.io.EOFException, и я не уверен, почему это происходит.

Содержимое входного файла:

После -1 нет обратного символа строки.

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

Я попытался изменить «int sum = 0» на «long sum = 0» и получил те же результаты.

Я прокомментировал следующее:

После этого я получил следующее исключение:

Если это помогает, я использую Ubuntu 18.04 LTS.

java version «1.8.0_181» Java (TM) SE Runtime Environment (сборка 1.8.0_181-b13) 64-разрядная серверная виртуальная машина Java HotSpot TM (сборка 25.181-b13, смешанный режим)

Я начинающий Java-программист, следуя java tutorials.

Я использую простую программу Java из учебных пособий Java Потоки данных Страница, и во время выполнения он продолжает показывать EOFException . Мне было интересно, нормально ли это, так как читатель должен в конце концов прийти к концу файла.

Он компилируется отлично, но вывод:

Обратите внимание, что DataStreams обнаруживает условие конца файла, перехватывая EOFException вместо проверки на недопустимое возвращаемое значение. Все реализации методов DataInput используют EOFException вместо возвращаемых значений.

Итак, означает ли это, что catching EOFException является нормальным, поэтому просто поймать его и не обрабатывать, это хорошо, что означает, что конец файла достигнут?

Если это означает, что я должен это обработать, пожалуйста, сообщите мне, как это сделать.

ИЗМЕНИТЬ

Из предложений я исправил его, используя in.available() > 0 для условия цикла while .

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

Я хочу прочитать файл и если там email существует — ничего не делать, а если не существует — записать email в файл.

2 ответа 2

Попробуйте добавить проверку в while

Во-первых, метод readObject не возвращает null в конце файла. Он выбрасывает исключение EOFException , когда достигнут конец файла. Ловите данное исключение и обрабатывайте его необходимым образом.

Во-вторых, вот здесь while ((email = (Email) objectInputStream.readObject()) == null || (email = (Email) objectInputStream.readObject()) != null) Вы выполняете что-то не совсем понятное. Как минимум, вы дважды вызываете метод readObject , читаете сразу два объекта из файла, переопределяете email и, как следствие, после обрабатываете лишь второй объект, теряя первый.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками java файлы или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Читать еще:  Как убрать в документе область исправлений

дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.11.15.35459

java.io.EOFException – How to solve EOFException

Posted by: Sotirios-Efstathios Maneas in exceptions August 19th, 2014 0 Views

In this tutorial we will discuss about the EOFException in Java. This exception indicates the the end of file (EOF), or the end of stream has been reached unexpectedly. Also, this exception is mainly used by DataInputStreams , in order to signal the end of stream. However, notice that other input operations may return a special value upon the end of a stream, instead of throwing an EOFException .

The EOFException class extends the IOException class, which is the general class of exceptions produced by failed, or interrupted I/O operations. Moreover, it implements the Serializable interface. Also, it is defined as a checked exception and thus, it must be declared in a method, or a constructor’s throws clause.

Finally, the EOFException exists since the 1.0 version of Java.

The Structure of EOFException

Constructors

  • EOFException()

Creates an instance of the EOFException class, setting null as its message.

EOFException(String s)

Creates an instance of the EOFException class, using the specified string as message. The string argument indicates the name of the class that threw the error.

The EOFException in Java

DataInputStreams provide methods that can read primitive Java data types from an underlying input stream in a machine-independent way. An application writes data, by using the methods provided by the OutputStream class, or the DataOutputStream class.

Specifically, primitive types can be read by an application, using one of the following methods:

  • readBoolean() – Reads one input byte and returns true if that byte is nonzero, false if that byte is zero.
  • readByte() – Reads and returns one input byte.
  • readChar() – Reads two input bytes and returns a char value.
  • readDouble() – Reads eight input bytes and returns a double value.
  • readFloat() – Reads four input bytes and returns a float value.
  • readInt() – Reads four input bytes and returns an int value.
  • readLong() – Reads eight input bytes and returns a long value.
  • readShort() – Reads two input bytes and returns a short value.
  • readUnsignedByte() – Reads one input byte and returns it as a zero-extended int value. The integer value resides in the range [0, 255].
  • readUnsignedShort() – Reads two input bytes and returns them as an int value. The integer value resides in the range [0, 65535].

For a list of all available methods, take a closer look on the DataInputStream class.

The following example reads all characters from an input file:

In this example we first, write a string to a file and then, use the readChar() method to read all written characters one-by-one.

A sample execution is shown below:

Once the EOFException is thrown, we only have to break from the reading loop and then, close the stream.

Download the Eclipse Project

This was a tutorial about the EOFException in Java.

Вопросы по Java на собеседовании (3)

1. Понятие «Исключение»

Исключение — это ошибка, возникающая во время выполнения программы. Причины возникновения исключения могут разные, например :

  • некорректно определены (не определены) данные;
  • невозможно прочитать или создать файл;
  • обрыв сетевого соединения или соединения с сервером базы данных.

Исключение в Java является объектом. Поэтому они могут не только создаваться автоматически виртуальной машиной JVM при возникновении исключительной ситуации, но и порождаться самим разработчиком.

2. Операторы исключений

Java имеет пять ключевых операторов для определения блока исключений, перехвата и возбуждения исключений :

  1. try — начала блока кода, в котором может возникнуть исключение, и которое следует перехватить;
  2. catch — начала блока кода, предназначенного для перехвата и обработки исключений (параметром catch является тип ожидаемого исключения);
  3. throw — оператор для генерации исключений;
  4. throws — ключевое слово, используемое в сигнатуре метода, и обозначающее, что метод потенциально может вызвать исключение с определенным типом;
  5. finally — начала дополнительного блока кода, размещаемый после последнего блока catch. Блок finally не является обязательным, но всегда получает управление.

Общая структура «перехвата» исключительной ситуации выглядит следующим образом :

3. Оператор throws

Оператор throws включается в сигнатуру метода с целью обозначения возожности возникновения исключительной ситуации с определенным типом. Использовать данный оператор следует в описании тех методов, которые могут возбуждать исключения, но сами их не обрабатывают. Таким образом, оператором throws метод предупреждает другие методы, вызывающие данный, что у него могут быть вызваны необработанные исключения, чтобы вызывающие методы могли защитить себя от этих исключений.

4. Блоки кода try/catch и try/finally

Каждый оператор try требует наличия либо catch, либо finally, либо сочетания catch и finally. Блок кода finally не является обязательным, и может отсутствовать при использовании try/catch. Оператором finally создаётся блок кода, который должен быть выполнен после завершения блока try/catch.

Читать еще:  Вместо папок ярлыки как исправить

Если необходимо гарантировано выполнить определенный участок кода, то используется finally. Связка try/finally позволяет обеспечить выполнение блока кода независимо от того, какие исключения были возбуждены и перехвачены, даже в тех случаях, когда в методе нет соответствующего возбужденному исключению раздела catch.

Пример использования try/finally представлен здесь.

5. Может ли блок finally не выполняться?

Код блока finally не будет исполнен, если в код программы включен предшествующий блоку finally системный выход. Следующий пример демонстрирует данную ситуацию.

6. Проверяемые и непроверяемые исключения

Все исключения делятся на «проверяемые» (checked) и «непроверяемые» (unchecked). Данное свойство присуще базовому классу исключения Throwable и передается по наследству (Error, Exception, RuntimeException). В исходном коде класса исключения данное свойство недоступно. Ниже представлена иерархия классов исключений.

Исключения Throwable и Exception, а также все их наследники, за исключением Error и RuntimeException, являются «проверяемыми» checked исключениями. Error и RuntimeException, а также все их наследники, относятся к «непроверяемым» unchecked исключениям.

Проверка исключения на checked выполняется компилятором (compile-time checking). Непроверяемые исключения можно перехватить (catch) в момент исполнения программы (runtime checking).

Java – это язык программирования со статической типизацией, т.е. его компилятор отслеживает корректности использования типов : наличие полей и методов, checked исключения, и т.д. Следующий пример демонстрирует наличие двух ошибок программирования, определенные на этапе копиляции.

Сигнатура метода divide (операция деления) включает определение возможного исключения типа Exception, наследуемого от Throwable. Если делитель (i2) равен 0, то создается объект исключения типа Throwable и возбуждается исключение (throw t), которое не пропускает компилятор, т.к. тип возбуждаемого исключения не соответствует типу исключения в сигнатуре метода. Если в сигнатуре метода определить исключение типа Throwable, то ошибки не будет.

В методе main определен объект obj с инициализацией определенным значением. В следующей строке компилятор находит ошибку, связанную с отсутствием метода charAt(int) в объекте типа Object. Если выполнить приведение типа obj к String, то компилятор пропустит код : char c = ((String)ref).charAt(0).

Пример unchecked исключения представлен здесь.

7. Возбуждение исключения

Как было отмечено выше, исключение является объектом, который можно создать программно. Чтобы возбудить (выбросить) исключение используется оператор throw.

8. Определение исключения в сигнатуре метода

В сигнатуре метода можно определить возможное проверяемое (checked) исключение. Следующий пример демонстрирует определение исключения в сигнатуре метода f1() и его перехват в конструкторе класса.

9. Особенность RuntimeException

Исключение RuntimeException расширяет свойства Exception и является базовым классом для ошибок во время выполнения приложения. Данное исключение относится к необрабатываемым исключениям (unchecked). Согласно описанию класса это исключение может возникнуть во время нормальной работы JVM.

Следующий код демонстрирует пример использования непроверяемого исключения NumberFormatException (наследующего свойства RuntimeException). В функции parseInt при преобразовании строкового значения в число в режиме run-time может возникнуть исключение. Можно метод функции Integer.parseInt() «обернуть» в try/catch, а можно передать обработку исключения функции в вызывающий метод, для чего в сигнатуре определяется соответствующее исключение (throws).

10. Возбуждение исключения в методе main

Если в методе main возбудить исключение, то оно будет передано в виртуальную машину Java (JVM).

11. Множественные исключения

В сигнатуре метода можно определить несколько возможных исключений. Для этого используется оператор throws и исключения, разделенные запятыми. Следующий пример демонстрирует метод callMethods с множественными возможными исключениями :

Чтобы перехватить несколько возможных исключений можно искользовать конструкцию try с несколькими catch.

12. Последовательность нескольких блоков catch

При определение нескольких блоков catch следует руководствоваться правилом обработки исключений от «младшего» к старшему. Т.е. нельзя размещать первым блоком catch (Exception e) <. >, поскольку все остальные блоки catch() уже не смогут перехватить исключение. Помните, что Exception является базовым классом, поэтому его стоит размещать последним.

Рассмотрим следующую иерархию наследования исключений :

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

13. Поглащение исключений в блоке try. finally

Если было вызвано два исключения — одно в блоке try, а второе в finally — то, при отсутствии catch, исключение в finally «проглотит» предыдущее исключение. Следует блоки с возможными исключениями всегда обрамлять операторами try/catch, чтобы не потерять важную информацию. Следующий пример демонстрирует «поглащение» исключения в блоке try новым исключением в блоке finally.

В результате в консоль будет выведено следующее сообщение :

Чтобы не «потерять» исключение, необходимо его корректно перехватить и обработать. В примере следует убрать комментарий с блока catch.

14. Исключение SQLException

Исключение SQLException связано с ошибками при работе с базой данных. Данное исключением относится к checked исключениям, и, следовательно, проверяется на этапе компиляции.

Споры вокруг SQLException связаны с тем, что исключение возникает во время исполнения, а обрабатывать его приходится в коде, чтобы не ругался компилятор; может быть следовало бы отнести его к unchecked run-time исключениям? Убедительный довод разработчиков данного исключения связан с тем, что необходимо программисту обработать свои возможные ошибки при работе с базой данных.

Читать еще:  Поиск и устранение неисправностей exchange server

15. Ошибка Error

Ошибка Error относится к подклассу не проверяемых (unchecked) исключений, которая показывает серьезные проблемы, возникающие во время выполнения программы. Большинство из ошибок данного класса сигнализируют о ненормальном ходе выполнения программы, т.е. о возникновении критических проблем.

Согласно спецификации Java, не следует пытаться обрабатывать Error в собственной программе, поскольку они связаны с проблемами уровня JVM. Исключения такого рода возникают, если, например, закончилась память, доступная виртуальной машине.

16. Обобщение исключений

При определении в сигнатуре метода возможных исключений можно вместо нескольких проверяемых исключений указать общее (базовое) java.lang.Throwable. В этом случае, компилятор «пропустит код» и программа возможно отработает без сбоев. Например :

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

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

17. Логирование исключений

Лучше всего логировать (регистрировать) исключение в месте его обработки. Это связано с тем, что именно в данном месте кода достаточно информации для описания возникшей проблемы. Кроме этого, одно и то же исключение при вызове одного и того же метода можно перехватывать в разных местах программы; регистрировать же следует в одном месте.

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

Java io eofexception как исправить

95571 просмотра

7 ответа

10732 Репутация автора

Я начинающий Java-программист, следящий за Java-учебниками .

Я использую простую программу Java из в Java учебники «ы Потоки данных Page , и во время выполнения, он продолжает показ EOFException . Мне было интересно, если это было нормально, так как читатель должен в конце концов дойти до конца файла.

Он компилируется нормально, но вывод:

Обратите внимание, что DataStreams обнаруживает условие конца файла, перехватывая EOFException вместо проверки на недопустимое возвращаемое значение. Все реализации методов DataInput используют EOFException вместо возвращаемых значений.

Итак, означает ли это, что перехват EOFException является нормальным, так что просто перехватывать его и не обрабатывать, это означает, что конец файла достигнут?

Если это означает, что я должен справиться с этим, пожалуйста, посоветуйте мне, как это сделать.

РЕДАКТИРОВАТЬ

Из предложений, я установил его с помощью in.available() > 0 для while условия цикла.

Или я ничего не мог сделать, чтобы обработать исключение, потому что это нормально.

Ответы (7)

20 плюса

28123 Репутация автора

При чтении из файла вы не прерываете цикл. Таким образом, он читает все значения и правильно генерирует EOFException на следующей итерации чтения в строке ниже:

Если вы читаете документацию, там написано:

EOFException — если этот поток ввода достигает конца перед чтением восьми байтов.

IOException — поток был закрыт, и входящий поток не поддерживает чтение после закрытия, или происходит другая ошибка ввода-вывода.

Поместите правильное условие завершения в цикл while для решения проблемы, например, ниже:

2 плюса

794 Репутация автора

Вы можете использовать while(in.available() != 0) вместо while(true) .

4 плюса

5564 Репутация автора

Лучший способ справиться с этим — завершить бесконечный цикл с надлежащим условием.

Но так как вы попросили обработать исключение:

Попробуйте использовать два улова. Ожидается ваше исключение EOFException, поэтому при возникновении проблем не возникает. Любое другое исключение должно быть обработано.

плюса

1344 Репутация автора

Вы ловите, IOException что также ловит EOFException , потому что это наследуется. Если вы посмотрите на пример из учебника, они подчеркнули, что вы должны поймать EOFException — и это то, что они делают. Чтобы решить вашу проблему поймать EOFException раньше IOException :

Кроме того, мне не нравится управление потоком данных с использованием исключений — это не предполагаемое использование исключений и, следовательно, (на мой взгляд) действительно плохой стиль.

Автор: Jost Размещён: 26.08.2013 07:22

2 плюса

3569 Репутация автора

В качестве альтернативы, вы можете сначала записать количество элементов (в качестве заголовка), используя:

Когда вы читаете файл, вы сначала читаете заголовок (количество элементов):

Автор: Katona Размещён: 26.08.2013 07:24

плюса

26 Репутация автора

Поместите ваш код в блок try catch: т.е.

плюса

1 Репутация автора

Вы можете встретить код, который читает из InputStream и использует фрагмент while(in.available()>0) для проверки конца потока, а не для проверки на исключение EOFException.

Проблема с этой техникой, Javadoc которая повторяет это, заключается в том, что она сообщает только количество блоков, которые можно прочитать, не блокируя следующего вызывающего. Другими словами, это возможно, return 0 даже если есть еще байты для чтения. Поэтому InputStream available() метод никогда не должен использоваться для проверки конца потока. Вы должны использовать while (true) и

ловить (EOFException e) <
// Это не проблема

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector