これは私のコードです:
public static void main(String[] args) throws Exception {
Scanner s = new Scanner(new File("story.txt"));
someFunction(s);
}
これstory.txt
はプロジェクトのルートにthrows Exception
ありますが、コードがないと実行されません。なんで?
これは私のコードです:
public static void main(String[] args) throws Exception {
Scanner s = new Scanner(new File("story.txt"));
someFunction(s);
}
これstory.txt
はプロジェクトのルートにthrows Exception
ありますが、コードがないと実行されません。なんで?
必要ありませんがthrows Exception
、そのままにしておいても問題ありません。
必要なのは、使用しthrows FileNotFoundException
ているScanner
コンストラクターがその例外をスローするように宣言されており、例外をキャッチしないためです。
コンストラクターは をスローできるFileNotFoundException
ため、をスローする必要があります。Scanner
これはチェックされた例外であるため、スタックのさらに上に渡すか、何らかの方法で処理する必要があります。
メソッドまたはコンストラクターが、 から派生していない例外をスローするか、RuntimeException
そうする必要があることを宣言で示すメソッドを呼び出す場合、その例外をキャッチするか、例外がスローされる可能性があることを宣言する必要があります。この言語機能はほとんど良いことですが、現在の形では誤りとして広く認められています。それでも、Java 言語の一部として十分に確立されているため、どこにも行かないわけではありません。
概念的には、メソッドの直接の呼び出し元にとって特別な意味を持つ可能性が高い例外とそうでない例外を区別することをお勧めします。残念ながら、例外が直接の呼び出し元にとって特別な意味を持つという事実は、直接の呼び出し元が例外に関心を持つという意味ではありません。Java がチェック済み例外を実装する方法Foo
は、チェック済み例外をスローするように宣言されてBar
呼び出さFoo
れたが、その例外を処理する準備ができていない場合、その例外をスローしていると宣言する必要があります (呼び出し元にとって特別な意味を持つ可能性は低いですが)。 、またはそれ以外の場合、処理の見込みがない例外をキャッチします(おそらく から派生した型として再スローしRuntimeException
ます)。から派生した型としてのキャッチと再スローRuntimeException
意味的には最良のアプローチですが、特にオブジェクトの作成を避けたい場合は、最終的に最も冗長になりRuntimeException
ます。
try
また、チェーンされたコンストラクター呼び出しをブロックにラップする方法がないため、例外をスローすると宣言されているコンストラクターを介してチェーンされているコンストラクターは、同じ例外をスローすると宣言する必要があることにも注意してください。物事は何らかの理由でそのように実装されていますが、残念ながら、クラス コンストラクターが基底クラスの構築プロセスの一部としてスローされた例外と、派生クラスの構築でスローされた例外を区別することが難しくなります。
教授に尋ねたところ、Java では例外を処理できるとのことでした。
関数がそれらをスローする可能性がある場合は、準備ができている必要があります。
:を使用
して例外を自分で処理するか、または :
を使用して「それらを次のレベルに渡す」(後で処理する) ことができます。
try {...
} catch { ...
}
throws Exceptions
助けてくれてありがとう!
なぜなら、Scanner s = new Scanner(new File("story.txt"));
throws checked FileNotFoundException
. throws
コンパイルの例外をcatch
チェックする必要があります。