5

私はこれを何時間も見つめていましたが、解決策を考えることができませんでした。私は通常、正規表現を使用してこのタイプの検証を処理しますが、変更のために組み込みのソリューションを使用しようとしています (明らかに、これを頻繁に行うわけではありません)。

private static double promptUserDecimal(){
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter a decimal");
    try{
        double input2 = Double.parseDouble(scan.nextLine());
        return input2;
    } catch(NumberFormatException e){
        System.out.println("Sorry, you provided an invalid option, please try again.");
    }
}

これに関するエラーは、「戻り値」がコンパイラによって見つからないため、コンパイル エラーが発生することです。"return" を try/catch の外に置くと、操作の目的を無効にする "input2" を宣言/初期化する必要があります。どんな援助も大歓迎です...

4

8 に答える 8

3

ユーザーに「もう一度やり直してください」と言ってもらいたい場合は、ループが必要なようです。

private static double promptUserDecimal(){
    final Scanner scan = new Scanner(System.in);

    // Ask for input until we get something valid
    while (true) {  // Terminated by return within
        System.out.println("Enter a decimal");
        try {
            return Double.parseDouble(scan.nextLine());
        } catch(NumberFormatException e){
            System.out.println("Sorry, you provided an invalid option, please try again.");
            // No return, so the loop will run again
        }
    }
}
于 2012-10-07T22:31:59.587 に答える
3

セクションで例外をスローしますcatch。メソッドを呼び出す場所はどこでもpromptUserDecimal、例外をキャッチし、そこにメッセージを出力します。

public static void main(String[] args) {

    double d = 0.0;
    while (double == 0) {
        try {
            d = promptUserDecimal();
        } catch (NumberFormatException e) {
            //log the message...
            d = 0.0;
        }
    }
}

private static double promptUserDecimal() throws NumberFormatException {
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter a decimal");
    return Double.parseDouble(scan.nextLine());
}

promptUserDecimaldouble 値の読み取りの処理のみを気にさせるため、これはより良いアプローチです。設計された特定の目的のために、各クラスとメソッドを分離する傾向があるようにする必要があります。

于 2012-10-07T22:27:41.900 に答える
3

次のようなものが必要です:

double input2;
try{
  //read input2
}catch( ... ){
  //... log AND assign a value to input2 in case of invalid input
}
return input2;
于 2012-10-07T22:27:42.260 に答える
1

メソッドが例外をスローするか、nan を返すようにします。

于 2012-10-07T22:27:40.290 に答える
0

リストされている解決策のいくつかはコンパイラの問題を解決しますが、最初のステップは一歩下がって、「NumberFormatException が発生した場合に何をしたいですか?」と自問することです。

1 つのオプションは、NumberFormatException を再スローするか、RuntimeException でラップして、例外がチェックされないようにすることで、例外を伝播することです。これは、呼び出しコードがそれを処理する必要があることを意味します。そうしないと、ユーザーにスタックトレースが表示されます。このルートに進むと、メソッドに try catch さえ必要ありません。メソッドシグネチャで「throws NumberFormatException」を宣言するだけで、それをアップストリームで処理できます。

もう 1 つのオプションは、catch ブロックの最後のステートメントとして "return null" を使用するか、メソッド内の最後のステートメントとして null を返すことによって、null を返すことです。これはひどいオプションです。呼び出し元のコードやエンド ユーザーは、必要な情報、つまり「入力として数字以外が入力された」という情報を取得できないためです。

オプション 1 を使用し、scan.nextline + " は有効な double として認識されない" ことをユーザーに伝えることで、例外を処理します。

于 2012-10-08T00:01:08.353 に答える
0

から(またはキャッチの後に)何かを返すか投げる必要があります。ユーザーへの出力から判断すると、同じことをもう一度やりたいだけのようです。メソッドをもう一度呼び出して、結果を返すだけです。

private static double promptUserDecimal(){
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter a decimal");
    try{
        double input2 = Double.parseDouble(scan.nextLine());
        return input2;
    } catch(NumberFormatException e){
        System.out.println("Sorry, you provided an invalid option, please try again.");
        return promptUserDecimal();
    }
}
于 2012-10-07T22:48:43.243 に答える
0

catch ブロック内で例外をスローできます。つまり、

private static double promptUserDecimal() throws OopsException {
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter a decimal");
    try{
        double input2 = Double.parseDouble(scan.nextLine());
        return input2;
    } catch(NumberFormatException e){
        System.out.println("Sorry, you provided an invalid option, please try again.");
        throw new OopsException();
    }
}

次に、無効な入力が行われるたびに、メソッドを呼び出す場所でそれをキャッチして処理できます。

于 2012-10-07T22:29:46.110 に答える
0
private static double promptUserDecimal(){
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter a decimal");
    double input2 = 0.0; // <-- explicit initialization
    try{
        double input2 = Double.parseDouble(scan.nextLine());
    } catch(NumberFormatException e){
        System.out.println("Sorry, you provided an invalid option, please try again.");
    }
    return input2;
}
于 2012-10-07T22:30:29.857 に答える