2017-04-13 35 views
0

だから私はエラーなどを捕まえるのが初めてです。とにかく、プログラムは、ユーザーに2つの整数を尋ねて、それらを一緒に追加することになっています。単純ですが、数値のいずれかが整数でない場合、エラーがスローされます。現在、2つの整数を追加するのではなく、2つの整数を入力すると、getAnswer()メソッドが再起動され、再び出力されます。また、複数のエラーを入力すると、単に終了します。Java例外処理

package javaapplication1; 

import java.util.InputMismatchException; 
import java.util.Scanner; 


public class JavaApplication1 { 

    public static void main(String[] args) { 
    Intro(); 
    System.out.println("Your answer: "+getAnswer()); 
    } 
    private static void Intro() { 
    System.out.println("Hello this program adds 2 integers together and catches errors."); 
    getAnswer(); 
    } 
    private static int getAnswer() throws InputMismatchException { 
    Scanner scanner = new Scanner(System.in); 
    try { 
     System.out.println("Please input a number"); 
     int num1 = scanner.nextInt(); 
     System.out.println("Please input a second number"); 
     int num2 = scanner.nextInt(); 
     return num1+ num2; 
    } catch (InputMismatchException exp) { 
     System.out.println("Exception thrown"); 
     return 0; 
    } 
    } 
} 
+0

'getAnswer()'メソッドにデバッグポイントを置いて、それをステップ実行しようとしましたか?また、特定の種類の例外をキャッチした場合、メソッドシグネチャは 'throws​​Exception'と言う必要はなくなりました。 –

+2

"現在、2つの整数を追加するのではなく、getAnswer()メソッドを再起動して再び出力します。" - あなたのプログラムには2つのgetAnswerの呼び出しが含まれています。 – user2357112

+0

エラーで終了しないようにしますか? – Henry

答えて

3

あなたはgetAnswer();完全に2回呼び出しているので、あなただけの問題を解決しますIntro()メソッドからの呼び出しを削除してください。

private static void Intro() { 
     System.out.println("Hello this program adds 2 
      integers together and catches errors."); 
} 

再度入力を再入力を促すにしたい場合は、以下のように、あなたがcatchブロックでgetAnswer()を呼び出すことができます。

private static int getAnswer() { 
     Scanner scanner = new Scanner(System.in); 
     try { 
     System.out.println("Please input a number"); 
     int num1 = scanner.nextInt(); 
     System.out.println("Please input a second number"); 
     int num2 = scanner.nextInt(); 
     return num1+ num2; 
     } catch (InputMismatchException exp) { 
      System.out.println("Exception thrown, please reenter values:"); 
      getAnswer(); 
     } 
     return 0; 
} 

もう一つのポイントは、それよりもむしろありますInputMismatchExceptionをキャッチすると、もう1つのより良い方法は、入力を文字列として読み取って、以下のような数値のみを含むことを検証します。

private static int getAnswer() { 
     Scanner scanner = new Scanner(System.in); 
     System.out.println("Please input a number"); 
     String num1 = scanner.nextLine(); 
     System.out.println("Please input a second number"); 
     String num2 = scanner.nextLine(); 
     if(num1.matches("[0-9]+") && num2.matches("[0-9]+")) { 
      return Integer.parseInt(num1)+ Integer.parseInt(num2); 
     } else { 
      System.out.println(" Your inputs contain Invalid characters"); 
      getAnswer(); 
     } 
     return 0; 
    } 
+1

そして、 'catch'ブロックの下で、彼は実行を継続して再度尋ねたい場合、' return getAnswer(); 'への戻り値を変更する必要があります。 – Henry

+0

ああ、その問題を修正しましたが、プログラムが例外をキャッチすると終了します。 – Cory

+0

は、正しい入力を要求するコントロールの振る舞いとして例外をキャッチすることを本当に使用すべきではありません。両方の値を読み込み、それらが整数であることを確認してから、間違った入力を出力して再試行してください。 –