在Try Catch中从扫描程序解析字符串

时间:2018-06-03 23:53:56

标签: java

我已经完成了创建购物清单计划的任务。我在Python中完成了这个,而且相对简单。然而,在Java中我遇到了一些障碍。

这些是我的变量,我知道以这种方式使用静态的问题,并且最好避免这样做。

private static Scanner input = new Scanner(System.in);
private static String list_add = "string"; //"string" is just a place holder
private static ArrayList listFull = new ArrayList();
private static ArrayList listPos = new ArrayList();
private static int userIn = 1; //1 is also being used as place holder

我用于:

private static void userInput() {
    boolean isValid = false;

    while (!isValid) {
        isValid = true;
        try {
            userIn=Integer.parseInt(input.next());
        }
        catch (InputMismatchException e) {
            System.out.println("That's not a valid number!");
            isValid = false;
        }
    }

}

这样做的原因是需要输入的任务越少,任务就越快完成。在我尝试这个之前,这是一个很好的哲学。我之前尝试解决这个问题给出了一个无限循环,想到的第二个解决方案返回了StackOverflowError。当我询问避免无限循环时,我被引导到另一个问题(Endless loop while using "try and catch " block inside a "while loop"),我认为这个问题并不合适,但发现它是(谢谢你标记的那个)。然而,我没有得到这个解决方案,我无法看到我出错的地方。

在尝试不同的输入以查看它们是否是一种杀死它的特定类型之后,这些是我收到的错误:

测试用例“strin”:

Exception in thread "main" java.lang.NumberFormatException: For input string: "strin"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at DebuggingMethods.AllIn(DebuggingMethods.java:17)
    at DebuggingMethods.Menu(DebuggingMethods.java:33)
    at DebuggingMethods.main(DebuggingMethods.java:58)

测试用例“十”:

Exception in thread "main" java.lang.NumberFormatException: For input string: "Ten"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at DebuggingMethods.AllIn(DebuggingMethods.java:17)
    at DebuggingMethods.Menu(DebuggingMethods.java:33)
    at DebuggingMethods.main(DebuggingMethods.java:58)

测试用例int(10):

与预期结果一致。

我以为我错过了一个模块,所以我做了import java.lang.*;并没有改变错误。如果有人有解决方案,请帮助我。我找不到已发布的问题,这解释了我做错了什么。当我把它从Try-Catch中取出时,它正在起作用。

Full Piece

import java.util.InputMismatchException;
import java.util.*;
import java.util.Scanner;
import java.lang.*;

public class TestOne {

    private static Scanner input = new Scanner(System.in);
    private static String list_add = "string";
    private static ArrayList listFull = new ArrayList();
    private static ArrayList listPos = new ArrayList();
    private static int userIn = 1;

    private static void userInput() {
        boolean isValid = false;

        while (!isValid) {
            isValid = true;
            try {
                userIn=Integer.parseInt(input.next());
            }
            catch (InputMismatchException e) {
                System.out.println("That's not a valid number!");
                isValid = false;
            }
        }

    }


    public static void main(String[] args) {
        //titleMain();
        userInput(); // For the sake of demonstration


    }

}

1 个答案:

答案 0 :(得分:0)

你的异常已经混淆了。您正在捕获InputMismatchException,如果输入无效,则input.nextInt()会抛出Integer.parseInt。但实际上您正在使用NumberFormatException来解析输入,如果输入无效,则会抛出NumberFormatException。由于InputMismatchException不是Scanner的子类,因此它不会被捕获,您最终会因堆栈跟踪而死亡。

你根本不需要做任何异常的事情。 Scanner sc; //... System.out.println("Please enter a number"); while (!sc.hasNextInt()){ sc.nextLine(); // throw away the bad input System.out.println("Please enter a valid number"); } int theNum = sc.nextInt(); 可以告诉您下一个输入是否为有效整数,然后您可以主动决定如何处理它。按照以下思路思考:

<div id="rv-binding">
    <!-- {items.Url} is working -->
    <div class="fb-like" rv-data-href="items.Url" data-width="80" data-layout="button_count" data-action="like" data-size="small"
        data-show-faces="true" data-share="true"></div>
</div>