2015-03-23 16 views
24

Non ho mai visto un caso quando viene lanciato uno IOError. L'unica cosa che i documenti dicono su IOError è questa:Quando è possibile lanciare un IOError?

Generato quando si verifica un grave errore I/O.

Non ci sono sottoclassi o qualsiasi altra cosa ovvia.

C'è mai un caso in cui IOError verrebbe lanciato in java? Cosa potrebbe causarlo?

(Questo non deve essere confuso con IOException-IOException è gettato in una vasta gamma di casi, ed è comunemente utilizzato, so che sto chiedendo circa la meno comune IOError.).

+1

@Harvtronix La domanda è di circa 'IOError', non' IOException'. – csmckelvey

+0

@Harvtronix Sì, ho inizialmente collegato IOException. Ma mi riferisco a IOError. Sembra che la gente stia mescolando i due? Potrei aver bisogno di modificare questo per chiarezza (EDIT: ho fatto un indirizzo di modifica che) – Pokechu22

+0

Whoops! Colpa mia. Scusate! – Harvtronix

risposta

12

Console, Path#toAbsolutePath e Path#toUri dichiarare questa particolare eccezione da lanciare. Certo, questo è un fatto di documentazione e non una dichiarazione vera e propria; dal momento che Error è un'eccezione di runtime, dichiarare che non è stato gettato nella firma non avrebbe significato.

Da quello che sembra nel codice, Console#readLine e Console#readPassword prendere un IOException che si traduce attraverso il suo normale funzionamento, quindi propagare che a un IOError.

In sostanza, IOError rappresenta un errore critico del file system sottostante o accesso ad alcune risorse che collegano Java al file system. Non viene generato spesso, ma ha il potenziale per essere lanciato se succede qualcosa di grave all'interno del file system.

+3

