Quand un IOError peut-il être lancé?

je n'ai jamais vu un cas où un IOError est levée. La seule chose que les docs disent à propos de IOError ceci:

lancé lorsqu'une grave erreur d'entrée/sortie s'est produite.

il n'y a pas de sous-classe ou autre chose évidente.

Est-il jamais un cas ).

24
demandé sur Will Richardson 2015-03-23 05:50:53
la source

7 ответов

Console,Path#toAbsolutePath et Path#toUri déclarer cette exception. Bien sûr, c'est un fait de documentation et non une véritable déclaration; depuis Error est une exception d'exécution, la déclarer lancée dans la signature n'aurait aucun sens.

à Partir de ce à quoi il ressemble dans le code, Console#readLine et Console#readPassword catch IOException cela résulte de son fonctionnement normal, propagent cela à un IOError.

Essentiellement, IOError représente une défaillance critique du système de fichiers sous-jacent, ou l'accès à une ressource qui lie Java au système de fichiers. Ce n'est pas jetés souvent, mais il a le potentiel d'être jeté si quelque chose de sérieux se produit à l'intérieur du système de fichiers.

12
répondu Makoto 2015-03-23 06:07:11
la source

y a-t-il un cas où IOError serait jeté dans java?

import java.io.IOError;

public class Test {

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

}

résultat

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

je crois que vous vous attendez à un cas qui est plus susceptible de se produire.

IOError serait lancé par exemple en essayant de lire depuis une console où le flux d'entrée a été fermé.

Vous pouvez essayer d'exécuter cet extrait de code

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();
        }
    }
}

Qui entraînerait

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
4
répondu Jean-François Savard 2015-04-01 17:25:47
la source

IOError est rarement utilisé. Je pense que ses principaux cas d'utilisation se trouve dans java.io.Console#readLine() et readPassword(), qui par défaut ne jettent pas IOExeption (mais l'enveloppent) afin de signaler des problèmes d'e/s.

a mon avis, la motivation pour cela est, qu'il est si rare qu'ils ne voulaient pas déclarer une exception cochée. Cela peut se produire lorsque les terminaux ont des problèmes - et c'est de nos jours que vous n'avez plus de lignes série qui ne se produisent que dans des conditions de système sévères comme une panne de mémoire ou gérer.

3
répondu eckes 2015-03-23 06:15:33
la source

une source officielle à rechercher est le Bug De Java De Base De Données où vous pouvez rechercher des bugs impliquant IOError en utilisant le mot-clé de recherche. Cela peut montrer certains cas réels impliquant cette erreur.

une occurrence qui renvoie directement à cette erreur (du moins c'est ce que j'ai pu trouver) était JDK-6347312 qui traite avec Console.readLine().

il y a aussi peu d'usages dans le JDK. Il est très probablement utilisé pour un signal "critique"" IOException-comme exception que l'appelant n'est pas censé s'occuper (comme c'est le cas avec d'autres exceptions d'exécution).

3
répondu manouti 2015-03-29 22:27:56
la source

IOError étant une exception d'exécution et étant classé dans la catégorie D'erreur, c'est une exception non contrôlée. Pour moi, cela semble se produire lorsque vous interagissez avec le système en utilisant les appels JNI/natifs par le JVM vers les appels système D'OS sous-jacents. Cela peut être pour accéder aux périphériques IO( stockage,clavier,Affichage,réseau, etc.).) . Mais je l'ai à peine vu être utilisé dans les docs de L'API Java.Très probablement la raison étant que la mise en œuvre voulais garder la dépendance sur l' système sous-jacent à la minimale.

3
répondu Rohitdev 2015-03-31 14:13:39
la source

Voici une explication de Mark Reinhold d'Oracle:

la nouvelle classe IOError a été définie en combinaison avec la nouvelle java.io.Classe Console. Il est destiné à être utilisé dans les situations où un une erreur d'E/S non récupérable se produit et la réponse la plus appropriée est mettre fin au programme plutôt que de tenter de gérer l'exception.

la classe IOError, avec beaucoup d'autres améliorations, sera documenté dans le prochain entretien Mustang examen dans le PLAN.

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

3
répondu RRM 2015-04-01 15:55:34
la source

juste pour ajouter à cela, RedHat JBoss Wildfly domain management library lance explicitement IOError leurs ConsoleWrapper interface. La seule application que j'ai vu, donc loin de l'interface JavaConsole classe.

Source:

/*
 * 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();
}
1
répondu Buhake Sindi 2015-04-01 01:09:55
la source

Autres questions sur