何时可能抛出IOError?

时间:2015-03-23 02:50:54

标签: java ioerror

我从未见过抛出IOError的情况。文档对IOError的唯一说法是:

  

发生严重I / O错误时抛出。

没有任何子类或其他明显的东西。

在java中抛出IOError会不会出现这种情况?可能导致什么呢?

(不要与IOException混淆 - IOException被广泛使用,并且常用;我知道。我对此感到疑惑共同IOError)。

8 个答案:

答案 0 :(得分:13)

ConsolePath#toAbsolutePathPath#toUri声明要抛出此特定异常。当然,这是文件事实,而不是实际的声明;因为Error是一个运行时异常,声明它在签名中被抛出没有任何意义。

从代码中看起来,Console#readLineConsole#readPassword捕获通过正常操作产生的IOException然后将其传播到{{ 1}}。

实质上,IOError表示底层文件系统的严重故障,或访问将Java与文件系统联系起来的某些资源。它不会被经常抛出,但如果在文件系统中发生严重的事情,它有可能被抛出。

答案 1 :(得分:5)

  

在java中是否会抛出IOError?

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

我相信你期待的情况更有可能发生。

例如,当尝试从已关闭输入流的控制台读取时,将抛出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

答案 2 :(得分:3)

很少使用

IOError。我认为它的主要用例是java.io.Console#readLine()readPassword(),默认情况下不会抛出IOExeption(但将其包装)以便发出I / O问题的信号。

我的猜测是,它的动机很少,他们不想宣布一个检查过的异常。当终端出现问题时可能会发生这种情况 - 而现在,您不再需要串行线路,只能在严重的系统条件下发生,例如内存不足或手柄耗尽。

答案 3 :(得分:3)

要查找的一个官方来源是Java Bug Database,您可以使用搜索关键字在其中搜索涉及IOError的错误。这可以显示一些涉及此错误的真实案例。

直接引用此错误的一次(至少是我能够找到的错误)出现在JDK-6347312处理Console.readLine()

JDK中也很少使用。最有可能的是它用于发出一个“关键”IOException的信号 - 就像调用者不应该处理的异常一样(与其他运行时异常的情况一样)。

答案 4 :(得分:3)

IOError 是一个运行时异常,被归类为错误类别,它是一个未经检查的异常。对我来说,这似乎发生在使用JVM对本机OS系统调用进行JNI /本机调用与系统交互时。这可能是为了访问IO设备(存储,键盘,显示器,网络等)。但我几乎没有看到它被用在Java API docs.Most可能是因为实现者希望将对底层系统的依赖性保持在最低限度。

答案 5 :(得分:3)

以下是来自Oracle的Mark Reinhold的解释:

  

新的IOError类是与新的一起定义的   java.io.Console类。它适用于以下情况   发生不可恢复的I / O错误,最合适的响应是   终止程序而不是尝试处理异常。

     

IOError类以及许多其他增强功能将是   记录在JCP即将进行的野马维护审查中。

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

答案 6 :(得分:1)

为了补充一点,RedHat JBoss Wildfly域管理库明确地为IOError接口抛出ConsoleWrapper。我见过的唯一一个实现,到目前为止,接口是JavaConsole class。

来源:

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

答案 7 :(得分:-1)

我不确定为什么有那么多人指出错误是运行时异常。他们不是。只需看一下API。 Error是与Throwable不同的Exception类别。 RuntimeExceptionException的子类型。

简而言之,Error(及其子类型)用于表示严重的问题,合理的应用程序不应该尝试抓住。另一方面,Exception用于表示合理的应用程序 MIGHT 想要捕获的条件。并不是说您必须。之所以声明为MIGHT,是因为RuntimeExceptionException的子类型,并且在开发期间应修复(最可能)导致运行时异常的任何条件,以便在部署应用程序时,不需要处理这些类型的条件。但是,该选项已打开,可以继续对其使用catch子句。

底线:Error不是RuntimeException。说这根本是错误的。