È possibile controllare [l'elenco degli usi nel codice] (http://grepcode.com/search/[email protected][email protected]@[email protected] IOError & start = 0 & type = tipo & k = u). All'interno del JDK posso trovare solo 'Console',' sun.nio.fs.WindowsPath' e 'sun.nio.fs.WindowsLinkSupport'. –

+0

@PhilippWendler: Sono su una macchina Linux, quindi per me non verrebbero gettati. Stavo più o meno a coprire i casi generali sotto quando sarebbe stato sollevato. – Makoto

3

IOError viene utilizzato raramente. Penso che il suo caso principale sia in java.io.Console#readLine() e readPassword(), che per impostazione predefinita non gettare IOExeption (ma avvolgerlo) per segnalare problemi di I/O.

Suppongo che la motivazione sia che raramente non vogliono dichiarare un'eccezione controllata. Può succedere quando i terminali hanno problemi - e questo è oggigiorno dove non si hanno più linee seriali solo in condizioni di sistema severe come l'esaurimento della memoria o delle maniglie.

4

Una fonte ufficiale da cercare è Java Bug Database dove è possibile cercare i bug che coinvolgono IOError utilizzando la parola chiave di ricerca. Questo può mostrare alcuni casi reali che coinvolgono questo errore.

Un'occorrenza che fa riferimento direttamente a questo errore (almeno è quello che sono stato in grado di trovare) era in JDK-6347312 che si occupa di Console.readLine().

Ci sono anche pochi usi nel JDK. Molto probabilmente è utilizzato per segnalare un'eccezione "critica" IOException -like che il chiamante non deve gestire (come nel caso di altre eccezioni di runtime).

+0

Una strana risposta. Cosa accadrebbe se non ci fossero bug relativi a IOError? Questo dimostra che non è mai usato? – EJP

+2

@EJP La mia intenzione è di mostrare esempi reali di situazioni in cui si è verificato un errore IOError, non proprio di bug su di esso. Ho rimosso la parte che conclude a proposito del fatto che viene usata raramente. – manouti

3

IOError essere un'eccezione di runtime ed essere classificato nella categoria Errore è un'eccezione non controllata. A mio avviso, ciò sembra verificarsi quando si interagisce con il sistema utilizzando chiamate JNI/native da JVM alle chiamate di sistema del sistema operativo sottostante. Questo potrebbe essere quello di ottenere l'accesso ai dispositivi IO (archiviazione, tastiera, display, rete, ecc.). Ma ho visto a malapena che venga utilizzato nei documenti dell'API Java.Molto probabilmente la ragione è che gli implementatori volevano mantenere la dipendenza dal sistema sottostante al minimo.

1

Solo per aggiungere a questo, la libreria di gestione del dominio RedHat JBoss Wildfly genera esplicitamente IOError per l'interfaccia ConsoleWrapper. L'unica implementazione che ho visto, finora dell'interfaccia è la classe JavaConsole.

Fonte:

/* 
* JBoss, Home of Professional Open Source. 
* Copyright 2012, Red Hat, Inc., and individual contributors 
* as indicated by the @author tags. See the copyright.txt file in the 
* distribution for a full listing of individual contributors. 
* 
* This is free software; you can redistribute it and/or modify it 
* under the terms of the GNU Lesser General Public License as 
* published by the Free Software Foundation; either version 2.1 of 
* the License, or (at your option) any later version. 
* 
* This software is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
* Lesser General Public License for more details. 
* 
* You should have received a copy of the GNU Lesser General Public 
* License along with this software; if not, write to the Free 
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 
* 02110-1301 USA, or see the FSF site: http://www.fsf.org. 
*/ 

package org.jboss.as.domain.management.security.adduser; 

import java.io.IOError; 
import java.util.IllegalFormatException; 

/** 
* Wrap the console commands 
* 
* @author <a href="mailto:[email protected]">Flemming Harms</a> 
*/ 
public interface ConsoleWrapper<T> { 

    /** 
    * Writes a formatted string to this console's output stream using 
    * the specified format string and arguments. 
    * see <a href="../util/Formatter.html#syntax">Format string syntax</a> 
    * @param fmt 
    * @param args 
    */ 
    T format(String fmt, Object ...args) throws IllegalFormatException; 

    /** 
    * A convenience method to write a formatted string to this console's 
    * output stream using the specified format string and arguments. 
    * 
    * @param format 
    * @param args 
    * @throws IllegalStateException 
    */ 
    void printf(String format, Object ... args) throws IllegalFormatException; 

    /** 
    * Provides a formatted prompt, then reads a single line of text from the 
    * console. 
    * 
    * @param fmt 
    * @param args 
    * @return A string containing the line read from the console, not 
    *   including any line-termination characters, or <tt>null</tt> 
    *   if an end of stream has been reached. 
    * @throws IOError 
    */ 
    String readLine(String fmt, Object ... args) throws IOError; 

    /** 
    * Provides a formatted prompt, then reads a password or passphrase from 
    * the console with echoing disabled. 
    * 
    * @param fmt 
    * @param args 
    * @return A character array containing the password or passphrase read 
    *   from the console. 
    * @throws IOError 
    */ 
    char[] readPassword(String fmt, Object ... args) throws IllegalFormatException, IOError; 

    /** 
    * Return the console object 
    * 
    * @return Return the console object 
    */ 
    T getConsole(); 
} 
4

C'è mai stato un caso in cui IOError sarebbe stato gettato in java?

import java.io.IOError; 

public class Test { 

    public static void main(String[] args) { 
     throw new IOError(new Exception()); 
    } 

} 

si tradurrà in

Exception in thread "main" java.io.IOError: java.lang.Exception 
    at test.Test.main(Test.java:13) 
Caused by: java.lang.Exception 
    ... 1 more 
Java Result: 1 

Credo che ci si aspetta un caso che è più probabile che accada.

Si genera un IOError ad esempio quando si tenta di leggere da una console in cui il flusso di input è stato chiuso.

Si può provare a eseguire questo frammento

import java.io.*; 

public class Test { 

    public static void main(String[] s) { 
     Console con = System.console(); 
     try { 
      InputStreamReader reader = new InputStreamReader(System.in); 
      reader.close(); 
      String st = con.readLine("%s", "Enter a line"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (IOError error) { 
      error.printStackTrace(); 
     } 
    } 
} 

Ciò si tradurrebbe in

java.io.IOError: java.io.IOException: Stream Closed 
    at java.io.Console.readLine(Console.java:254) 
    at Test.main(Test.java:10) 
Caused by: java.io.IOException: Stream Closed 
    at java.io.FileInputStream.readBytes(Native Method) 
    at java.io.FileInputStream.read(FileInputStream.java:246) 
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) 
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) 
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) 
    at java.io.Console$LineReader.read(Console.java:437) 
    at java.io.Console.readline(Console.java:376) 
    at java.io.Console.readLine(Console.java:250) 
    ... 1 more 
2

Ecco una spiegazione di Mark Reinhold da Oracle:

La nuova classe IOError era definito in combinazione con la nuova classe java.io.Console . Può essere utilizzato in situazioni in cui si verifica un errore I/O irrecuperabile e la risposta più appropriata è terminare il programma anziché tentare di gestire l'eccezione.

La classe IOError, insieme a molti altri miglioramenti, sarà documentata nella prossima revisione di manutenzione di Mustang nel JCP.

http://cafe.elharo.com/blogroll/undocumented-changes-in-java-6-mustang-ioerror/

Problemi correlati