Новости из мира ПК
10 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд

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


  • 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 Exception Handling – EOFException

Making our way through our detailed Java Exception Handling series, today we’ll tackle the EOFException. Most developers will probably recognize that the acronym EOF in this exception name usually stands for “end of file”, which is exactly the case here. When an EOFException is thrown in Java, this indicates that the end of the file or stream has been reached unexpectedly.

In this article we’ll examine the EOFException in more detail, starting with where it sits in the larger Java Exception Hierarchy. We’ll also go over some functional sample code that shows basic file manipulation, and how failing to improperly handle reaching the end of file or memory streams will result in uncaught EOFExceptions . Let’s get to it!

The Technical Rundown

All Java errors implement the java.lang.Throwable interface, or are extended from another inherited class therein. The full exception hierarchy of this error is:

Full Code Sample

Below is the full code sample we’ll be using in this article. It can be copied and pasted if you’d like to play with the code yourself and see how everything works.

Читать еще:  Java util zip

When Should You Use It?

Since the appearance of an EOFException simply indicates that the end of the file or memory stream was reached, the best way to show how to properly use and handle this exception is in code, so let’s jump right into our sample.

We start with a basic Book class that contains a few fields, which we’ll be using to create some real-world objects to output to a local file.

In our Main program class we start by defining a basic List private property called DATA , along with the path to our FILE :

Next we have the WriteBooksToFile() method, which does just as the name suggests:

By using a DataOutputStream instance we’re able to loop through the collection of Books found in our DATA property and create a new string via the writeUTF(. ) method. Once complete, we close the stream, and all is taken care of. Executing this method produces the following output to the log:

To confirm the formatted Book strings are being locally saved we can open up the local books.txt file. Here’s the current contents of that file (Note that this file is actually in binary, even though it mostly appears as plain text):

Cool. Now, to retrieve the data that was saved to books.txt we start with the ReadBooksFromFileImproperly() method:

Executing this method produces the following output:

Everything seems to be working propertly at first but, as you can see, once we reach the end of the file an EOFException is thrown, which we’ve caught and output to the log. However, this method isn’t configured very well, since any other unexpected exception (such as an IOException ) might take precedent over the expected EOFException , which we’ll get every time.

Therefore, the recommended way to handle reaching the end of a file in this sort of scenario is to enclose the stream-reading statements in their very own try-catch block, to explicitly handle EOFExceptions . Once the expected EOFException is caught, this can be used as control flow statement to redirect execution flow to the next proper statement in the code. While this sort of practice is usually frowned on in most languages, in this particular case it is the only way to handle EOFExceptions . To illustrate one such example let’s look at the modified ReadBooksFromFile() method:

As you can see, this method contains quite a bit more code than the improper version, but it explicitly surrounds the statements that are reading from the stream with try-catch block to handle EOFExceptions . When an EOFException is caught, the break; statement breaks the infinite while (true) loop and continues executing the rest of the method, like normal. Additionally, we can then perform all our normal exception handling with the outer try-catch block covering the entirety of the method code.

The Airbrake-Java library provides real-time error monitoring and automatic exception reporting for all your Java-based projects. Tight integration with Airbrake’s state of the art web dashboard ensures that Airbrake-Java gives you round-the-clock status updates on your application’s health and error rates. Airbrake-Java easily integrates with all the latest Java frameworks and platforms like Spring , Maven , log4j , Struts , Kotlin , Grails , Groovy , and many more. Plus, Airbrake-Java allows you to easily customize exception parameters and gives you full, configurable filter capabilities so you only gather the errors that matter most.

Check out all the amazing features Airbrake-Java has to offer and see for yourself why so many of the world’s best engineering teams are using Airbrake to revolutionize their exception handling practices!

Java Code Examples for

The following code examples are extracted from open source projects. You can click to vote up the examples that are useful to you.

From project candlepin , under directory /src/test/java/org/candlepin/exceptions/mappers/ .

From project adbcj , under directory /api/src/main/java/org/adbcj/support/ .

From project AlbiteREADER , under directory /src/gnu/zip/ .

