我正在尝试创建一个程序,用户输入一个从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;
}
}
答案 0 :(得分:1)
您的方法export default class NumButton extends Component {
render() {
return (
<TouchableHighlight style={styles.buttonArea}
onPress={()=>{ this.props.update(this.props.numText) }}
>
<Text style={styles.buttonText}>{this.props.numText}</Text>
</TouchableHighlight>
)
}
可以进行验证。
目前,在您的catch区块中,您只是致电Bounds()
。相反,您需要调用Program()
并将参数Bounds()
传递给它。
以下代码将循环,直到没有异常(成功尝试执行块)。
Program()
您还需要检查用户是否只输入了数字。
ASCII值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 -> 48
。因此,检查9 -> 57
毫无意义。它应该在范围内检查。
您可以简单地使用> 58
来检查个别数字(这很繁琐)。
相反,只需将String转换为Integer 并检查它是否成功转换,否则抛出错误。
if (Character.isLetter(answer.charAt(index)))
答案 1 :(得分:0)
你需要让你的捕获一个递归调用。你写它的方式,它被捕获,再次尝试,然后结束。
尝试这样做。
void foo() {
try {
bar();
} catch (Exception e) {
// try again
foo();
}
}
跟踪您重试的次数也是一个好主意。如果你多次错误,这很容易导致StackOverflowError
。我想说这个数字大约是8或9千。
另一种选择是使用循环。
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
}
}
答案 2 :(得分:0)
您需要致电Bounds(Program());
,直到您的程序不会出错。
为此,我创建了while
循环来验证boolean isError
是否为真。
要检查输入的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