IOError
がスローされたケースは見たことがありません。ドキュメントがIOError
について言っている唯一のことはこれです:
重大なI/Oエラーが発生したときにスローされます。
サブクラスやその他の明らかなものはありません。
IOError
がJavaでスローされるケースはありますか?何が原因でしょうか?
(これを IOException
-IOException
と混同しないでください。さまざまなケースでスローされ、一般的に使用されます。私はそれを知っています。あまり一般的ではないIOError
)について疑問に思っています。
Console
、 Path#toAbsolutePath
、および Path#toUri
この特定の例外がスローされることを宣言します。もちろん、これは文書化の事実であり、実際の宣言ではありません。 Error
は実行時の例外であるため、署名でスローされることを宣言しても意味がありません。
コードでどのように見えるかから、Console#readLine
およびConsole#readPassword
通常の操作で得られるIOException
をキャッチし、次にそれをIOError
に伝播します。
基本的に、IOError
は、基盤となるファイルシステムの重大な障害、またはJavaをファイルシステムに結び付けるリソースへのアクセス。スローされません)を表します。多くの場合ですが、ファイルシステム内から何か深刻なことが起こった場合にスローされる可能性があります。
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ドキュメント。おそらくその理由は、実装者が基盤となるシステムへの依存を最小限に抑えたいと考えていたためです。
OracleのMarkReinholdによる説明は次のとおりです。
新しいIOErrorクラスは、新しいJava.io.Consoleクラスと組み合わせて定義されました。これは、回復不能なI/Oエラーが発生し、最も適切な対応が例外の処理を試みるのではなく、プログラムを終了することである状況で使用するためのものです。
IOErrorクラスは、他の多くの機能強化とともに、JCPの今後のMustangメンテナンスレビューで文書化されます。
http://cafe.elharo.com/blogroll/undocumented-changes-in-Java-6-mustang-ioerror/
探すべき公式の情報源の1つは Java Bug Database で、searchキーワードを使用してIOError
に関連するバグを検索できます。これは、このエラーに関連するいくつかの実際のケースを示している可能性があります。
このエラーを直接参照する1つの発生(少なくとも私が見つけたものです)は、Console.readLine()
を処理する JDK-6347312 にありました。
JDKの使用法もほとんどありません。ほとんどの場合、呼び出し元が処理することを想定していない「重大な」IOException
のような例外を通知するために使用されます(他のランタイム例外の場合と同様)。
IOError
はめったに使用されません。その主なユースケースはJava.io.Console#readLine()
とreadPassword()
にあると思います。これらは、デフォルトではI/Oの問題を通知するためにIOExeptionをスローしません(ただし、ラップします)。
私の推測では、これの動機は、チェックされた例外を宣言したくないということはめったにないということです。これは、端末に問題がある場合に発生する可能性があります。これは、メモリやハンドルが不足するなどの厳しいシステム条件でのみ発生するシリアル回線がなくなった今日です。
これに加えて、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();
}