Когда может быть брошен IOError?
Я никогда не видел случай, когда IOError
бросается. Единственное, что говорят врачи о IOError
Это:
брошен, когда произошла серьезная ошибка ввода-вывода.
нет никаких подклассов или чего-либо еще очевидного.
есть ли когда-нибудь случай, когда IOError
будет брошен в java? Что может стать причиной?
(это не следует путать с IOException
-- IOException
бросается в широкий диапазон случаев, и обычно используется; Я знаю это. Я задаюсь вопросом о менее распространенных IOError
).
7 ответов
Console
, Path#toAbsolutePath
и Path#toUri
объявите это конкретное исключение. Конечно, это факт документации, а не фактическая декларация; так как Error
является исключением во время выполнения, объявление его в подписи не будет иметь смысла.
как это выглядит в коде Console#readLine
и Console#readPassword
поймать IOException
это приводит к его нормальной работе,затем распространить это на Ан IOError
.
по сути, IOError
представляет собой критический сбой базовой файловой системы или доступ к некоторому ресурсу, который связывает Java с файловой системой. Это не бросили часто, но он может быть выброшен, если что-то серьезное произойдет из файловой системы.
есть ли когда-нибудь случай, когда 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
IOError
используется seldomly. Я думаю, что его основной usecase в java.io.Console#readLine()
и readPassword()
, которые по умолчанию не бросают IOExeption (но обертывают его), чтобы сигнализировать о проблемах ввода-вывода.
Я предполагаю, что мотивация для этого заключается в том, что так редко они не хотели объявлять проверенное исключение. Это может произойти, когда у терминалов есть проблемы - и это в настоящее время, когда у вас больше нет последовательных линий, только происходящих в тяжелых системных условиях, таких как нехватка памяти или рукоять.
один официальный источник, котор нужно искать База Данных Ошибок Java где вы можете искать ошибки с участием IOError
с помощью ключевого слова search. Это может показать некоторые реальные случаи, связанные с этой ошибкой.
одно событие, которое непосредственно ссылается на эту ошибку (по крайней мере, это то, что я смог найти), было в JDK-6347312 Что касается Console.readLine()
.
есть также несколько обычаев в JDK. Скорее всего, он используется для сигнала " критический" IOException
- подобное исключение, которое вызывающий объект не должен обрабатывать (как в случае с другими исключениями среды выполнения).
IOError будучи исключением во время выполнения и классифицируется по категории ошибок, это непроверенное исключение. Мне кажется, это происходит, когда вы взаимодействуете с системой, используя JNI/native вызовы JVM для базовых системных вызовов ОС. Это может быть для получения доступа к устройствам ввода-вывода(хранение, клавиатура, дисплей, сеть и т. д.) . Но я едва ли видел, как он используется в документах Java API.Скорее всего, причина в том, что разработчики хотели сохранить зависимость от базовая система минимальна.
вот объяснение от Марка Рейнхольда из Oracle:
новый класс IOError был определен в сочетании с новым Ява.Ио.Класс консоли. Он для пользы в ситуациях где возникает неустранимая ошибка ввода-вывода, и наиболее подходящим ответом является завершить программу, а не пытаться обработать исключение.
класс IOError, наряду со многими другими улучшениями, будет документально в предстоящем обслуживании Mustang обзор в JCP.
http://cafe.elharo.com/blogroll/undocumented-changes-in-java-6-mustang-ioerror/
чтобы добавить к этому, RedHat JBoss WildFly Domain management library явно бросает 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:flemming.harms@gmail.com">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();
}