From project Amoeba-for-Aladdin , under directory /src/java/com/meidusa/amoeba/mysql/net/packet/ .

From project android-aac-enc , under directory /src/com/coremedia/iso/ .

Читать еще:  Java отправить email

From project android_5 , under directory /src/aarddict/ .

From project android_external_guava , under directory /src/com/google/common/io/ .

From project archive-commons , under directory /archive-commons/src/main/java/org/archive/util/ .

From project ARCInputFormat , under directory /src/org/commoncrawl/util/shared/ .

From project ardverk-commons , under directory /src/main/java/org/ardverk/io/ .

From project avro , under directory /lang/java/avro/src/main/java/org/apache/avro/io/ .

From project b1-pack , under directory /standard/src/main/java/org/b1/pack/standard/reader/ .

From project bson4jackson , under directory /src/main/java/de/undercouch/bson4jackson/io/ .

From project btmidi , under directory /BluetoothMidiPlayer/src/com/noisepages/nettoyeur/midi/file/ .

From project ciel-java , under directory /examples/skyhout/src/java/skywriting/examples/skyhout/common/ .

From project cometd , under directory /cometd-java/cometd-websocket-jetty/src/main/java/org/cometd/websocket/client/ .

From project commons-compress , under directory /src/main/java/org/apache/commons/compress/archivers/dump/ .

From project commons-io , under directory /src/main/java/org/apache/commons/io/ .

From project crammer , under directory /src/main/java/uk/ac/ebi/ena/sra/cram/io/ .

From project curator , under directory /curator-recipes/src/main/java/com/netflix/curator/framework/recipes/leader/ .

From project daap , under directory /src/main/java/org/ardverk/daap/ .

From project dcm4che , under directory /dcm4che-core/src/main/java/org/dcm4che/io/ .

From project derric , under directory /src/org/derric_lang/validator/ .

From project droid-comic-viewer , under directory /src/com/github/junrar/io/ .

From project Eclipse , under directory /com.mobilesorcery.sdk.core/src/com/mobilesorcery/sdk/core/ .

From project erjang , under directory /src/main/java/erjang/ .

From project Flume-Hive , under directory /src/java/com/cloudera/util/ .

From project flume-syslog-source2 , under directory /src/main/java/com/spotify/flume/syslog2/ .

From project flume_1 , under directory /flume-core/src/main/java/com/cloudera/util/ .

From project galaxy , under directory /src/co/paralleluniverse/common/io/ .

From project gmarks-android , under directory /src/main/java/org/thomnichols/android/gmarks/thirdparty/ .

From project android_8 , under directory /src/com/google/gson/stream/ .

From project behemoth , under directory /io/src/main/java/com/digitalpebble/behemoth/io/warc/ .

From project blacktie , under directory /jatmibroker-xatmi/src/main/java/org/jboss/narayana/blacktie/jatmibroker/core/transport/hybrid/stomp/ .

From project CircDesigNA , under directory /src/org/apache/commons/math/ .

From project accent , under directory /src/main/java/net/lshift/accent/ .

From project airlift , under directory /jaxrs/src/main/java/io/airlift/jaxrs/ .

From project akela , under directory /src/main/java/com/mozilla/pig/eval/json/ .

From project beanmill_1 , under directory /src/main/java/com/traxel/lumbermill/event/ .

From project chukwa , under directory /src/test/java/org/apache/hadoop/chukwa/validationframework/util/ .

From project CIShell , under directory /templates/org.cishell.templates/src/org/cishell/templates/staticexecutable/ .

From project connectbot , under directory /src/net/sourceforge/jsocks/ .

From project crash , under directory /shell/telnet/src/main/java/org/crsh/telnet/term/ .

From project crawler4j , under directory /src/main/java/edu/uci/ics/crawler4j/fetcher/ .

From project dawn-isencia , under directory /com.isencia.passerelle.commons.ume/src/main/java/com/isencia/message/extractor/ .

From project des , under directory /daemon/lib/apache-log4j-1.2.16/src/main/java/org/apache/log4j/chainsaw/ .

