JAVA:异常处理的问题?程序只捕获一次异常

JAVA:异常处理的问题?程序只捕获一次异常,java,exception,exception-handling,Java,Exception,Exception Handling,我正在尝试创建一个程序,其中用户输入一个从00000到99999的五位数邮政编码,如果用户输入的数字超出该范围或非数值,它将抛出一个异常,并让用户有机会继续尝试,直到他们输入5个数值 我的程序似乎只捕捉到它的第一个实例,然后它只打印出用户输入的第二个内容,即使它不符合要求 我刚刚被难倒了,我不确定如何在代码中使用while循环,尽管我相信这可能是我需要的 我是这方面的初学者,任何帮助都将不胜感激 import java.util.InputMismatchException; import ja

我正在尝试创建一个程序,其中用户输入一个从00000到99999的五位数邮政编码,如果用户输入的数字超出该范围或非数值,它将抛出一个异常,并让用户有机会继续尝试,直到他们输入5个数值

我的程序似乎只捕捉到它的第一个实例,然后它只打印出用户输入的第二个内容,即使它不符合要求

我刚刚被难倒了,我不确定如何在代码中使用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;

}

}
import java.util.InputMismatchException;
导入java.util.Scanner;
公共类xzip_代码{
公共静态void main(字符串[]args)
{
尝试
{
边界(Program());
}
捕获(IllegalArgumentException ex)
{
System.out.println(“输入5位数字”);
程序();
}
捕获(输入不匹配异常)
{
System.out.println(“输入数字”);
程序();
}
}
公共静态无效边界(字符串答案)
{
int length=answer.length();
如果(长度5)
{
抛出新的IllegalArgumentException(“输入5位数字”);
}
字符a=答案字符(0);
char b=答案charAt(1);
char c=答案charAt(2);
chard=答案charAt(3);
chare=答案charAt(4);
int f=a;
int g=b;
int h=c;
int i=d;
int j=e;
如果(f>58 | g>58 | h>58 | i>58 | j>58)
{
抛出新的输入不匹配异常(“输入数字”);
}
}
公共静态字符串程序()
{
扫描仪用户输入=新扫描仪(System.in);
字符串x=userInput.next();
系统输出println(x);
返回x;
}
}
您的方法
Bounds()
执行验证工作

当前,在catch块中,您只需调用
Program()
。相反,您需要调用
Bounds()
并将参数
Program()
传递给它

下面的代码将循环,直到没有异常(try块执行成功)


您还需要检查用户是否只输入了数字
0->48
9->57
的ASCII值。因此,您对
>58的检查毫无意义。它应该在范围内检查

您可以简单地使用
if(Character.isleter(answer.charAt(index))
来检查单个数字(这很繁琐)

相反,只需将字符串转换为整数,并检查它是否成功转换,否则将抛出错误

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

您需要使catch成为递归调用。你写它的方式,它被抓住,再试一次,然后结束

试着这样做

void foo() {
    try {
        bar();
    } catch (Exception e) {
        // try again
        foo();
    }
}
记录您重试的次数也是一个好主意。如果错误次数太多,这很容易导致堆栈溢出错误。我想说这个数字大约是八九千

另一种选择是使用循环

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
    }
}

您需要调用
Bounds(Program())直到您的程序不会抛出错误。
为此,我创建了
while
循环,用于验证
布尔isError
是否为真。 要检查输入的字符是否为数字,可以使用
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;

    }

}

然后,如果用户出现第二个错误,程序将以异常终止。需要重新构造程序以循环,直到输入有效数字。还有其他问题(例如为什么
>58
。@JimGarrison,谢谢你指出。一开始我没有检查代码。我已经更新了代码。
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