socket reached que error eos data available java exception try-catch

que - java io eofexception eos reached no data available



EOFException-cómo manejar? (7)

Alternativamente, puede escribir el número de elementos primero (como encabezado) usando:

out.writeInt(prices.length);

Cuando lees el archivo, primero lees el encabezado (conteo de elementos):

int elementCount = in.readInt(); for (int i = 0; i < elementCount; i++) { // read elements }

Soy un programador java principiante siguiendo los tutoriales de java .

Estoy usando un programa Java simple de la página de flujos de datos de los tutoriales de Java y, en tiempo de ejecución, sigue mostrando la EOFException . Me preguntaba si esto era normal, ya que el lector tiene que llegar al final del archivo con el tiempo.

import java.io.*; public class DataStreams { static final String dataFile = "F://Java//DataStreams//invoicedata.txt"; static final double[] prices = { 19.99, 9.99, 15.99, 3.99, 4.99 }; static final int[] units = { 12, 8, 13, 29, 50 }; static final String[] descs = { "Java T-shirt", "Java Mug", "Duke Juggling Dolls", "Java Pin", "Java Key Chain" }; public static void main(String args[]) { try { DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile))); for (int i = 0; i < prices.length; i ++) { out.writeDouble(prices[i]); out.writeInt(units[i]); out.writeUTF(descs[i]); } out.close(); } catch(IOException e){ e.printStackTrace(); // used to be System.err.println(); } double price; int unit; String desc; double total = 0.0; try { DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile))); while (true) { price = in.readDouble(); unit = in.readInt(); desc = in.readUTF(); System.out.format("You ordered %d" + " units of %s at $%.2f%n", unit, desc, price); total += unit * price; } } catch(IOException e) { e.printStackTrace(); } System.out.format("Your total is %f.%n" , total); } }

Se compila bien, pero la salida es:

You ordered 12 units of Java T-shirt at $19.99 You ordered 8 units of Java Mug at $9.99 You ordered 13 units of Duke Juggling Dolls at $15.99 You ordered 29 units of Java Pin at $3.99 You ordered 50 units of Java Key Chain at $4.99 java.io.EOFException at java.io.DataInputStream.readFully(Unknown Source) at java.io.DataInputStream.readLong(Unknown Source) at java.io.DataInputStream.readDouble(Unknown Source) at DataStreams.main(DataStreams.java:39) Your total is 892.880000.

Desde la página de flujos de datos de los tutoriales de Java , dice:

Tenga en cuenta que DataStreams detecta una condición de fin de archivo al capturar la EOFException , en lugar de probar un valor de retorno no válido. Todas las implementaciones de los métodos DataInput utilizan la excepción EOFException en lugar de los valores de retorno.

Entonces, ¿significa esto que capturar la EOFException es normal, así que solo capturarlo y no manejarlo está bien, lo que significa que se llega al final del archivo?

Si eso significa que debo manejarlo, por favor avíseme sobre cómo hacerlo.

EDITAR

De las sugerencias, lo arreglé utilizando in.available() > 0 para la condición del bucle while.

O, no podría hacer nada para manejar la excepción, porque está bien.


La mejor manera de manejar esto sería terminar su ciclo infinito con una condición adecuada.

Pero ya que pediste el manejo de excepciones:

Trate de utilizar dos capturas. Se espera su EOFException, por lo que no parece haber ningún problema cuando ocurre. Cualquier otra excepción debe ser manejada.

... } catch (EOFException e) { // ... this is fine } catch(IOException e) { // handle exception which is not expected e.printStackTrace(); }


Mientras lee el archivo, no está terminando su bucle. Por lo tanto, lee todos los valores y lanza correctamente la excepción EOFException en la siguiente iteración de la lectura en la línea siguiente:

price = in.readDouble();

Si lees la documentación, dice:

Tiros

EOFException: si esta secuencia de entrada llega al final antes de leer ocho bytes.

IOException: el flujo se ha cerrado y el flujo de entrada contenido no admite la lectura después del cierre, o se produce otro error de E / S.

Coloque una condición de terminación adecuada en su bucle while para resolver el problema, por ejemplo, a continuación:

while(in.available() > 0) <--- if there are still bytes to read


Ponga su código dentro del bloque try catch: ie:

try{ if(in.available()!=0){ // ------ } }catch(EOFException eof){ // }catch(Exception e){ // } }


Puede encontrarse con un código que se lee desde un InputStream y usa el fragmento de while(in.available()>0) para verificar el final de la transmisión, en lugar de buscar una EOFException (final del archivo).

El problema con esta técnica, y el Javadoc hace eco de esto, es que solo le dice la cantidad de bloques que se pueden leer sin bloquear a la siguiente persona que llama. En otras palabras, puede return 0 incluso si hay más bytes para leer. Por lo tanto, el método InputStream available() nunca debe usarse para verificar el final de la transmisión.

Debes usar while (true) y

catch(EOFException e) { //This isn''t problem } catch (Other e) { //This is problem }


Puede usar while(in.available() != 0) lugar de while(true) .


Se captura la IOException que también EOFException IOException EOFException , porque se hereda. Si observan el ejemplo del tutorial , subrayaron que debería detectar la EOFException , y esto es lo que hacen. Para resolver su problema, capture la EOFException antes de IOException :

try { //... } catch(EOFException e) { //eof - no error in this case } catch(IOException e) { //something went wrong e.printStackTrace(); }

Además, no me gusta el control de flujo de datos con excepciones, no es el uso previsto de las excepciones y, por lo tanto, (en mi opinión) un estilo realmente malo.