From project DirectMemory , under directory /DirectMemory-Cache/src/main/java/org/apache/directmemory/cache/ .

From project fast-http , under directory /src/main/java/org/neo4j/smack/serialization/ .

From project flume , under directory /flume-ng-channels/flume-file-channel/src/main/java/org/apache/flume/channel/file/ .

Исключения в Java, Часть II (checked/unchecked)

Это вторая часть статьи (первая часть — try-catch-finally), посвященной такому языковому механизму Java как исключения. Она имеет вводный характер и рассчитана на начинающих разработчиков или тех, кто только приступает к изучению языка.

Также я веду курс «Scala for Java Developers» на платформе для онлайн-образования (аналог Coursera/EdX).

1. «Магия» checked/unchecked

Механизм исключительных ситуация в Java связан с двумя элементами «магии», т.е. поведения, которое никак не отражено в исходном коде:
1. «Магию» java.lang.Throwable — в throw, catch и throws могут стоять исключительно Throwable или его наследники (мы уже разбирали в предыдущей лекции). Это «право» находиться в throw, catch и throws никак не отражено в исходном коде.
2. Все исключительные ситуации делятся на «проверяемые» (checked) и «непроверяемые» (unchecked). Это свойство присуще «корневищу» (Throwable, Error, Exception, RuntimeException) и передается по наследству. Никак не видимо в исходном коде класса исключения.

В дальнейших примера просто учтите, что
— Throwable и Exception и все их наследники (за исключением наследников Error-а и RuntimeException-а) — checked
— Error и RuntimeException и все их наследники — unchecked

checked exception = проверяемое исключение, проверяемое компилятором.
Что именно проверяет компилятор мы разберем на этой лекции.

Напомним иерархию исключений

Расставим значение свойства checked/unchecked

2. Пессимистичный механизм

Я называю связь между проверяемыми исключениями и throws — «пессимистичной», польку мы можем «напугать» о большем, чем может произойти на самом деле, но не наоборот

Мы не можем бросать, но не предупредить

Мы не можем бросать, но предупредить о «меньшем»

Мы можем предупредить точно о том, что бросаем

Мы можем предупредить о большем, чем мы бросаем

Можем даже предупредить о том, чего вообще нет

Даже если предупреждаем о том, чего нет — все обязаны бояться

Хотя они (испугавшиеся) могут перепугать остальных еще больше

В чем цель «пессимистичности»? Все достаточно просто.
Вы в режиме протипирования «набросали», скажем, класс-утилиту для скачивания из интернета

и хотели бы «принудить» пользователей вашего класса УЖЕ ОБРАБАТЫВАТЬ возможное исключение IOException, хотя из реализации-пустышки вы ПОКА НЕ ГЕНЕРИРУЕТЕ такое исключение. Но в будущем — собираетесь.

3. throws с непроверяемым (unckecked) исключением

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

Эта конструкция служит цели «указать» программисту-читателю кода на то, что ваш метод может выбросить некоторое непроверяемое (unchecked) исключение.

Пример (java.lang.NumberFormatException — непроверяемое исключение):

Читать еще:  Java lang string

Integer.parseInt() может бросить unchecked NumberFormatException на неподходящем аргументе (int k = Integer.parseInt(«123abc»)), это отразили
— в сигнатуре метода: throws NumberFormatException
— в документации (javadoc): @ exception
но это ни к чему нас не обязывает.

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

Рассмотрим ситуацию с кодом, который может бросать проверяемые исключения разных типов.
Далее учитывайте, что EOFException и FileNotFoundException — потомки IOException.

Мы можем точно указать, что выбрасываем

А можем «испугать» сильнее (предком обоих исключений)

Можно и вот так: EOFException и FileNotFoundException «обобщаем до» IOException, а InterruptedException «пропускаем нетронутым» (InterruptedException — НЕ потомок IOException)

5. Или catch, или throws

Не надо пугать тем, что вы перехватили

или так (ставим catch по предку и точно перехватываем)

Но если перехватили только потомка, то не выйдет

Не годится, естественно, и перехватывание «брата»

Если вы часть перехватили, то можете этим не пугать

