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

时间:2017-05-10 04:35:37

标签: java exception exception-handling

我正在尝试创建一个程序,用户输入一个从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;

}

}

3 个答案:

答案 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
相关问题