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