6. Поведение компилятора/JVM

Необходимо понимать, что
проверка на cheched исключения происходит в момент компиляции (compile-time checking)
перехват исключений (catch) происходит в момент выполнения (runtime checking)

Полная аналогия с

Хотя ССЫЛКА ref УКАЗЫВАЕТ на объект типа java.lang.String (у которого имеется метод charAt(int)), но ТИП ССЫЛКИ — java.lang.Object (ссылка типа java.lang.Object на объект типа java.lang.String). Компилятор ориентируется на «левый тип» (тип ссылки, а не тип ссылаемого) и не пропускает такой код.

Хотя В ДАННОЙ СИТУАЦИИ компилятор мог бы разобрать, что t ссылается на Exception, а ref — на String, но этого уже невозможно сделать при раздельно компиляции. Представьте, что мы МОГЛИ БЫ скомпилировать ОТДЕЛЬНО такой класс, упаковать в jar и распространять

А кто-то берет этот класс, добавляет в classpath и вызывает App.f0(new Throwable()) или App.f1(new Integer(42)). В таком случае JVM столкнулась бы с ситуацией, когда от нее требует бросить проверяемое исключение, которое не отследил компилятор (в случае с f0) или вызвать метод, которого нет (в случае с f1)!

Java — язык со статической типизацией (т.е. отслеживание корректности использования типов (наличие используемых полей, наличие вызываемых методов, проверка на checked исключения, . ) проводится компилятором), запрещает такое поведение. В некоторых языках (языки с динамической типизацией — отслеживание корректности использования типов проводится средой исполнения (оно разрешено, например в JavaScript).

Компилятор не пропустит этот код, хотя метод main ГАРАНТИРОВАННО НЕ ВЫБРОСИТ ИСКЛЮЧЕНИЯ

7. Overriding и throws

При переопределении (overriding) список исключений потомка не обязан совпадать с таковым у предка.
Но он должен быть «не сильнее» списка предка:

Однако тут мы попытались «расширить тип» бросаемых исключений

Почему можно сужать тип, но не расширять?
Рассмотрим следующую ситуацию:

Внимательно посмотрите на этот пример — если бы потомок мог расширять тип бросаемого исключения предка, то те места которые «ждут» предка, а получают экземпляр «расширенного» потомка могли бы неконтролируемо выбрасывать проверяемые исключения

8. Передача свойства по наследству

Напомним иерархию исключений с расставленными флагами свойства checked/unchecked

Логика расположения свойства НЕ СВЯЗАНА С НАСЛЕДОВАНИЕМ. Эту логику мы рассмотрим позже (в следующих статьях).
Однако свойство checked/unchecked пользовательских классов исключений строится ИСКЛЮЧИТЕЛЬНО НА ОСНОВЕ НАСЛЕДОВАНИЯ.
Правило крайне простое:
1. Если исключение из списка Throwable, Error, Exception, RuntimeException — то твое свойство надо просто запомнить.
2. Если ты не из списка, то твое свойство равно свойству предка. Нарушить наследование тут нельзя.

Если мы породим потомков A, B, C, D, E, F, G, H, I, J, K, L которые следующим образом наследуются от «корневища» (Throwable, Error, Exception, RuntimeException), то значение их свойства checked/unchecked можно увидеть на схеме


Я занимаюсь онлайн обучением Java (курсы программирования) и публикую часть учебных материалов в рамках переработки курса Java Core. Видеозаписи лекций в аудитории Вы можете увидеть на youtube-канале, возможно видео канала лучше систематизировано в этой статье.
Мой метод обучения состоит в том, что я

  1. показываю различные варианты применения
  2. строю усложняющуюся последовательность примеров по каждому варианту
  3. объясняю логику двигавшую авторами (по мере возможности)
  4. даю большое количество тестов (50-100) всесторонне проверяющее понимание и демонстрирующих различные комбинации
  5. даю лабораторные для самостоятельной работы

Данная статье следует пунктам #1 (различные варианты) и #2(последовательность примеров по каждому варианту).

Рейтинг статьи
Ссылка на основную публикацию