web-dev-qa-db-ja.com

IOErrorがスローされるのはいつですか?

IOError がスローされたケースは見たことがありません。ドキュメントがIOErrorについて言っている唯一のことはこれです:

重大なI/Oエラーが発生したときにスローされます。

サブクラスやその他の明らかなものはありません。

IOErrorがJavaでスローされるケースはありますか?何が原因でしょうか?

(これを IOException -IOExceptionと混同しないでください。さまざまなケースでスローされ、一般的に使用されます。私はそれを知っています。あまり一般的ではないIOError)について疑問に思っています。

25
Pokechu22

ConsolePath#toAbsolutePath 、および Path#toUri この特定の例外がスローされることを宣言します。もちろん、これは文書化の事実であり、実際の宣言ではありません。 Errorは実行時の例外であるため、署名でスローされることを宣言しても意味がありません。

コードでどのように見えるかから、Console#readLineおよびConsole#readPassword通常の操作で得られるIOExceptionをキャッチし、次にそれをIOErrorに伝播します。

基本的に、IOErrorは、基盤となるファイルシステムの重大な障害、またはJavaをファイルシステムに結び付けるリソースへのアクセス。スローされません)を表します。多くの場合ですが、ファイルシステム内から何か深刻なことが起こった場合にスローされる可能性があります。

13
Makoto

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

IOErrorランタイム例外であり、エラーカテゴリに分類されているため、チェックされていない例外です。私には、これは、JVMによる基盤となるOSシステムコールへのJNI /ネイティブコールを使用してシステムと対話するときに発生するようです。これは、IOデバイス(ストレージ、キーボード、ディスプレイ、ネットワークなど)にアクセスするためかもしれません。しかし、Java = APIドキュメント。おそらくその理由は、実装者が基盤となるシステムへの依存を最小限に抑えたいと考えていたためです。

3
Rohitdev

OracleのMarkReinholdによる説明は次のとおりです。

新しいIOErrorクラスは、新しいJava.io.Consoleクラスと組み合わせて定義されました。これは、回復不能なI/Oエラーが発生し、最も適切な対応が例外の処理を試みるのではなく、プログラムを終了することである状況で使用するためのものです。

IOErrorクラスは、他の多くの機能強化とともに、JCPの今後のMustangメンテナンスレビューで文書化されます。

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

3
RRM

探すべき公式の情報源の1つは Java Bug Database で、searchキーワードを使用してIOErrorに関連するバグを検索できます。これは、このエラーに関連するいくつかの実際のケースを示している可能性があります。

このエラーを直接参照する1つの発生(少なくとも私が見つけたものです)は、Console.readLine()を処理する JDK-6347312 にありました。

JDKの使用法もほとんどありません。ほとんどの場合、呼び出し元が処理することを想定していない「重大な」IOExceptionのような例外を通知するために使用されます(他のランタイム例外の場合と同様)。

3
M Anouti

IOErrorはめったに使用されません。その主なユースケースはJava.io.Console#readLine()readPassword()にあると思います。これらは、デフォルトではI/Oの問題を通知するためにIOExeptionをスローしません(ただし、ラップします)。

私の推測では、これの動機は、チェックされた例外を宣言したくないということはめったにないということです。これは、端末に問題がある場合に発生する可能性があります。これは、メモリやハンドルが不足するなどの厳しいシステム条件でのみ発生するシリアル回線がなくなった今日です。

3
eckes

これに加えて、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'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
Buhake Sindi