0

これは私のコードです:

public static void main(String[] args) throws Exception {
    Scanner s = new Scanner(new File("story.txt"));
    someFunction(s);
}

これstory.txtはプロジェクトのルートにthrows Exceptionありますが、コードがないと実行されません。なんで?

4

5 に答える 5

6

必要ありませんがthrows Exception、そのままにしておいても問題ありません。

必要なのは、使用しthrows FileNotFoundExceptionているScannerコンストラクターがその例外をスローするように宣言されており、例外をキャッチしないためです。

于 2013-11-11T11:00:46.977 に答える
2

コンストラクターは をスローできるFileNotFoundExceptionため、をスローする必要があります。Scannerこれはチェックされた例外であるため、スタックのさらに上に渡すか、何らかの方法で処理する必要があります。

于 2013-11-11T11:02:12.917 に答える
1

メソッドまたはコンストラクターが、 から派生していない例外をスローするか、RuntimeExceptionそうする必要があることを宣言で示すメソッドを呼び出す場合、その例外をキャッチするか、例外がスローされる可能性があることを宣言する必要があります。この言語機能はほとんど良いことですが、現在の形では誤りとして広く認められています。それでも、Java 言語の一部として十分に確立されているため、どこにも行かないわけではありません。

概念的には、メソッドの直接の呼び出し元にとって特別な意味を持つ可能性が高い例外とそうでない例外を区別することをお勧めします。残念ながら、例外が直接の呼び出し元にとって特別な意味を持つという事実は、直接の呼び出し元が例外に関心を持つという意味ではありません。Java がチェック済み例外を実装する方法Fooは、チェック済み例外をスローするように宣言されてBar呼び出さFooれたが、その例外を処理する準備ができていない場合、その例外をスローしていると宣言する必要があります (呼び出し元にとって特別な意味を持つ可能性は低いですが)。 、またはそれ以外の場合、処理の見込みがない例外をキャッチします(おそらく から派生した型として再スローしRuntimeExceptionます)。から派生した型としてのキャッチと再スローRuntimeException意味的には最良のアプローチですが、特にオブジェクトの作成を避けたい場合は、最終的に最も冗長になりRuntimeExceptionます。

tryまた、チェーンされたコンストラクター呼び出しをブロックにラップする方法がないため、例外をスローすると宣言されているコンストラクターを介してチェーンされているコンストラクターは、同じ例外をスローすると宣言する必要があることにも注意してください。物事は何らかの理由でそのように実装されていますが、残念ながら、クラス コンストラクターが基底クラスの構築プロセスの一部としてスローされた例外と、派生クラスの構築でスローされた例外を区別することが難しくなります。

于 2013-11-11T21:30:15.190 に答える
1

教授に尋ねたところ、Java では例外を処理できるとのことでした。
関数がそれらをスローする可能性がある場合は、準備ができている必要があります。
:を使用 して例外を自分で処理するか、または : を使用して「それらを次のレベルに渡す」(後で処理する) ことができます。
try {...
} catch { ...
}


throws Exceptions

助けてくれてありがとう!

于 2013-11-11T14:30:35.367 に答える
0

なぜなら、Scanner s = new Scanner(new File("story.txt"));throws checked FileNotFoundException. throwsコンパイルの例外をcatchチェックする必要があります。

于 2013-11-11T11:06:38.070 に答える