Подтвердить что ты не робот

Когда может быть выброшен IOError?

Я никогда не видел случая, когда бросается IOError. Единственное, о чем говорят docs около IOError это:

Брошено, когда произошла серьезная ошибка ввода-вывода.

Нет никаких подклассов или чего-либо еще очевидного.

Есть ли когда-нибудь случай, когда IOError будет выбрано java? Что может вызвать это?

(Это не следует путать с IOException - IOException, который передается в широком диапазоне случаев и обычно используется; я знаю, что. Мне интересно, чем меньше IOError).

4b9b3361

Ответ 1

Console, Path#toAbsolutePath и Path#toUri объявить это конкретное исключение. Конечно, это факт документации, а не фактическое выражение; поскольку Error является исключением во время выполнения, объявляя, что он будет вставлен в подпись, не имеет смысла.

Из того, что он выглядит в коде, Console#readLine и Console#readPassword поймать IOException, который получается через его нормальную работу, затем распространить его на IOError.

По существу, IOError представляет собой критический отказ базовой файловой системы или доступ к некоторому ресурсу, который связывает Java с файловой системой. Он не часто бросается, но он может быть выброшен, если из файловой системы произойдет что-то серьезное.

Ответ 2

Одним из официальных источников для поиска является База данных ошибок Java, где вы можете искать ошибки с помощью IOError с помощью ключевого слова поиска. Это может показать некоторые реальные случаи, связанные с этой ошибкой.

В одном случае, которое непосредственно ссылается на эту ошибку (по крайней мере, то, что я смог найти), был в JDK-6347312, который имеет дело с Console.readLine().

В JDK также мало использования. Скорее всего, это используется для сигнала "критического" IOException -образного исключения, которое вызывающий не должен обрабатывать (как в случае с другими исключениями времени выполнения).

Ответ 3

Есть ли когда-нибудь случай, когда IOError будет выброшен в java?

import java.io.IOError;

public class Test {

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

}

приведет к

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

Я считаю, что вы ожидаете случая, который, скорее всего, произойдет.

An IOError будет отображаться, например, при попытке чтения с консоли, где входной поток был закрыт.

Вы можете попробовать запустить этот фрагмент

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

Это приведет к

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

IOError редко используется. Я думаю, что его основной usecase находится в java.io.Console#readLine() и readPassword(), которые по умолчанию не бросают IOExeption (но обертывают его), чтобы сигнализировать о проблемах ввода/вывода.

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

Ответ 5

IOError является исключением во время выполнения и классифицируется по категории "Ошибка", это исключение. Для меня это происходит, когда вы взаимодействуете с системой, используя JNI/собственные вызовы JVM для базовых системных вызовов ОС. Это может быть для доступа к устройствам ввода-вывода (Хранение, клавиатура, дисплей, сеть и т.д.). Но я едва видел, что он используется в документах API Java API. Вероятно, причина в том, что разработчики хотели сохранить зависимость от базовой системы до минимальной.

Ответ 6

Вот объяснение от Марка Рейнхольда из Oracle:

Новый класс IOError был определен в сочетании с новым java.io.Console. Его использование в ситуациях, когда возникает некорректная ошибка ввода-вывода, и наиболее подходящий ответ прекратите выполнение программы, а не попытайтесь обработать исключение.

Класс IOError, наряду со многими другими улучшениями, будет задокументированный в предстоящем обзоре технического обслуживания Mustang в JCP.

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

Ответ 7

Чтобы добавить к этому, библиотека управления доменом RedHat JBoss Wildfly явно выбрасывает IOError для своего интерфейса ConsoleWrapper. Единственная реализация, которую я видел, до сих пор имеет интерфейс JavaConsole.

Источник:

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