【问题标题】:JAVA how to write an exception if the user entered a number instead of a string?如果用户输入数字而不是字符串,JAVA如何编写异常?
【发布时间】:2021-11-14 21:54:53
【问题描述】:

请解释一下我对 do while 有点困惑。 如果我第一次输入城市名称,一切正常。但是如果我输入一个数字,我会收到相应的消息,当我第二次尝试输入城市名称时,它会给出相同的消息.(关于无效数据)

String town=scanner.nextLine();
boolean tryagain = false;

do {
        if (town.charAt(0) >= '0' && town.charAt(0) <= '9'){
            System.out.println("You probably entered an invalid data format");
            scanner.nextLine();
        tryagain = true;}
        else {
            tryagain = false;
        }           
    }while (tryagain);

我也尝试了 try and catch 选项,但如果用户输入数字而不是字符串,我无法编写异常。它不起作用。请帮忙。

try {
    System.out.println("enter the name of the city");
    town = scanner.nextLine();
    
} catch (InputMismatchException e) {
    
    System.out.println ("You probably entered an invalid data format ");
    scanner.nextLine();
}

【问题讨论】:

    标签: java exception try-catch


    【解决方案1】:

    注意这行代码的区别:

    town = scanner.nextLine();
    

    还有这行代码:

    scanner.nextLine();
    

    它们都接受来自控制台的输入,但只有一个将输入存储在town 变量中。要使用新输入的值更新 town 变量,将该值存储在该变量中:

    town = scanner.nextLine();
    

    【讨论】:

    • 等一下。例如,我输入了一个数字,因此,它被记录在一个变量中(因为它位于 do while 之前)。为什么如果我添加一行 town=scanner.nextLine();在“else”块中,程序将无法正常运行,但如果我添加一行 town=scanner.nextLine();在 "if" 中,它会正常工作(事实证明我正在为我将无效值保存到变量中,但为什么它会工作?)
    • @Vs_De_S:目前还不清楚您在该评论中的具体要求。但是,无论更高级别的程序逻辑或在这种情况下“有效”与“无效”对您意味着什么......如果您想对用户的输入执行任何操作,那么您需要存储该输入某处。否则,代码将继续使用 town 的相同原始值。如果那个值没有改变,那么检查那个值的结果就不会改变。
    • 我在“IF”块中的情况很糟糕。问题是为什么如果我在“IF”块中写下这一行(town =scanner.nextLine();),也就是说,我保存了“bad”变量,那么程序可以正常工作。我认为该变量应该是保存在“ELSE”块中,也就是说,在一个很好的情况下,但由于某种原因这不起作用,它让我感到困惑。
    • @Vs_De_S:因为在您的情况下,if 块正在检查“错误值”。当发现“坏值”时,您想重新提示输入新值。 else 块在值不是“坏”时执行。如果用户没有输入“错误值”,为什么要重新提示输入新值?基本概念仍然存在……当你想从用户那里得到一个新的价值时,从用户那里得到一个新的价值。当您不想想从用户那里获取新值时,不要从用户那里获取新值。
    • @user16320675 是的,谢谢,我刚刚想通了
    【解决方案2】:

    试试这个。在 if 块中将scanner.nextLine() 保存到town 变量中,以便在下一次迭代中检查它是否仅由数字组成或为空:

        Scanner scanner = new Scanner(System.in);
    
        String town=scanner.nextLine();
        boolean tryagain;
    
        do {
            if (town.matches("[0-9]*")){
                System.out.println("You probably entered an invalid data format");
                town = scanner.nextLine();
                tryagain = true;}
            else {
                tryagain = false;
            }
        } while (tryagain);
    

    【讨论】:

      【解决方案3】:

      将其放入 try 块中并尝试将其解析为 Integer

         try{
                   Integer.parseInt(town)
          }catch(NumberFormatException nfe){
                    //this is a string otherwise it would be number
          }
      

      【讨论】:

      • 什么是“Interger.”?我应该从哪里得到这个? catch 块中应该包含什么?
      • 如果用户输入了字符串,那么只会执行 catch 块
      • 整数是一个错字。它应该是整数。
      猜你喜欢
      • 1970-01-01
      • 2022-12-17
      • 2020-08-09
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      相关资源
      最近更新 更多