2

Javaコードを修正して、txtファイルに何かを書き込もうとしています。元のコードは次のとおりです。

try {
    out = new PrintStream(system.out, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

FileOutputStream を使用してこれを行い、コードを次のように修正します。

try {
    FileOutputStream os = new FileOutputStream("wiki.txt", true);
    out = new PrintStream(os, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

しかし、それは機能しません。エラーは次のとおりです。

Wikipedia2Txt.java:56: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
    FileOutputStream os = new FileOutputStream("wiki.txt");
                          ^
1 error

私は 2 つの方法を試します。1. ディスク上に wiki.txt ファイルを手動で作成します。2、コードを実行する前に wiki.txt が存在しません。しかし、どちらも機能しません。コンパイル時に停止しました。

それで、何が起こっているのですか?ありがとう。

4

4 に答える 4

6

Java は、ファイルが見つからないことを伝えているのではなく、実行時に見つからない可能性があり、プログラムがそれを処理する準備ができていないことを示しています。

これに対処する 1 つの方法を次に示します。

try {
    FileOutputStream os = new FileOutputStream(file, true);
    out = new PrintStream(os, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (FileNotFoundException fnf) {
    // TODO Auto-generated catch block
    fnf.printStackTrace();
}

別の方法は次のとおりです。

try {
    FileOutputStream os = new FileOutputStream(file, true);
    out = new PrintStream(os, true, "UTF-8");
} catch (IOException e) {
    // TODO Auto-generated catch block
    fnf.printStackTrace();
}

最初の方法は、コードが両方の例外を個別に処理する準備ができていることをコンパイラーに保証します。2 番目の方法は、コードが両方の例外のスーパークラスを処理する準備ができていることをコンパイラに保証します。2 番目の方法は最初の方法よりも多くの例外をカバーするため、2 つの方法は同じではありません。

最後に、ブロックを使用して関数を宣言することにより、コンパイラを黙らせる代替手段がありますthrows(共通のスーパークラスまたは 2 つの個別のクラスのいずれかで行います)。これは、関数がこれらの例外を処理する方法を認識していないこと、および呼び出し元が処理する必要があることをコンパイラに伝える方法です。このアプローチの結果は、関数のすべての呼び出し元が呼び出しの周りに try/catch を配置するか、 を使用して例外を宣言する必要があるということthrowsです。

于 2012-08-15T18:54:59.913 に答える
4

FileOutputStream使用しているコンストラクターのシグネチャはpublic FileOutputStream(File file) throws FileNotFoundException. これは、処理する必要があるチェック例外であることを意味します。したがって、このコードを記述したメソッドがこの例外を処理する (つまり、この例外をcatchブロックの一部として指定する) か、この例外を明示的にスローすることを確認してください。

したがって、次のいずれかが機能します。

catchブロックで指定

try {
    FileOutputStream os = new FileOutputStream(file, true);
    out = new PrintStream(os, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

または、メソッドをthrowこの例外にします-メソッドのシグネチャは次のようになりますreturn_type method_name (params_list) throws FileNotFoundException

于 2012-08-15T18:54:46.167 に答える
2

ファイルが見つからない場合の状況を処理する必要があります。

これを試して:

try {
    File file = (..your code..)
    FileOutputStream os = new FileOutputStream(file, true);
     out = new PrintStream(os, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (FileNotFoundException e) {
   // Handling a situation when file is not found.
   e.printStackTrace();
}

IDE (Eclipse、IDEA、NetBeans など) は、このような状況で追加のヘルプを提供する必要があります。スタブを生成したので、すでに IDE を使用している可能性があります。コードに赤い下線が引かれていませんか?

于 2012-08-15T18:58:24.020 に答える
1

Java の厄介な点の 1 つであるチェック済み例外を踏みにじっているだけです。コードの実行中に発生する可能性のある例外は無数にありますが、事前に宣言する必要があるのはそのうちのいくつかだけです。あなたのコードを処理するための私の好ましい方法は、チェックされたすべての例外を、スタックトレースのどこかで処理できるようにラップすることです。RuntimeException

try {
  FileOutputStream os = new FileOutputStream(file, true);
  out = new PrintStream(os, true, "UTF-8");
} catch (RuntimeException e) { 
  throw e; 
} 
catch (Exception e) { 
  throw new RuntimeException(e); 
}

ほとんどの場合、例外が発生した場所で例外を処理するのは間違っており、例外が飲み込まれ、一般的に信頼性が低く、デバッグが困難なコードにつながります。

適切に設計されたアプリケーションでは、想定される別の状況ではなく、障害を表すすべての例外を、スタック フレームのいわゆる例外バリアに向かって伝播する必要があります。そこでは、すべての障害が一様に処理されます。

于 2012-08-15T18:59:34.523 に答える