10

以下の例外を try-catch ループで「修正」できますが、理由がわかりません。

  1. 「in.readLine()」の部分が継続的に IOExceptions を引き起こすのはなぜですか?
  2. そのような例外をスローする本当の目的は何ですか?おそらく、副作用を増やすだけではありませんか?

コードと IOExceptions

$ javac ReadLineTest.java 
ReadLineTest.java:9: unreported exception java.io.IOException; must be caught or declared to be thrown
  while((s=in.readLine())!=null){
                      ^
1 error
$ cat ReadLineTest.java 
import java.io.*;
import java.util.*;

public class ReadLineTest {
 public static void main(String[] args) {
  String s;
  BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  // WHY IOException here?
  while((s=in.readLine())!=null){
   System.out.println(s);
  }
 }
}
4

6 に答える 6

11

基本的な考え方は、BufferedReaderが別の種類のReaderに委任するため、その例外を渡すというものです。

その異なる種類のリーダーは、ある種の揮発性の外部リソース、たとえばFileReaderの場合はファイルシステムから読み取ることができます。ファイルシステムの読み取りは、さまざまな理由でいつでも失敗する可能性があります。(リーダーがネットワークストリームから基になるデータを取得している場合、状況はさらに悪化します)。ファイルはあなたの下から削除される可能性があります(関連するファイルシステムとOSによって異なります)。

コードで何が起こるかを予測できないため、チェックされた例外が発生します。つまり、コードに問題がない場合でも、この操作が機能しない可能性があるという事実を考慮する必要があることをAPIが通知しているということです。

于 2010-04-13T13:11:03.703 に答える
3

BufferedReader.readLine()例外をスローする可能性があると宣言されています。https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/BufferedReader.html#readLine()を参照してください。

それをキャッチするか、IOException をスローするようにメイン メソッドを宣言する必要があります。

つまり、次のいずれかを行います。

try {
    while((s=in.readLine()) != null){
        System.out.println(s);
     }
} catch(IOException e) {
    // Code to handle the exception.
}

または

public static void main(String[] args) throws IOException { ...
于 2010-04-13T13:05:28.430 に答える
3
  1. それらを「継続的に点火」するのではなく、呼び出すたびにスローする可能性があります。あなたの場合、何かがスローされた場合、標準入力に何か問題が発生したことを意味します。
  2. 目標は、API を使用するプログラマーが問題に対処できるようにすることです。これは、一般に回復可能な問題であると想定されているためです。ただし、特定のケースでは、プログラム全体にとって致命的になります。
于 2010-04-13T13:05:37.193 に答える
1

IOException はチェック例外です。それをキャッチするか、呼び出し元のメソッドにスローする必要があります。チェック例外は、ファイルの欠落、ディスクの障害、またはプログラム コードで回復できないものなど、外部アクターによって引き起こされます。

ただし、ArrayIndexOutofBoundsException のような Unchecked 例外は、プログラムのロジックの誤りによって発生します。欠陥のあるコードの外で if 条件を使用することで、これを覆すことができます (if currIndex>array.length のようなもの)。チェック例外の場合、そのような規定はありません

于 2010-04-13T13:01:57.560 に答える
1

I/O で例外的な状況が発生した場合 (たとえば、ストリームのソースが利用できなくなった場合) にスローされます。

そのような場合、プログラムは回復できるはずです。ソースを読み直すか、いくつかのデフォルトを使用するか、問題についてユーザーに警告することによって。

catchそれはチェックされた例外であり、それらから回復できるはずなので、強制されます。

もちろん、現在のメソッドthrowsがこの例外を呼び出し元メソッドにメソッド化することを宣言するオプションがありますが、最終的にはそれをキャッチする必要があります (または、コンソールとプログラムの実行に単純に出力されるときに、メイン メソッドにバブルアップさせます)。止まります)

于 2010-04-13T13:03:49.177 に答える