2015-12-28 2 views
5

をスローする:私は<code>readFile()</code>はしてFileNotFoundExceptionをスローしますが、以下のように、<code>main</code>ない、<code>main</code>方法で<code>readFile()</code>という名前のメソッドを呼び出したときにFileNotFoundException

public static void main(String[] args){ 
    readFile(); 
} 

public static void readFile() throws FileNotFoundException{ 
    Scanner input = new Scanner(new File("file.txt")); 
    ... 
} 

私はプログラムをコンパイルすると、私はreadFile()でエラーが発生しましたmainの方法では、それは私もmainのヘッダーに例外をスローする必要があるようです。 mainreadFile()の両方のヘッダーに例外をスローする必要があるのはなぜですか?

+6

、それをスローしません。 –

+2

この例外を伝播して、何を達成したいですか? –

+1

mainはreadFileを呼び出すため、readFileがFileNotFound例外をスローした場合、メインはそれをキャッチしないと例外を伝えます。だからあなたは、メインで例外をキャッチするか、間接的ではあるものの、例外をスローできると宣言する必要があります。 – Rup

答えて

3

Exceptionsを処理するオプションは、それらを捕まえて直ちに処理したり、関数にスローしたりして、関数の呼び出し元に例外を伝播することです。

mainの場合はcatchになり、例外が処理されます。

public static void main(String[] args){ 
    try { 
    readFile(); 
    } catch (FileNotFoundException e) { 
    // Do something with `e` 
    } 
} 

public static void readFile() throws FileNotFoundException { 
    Scanner input = new Scanner(new File("file.txt")); 
    // ... 
} 

しかし、あなたはまた、このような何かを行うことができます:

public static void main(String[] args){ 
    readFile(); 
} 

public static void readFile() { 
    try { 
    Scanner input = new Scanner(new File("file.txt")); 
    // ... 
    } catch (FileNotFoundException e) { 
    // Do something with `e` or handle it accordingly. 
    } 
} 

私はmainで例外を投げるに対して助言するだろうが、その後、それは本当にあなたが「バックアップ」を持っているかどうかの問題です何かが失敗した場合のために。詳細については、this questionに素晴らしい詳細があります。

1

メインメソッドで例外をスローする必要はありません。これはプログラムのエントリポイントです。つまり、この例外をキャッチして処理するメソッドはありません。ここで例外をキャッチして処理する必要があります。エラーをログに記録するか、ユーザーに明確なメッセージを渡すか、何か他のファイルを読み込みますが、例外はここで間違っています。あなたは約束としてthrowsキーワードの例外

public static void main(String[] args){ 
    readFile(); 
} 

public static void readFile() { 
    try { 
     Scanner input = new Scanner(new File("file.txt")); 
     ... 
    } catch (FileNotFoundException ex) { 
     // Error message 
    } catch (Exception ex) { 
     // Incase a different exception is caught 
    } 
} 
+3

他のJavaクラスが ' – MadProgrammer

+0

@MadProgrammer - これは悪いプログラミングであり、実行すべきではありません(IMHO)。 mainはエントリーポイントであり、内部的に呼び出されるべきではありません –

+1

それほど多くはありません。私たちはそれが悪いと思っているからといって、起こるのを止めず、実際には設計によって行うことができます。あなたは 'main'から例外をスローすることができ、JVMはそれを処理します(キャッチされていない例外と同様ですが、詳細は必要です)。 - 私の個人的な好みは' main'メソッドで扱うことですが、それはいつも可能ではありません – MadProgrammer

1

。あなたは今例外をキャッチするつもりはないと言っていますが、呼び出しステートメントでキャッチしようとしています。

現在、readFileメソッドにあるコードは完全に有効ですが、try-catchに呼び出しステートメントをラップして例外を適切に処理する必要があります。

5

考えるをキャッチする必要が

7

Javaには例外に関するいくつかの論争があります。それには2つのクラスの例外があります。チェックされ、チェックされていません。 RuntimeExceptionまたはErrorから拡張された例外はすべてチェックされず、メソッドシグネチャでキャッチされるか、またはスロー可として明示的に宣言される必要はありません。

FileNotFoundはチェックされた例外であり、メソッドシグネチャでスローされたものとしてキャッチまたは宣言する必要があります。

基本的な考え方は、チェック例外は、チェックされていない例外がプログラミングで最も起こりそうなエラーから来たものであるのに対して、回復できる可能性があるということです。

あなたはここでそれについてのすべてを読むことができます:https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.htmlあなたはそれをキャッチする必要が

関連する問題

 関連する問題