2017-05-10 10 views
0

私は00000から99999までの5桁の郵便番号を入力するプログラムを作成しようとしていますが、ユーザーがその範囲または数値以外の数値から数字を入力すると、ユーザーに5つの数値を入力するまで試行し続ける機会を与えます。JAVA:例外処理に関する問題?プログラムは例外を一度だけキャッチします

私のプログラムはそれの最初のインスタンスをキャッチしているように見えますが、その後、要件に合わない場合でもユーザーが入力した2番目のものを単に出力します。

私はちょうど困惑していましたが、コードでwhileループを使用する方法がわかりませんが、おそらく私が必要と思われるものは何ですか?

私はこれで初心者であり、どんな助けもありがとう!

import java.util.InputMismatchException; 
import java.util.Scanner; 
public class xzip_code { 

public static void main(String[] args) 
{ 


    try 
    { 
     Bounds(Program()); 
    } 
    catch(IllegalArgumentException ex) 
    { 
     System.out.println("Enter 5 Digits"); 
     Program(); 
    } 
    catch(InputMismatchException ex) 
    { 
     System.out.println("Enter Numbers"); 
     Program(); 
    } 


} 

public static void Bounds(String answer) 
{ 
int length = answer.length(); 

if(length<5 || length>5) 
{ 
throw new IllegalArgumentException("Enter 5 Digits"); 

} 
char a = answer.charAt(0); 
char b = answer.charAt(1); 
char c = answer.charAt(2); 
char d = answer.charAt(3); 
char e = answer.charAt(4); 

int f = a; 
int g = b; 
int h = c; 
int i = d; 
int j = e; 

if(f>58 || g>58 || h>58|| i>58||j>58) 
{ 
    throw new InputMismatchException("Enter Numbers"); 
} 


} 

public static String Program() 
{ 
Scanner userInput = new Scanner(System.in); 
String x = userInput.next(); 
System.out.println(x); 
return x; 

} 

} 

答えて

0

プログラムにエラーが発生しない限り、Bounds(Program());に電話する必要があります。 そのためにboolean isErrorが真であることを確認するwhileループを作成しました。 入力されたcharが数字であることを確認するには、Character.isDigitメソッドを使用できます。

package com.stackoverflow.main; 

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

public class xzip_code { 

    public static void main(String[] args) { 
     System.out.println("Enter 5 Digits"); 

     boolean isError = true; 
     while (isError) { 
      try { 
       Bounds(Program()); 
      } catch (IllegalArgumentException ex) { 
       System.out.println("Enter 5 Digits"); 
       continue; 
      } catch (InputMismatchException ex) { 
       System.out.println("Enter Numbers"); 
       continue; 
      } 
      isError = false; 
     } 
    } 

    public static void Bounds(String answer) { 
     int length = answer.length(); 

     if (length < 5 || length > 5) { 
      throw new IllegalArgumentException("Enter 5 Digits"); 

     } 
     char a = answer.charAt(0); 
     char b = answer.charAt(1); 
     char c = answer.charAt(2); 
     char d = answer.charAt(3); 
     char e = answer.charAt(4); 

     if (!(Character.isDigit(a) && Character.isDigit(b) && Character.isDigit(c) && Character.isDigit(d) 
       && Character.isDigit(e))) { 
      throw new InputMismatchException("Enter Numbers"); 
     } 

    } 

    public static String Program() { 
     Scanner userInput = new Scanner(System.in); 
     String x = userInput.next(); 
     System.out.println(x); 
     return x; 

    } 

} 

プリント:

Enter 5 Digits 
ewewdsddd 
ewewdsddd 
Enter 5 Digits 
dffdffg 
dffdffg 
Enter 5 Digits 
443446665 
443446665 
Enter 5 Digits 
4444q 
4444q 
Enter Numbers 
33333 
33333 
1

あなたのメソッドBounds()は検証作業を行います。

現在、キャッチブロックには、Program()が呼び出されています。代わりに、Bounds()に電話し、パラメータProgram()を渡す必要があります。

以下のコードは、例外がなくなるまでループします(try tryブロックの実行成功)。

boolean flag = true; 
while(flag) { 
    try { 
     Bounds(Program()); 
     flag = false; 
    } catch(IllegalArgumentException ex) { 
     System.out.println("Enter 5 Digits"); 
    } 
    catch(InputMismatchException ex) { 
     System.out.println("Enter Numbers"); 
    } 
} 

また、ユーザーが数字のみを入力したかどうかを確認する必要があります。
0 -> 489 -> 57のASCII値。したがって、> 58のチェックは意味をなさない。範囲内でチェックする必要があります。

if (Character.isLetter(answer.charAt(index)))を使用すると、個々の数字(退屈なもの)を簡単に確認できます。

代わりに、をStringに変換してに変換し、変換に成功したかどうかを確認します。

try { 
    Integer.parseInt(answer); 
} catch (NumberFormatException e) { 
    throw new InputMismatchException("Enter Numbers"); 
} 
+0

そして、ユーザが第2のエラーを犯したならば、プログラムが例外で終了します 正しいコードを参照してください。有効な番号が入力されるまでループするようにプログラムを再構成する必要があります。他にも問題があります(なぜ、> 58でしょうか?)。 –

+0

@ジムガリソン、指摘してくれてありがとう。私は最初にコードを通過しなかった。私はコードを更新しました。 –

0

キャッチを再帰呼び出しにする必要があります。あなたがそれを書いた方法は、それが捕らえられ、再び試みられ、その後終了する。

このようにしてください。

void foo() { 
    try { 
     bar(); 
    } catch (Exception e) { 
     // try again 
     foo(); 
    } 
} 

再試行回数を記録することもお勧めします。これは、間違って何回も間違ってしまうと容易にStackOverflowErrorを引き起こす可能性があります。私はその数が約8,9000であると言いたい。

ループを使用することもできます。

void foo() { 
    boolean success = false; 
    while(!success) { 
     success = tryFoo(); 
    } 
} 

boolean tryFoo() { 
    try { 
     bar(); 
     return true; // true for success 
    } catch (Exception e) { 
     return false; // false for failed 
    } 
}