【问题标题】:Take input as a string in Java and limit the user to not enter integer在Java中将输入作为字符串并限制用户不输入整数
【发布时间】:2018-10-18 05:07:20
【问题描述】:

我想将输入 作为 Java 中的字符串 并使用 try catch 限制用户不输入整数。

import java.util.*;

public class trycatch { 

    public static void main(String args[]) { 

        Scanner sc=new Scanner(System.in);
        String a; 

        System.out.println("\n\nEnter the name"); 

        try { 
            a=sc.nextLine(); 

            System.out.println("You name is "+a); 
        } 

        catch(InputMismatchException b) { 
            System.out.println("There is problem with your input"); 
        } 
    } 
}

【问题讨论】:

  • 从扫描仪中你永远不会得到整数格式的输入。它始终是字符串,如果你愿意,你必须将它转换为整数。即 '123' 可以转换为 123

标签: java


【解决方案1】:

测试是否为int,如果不是则抛出异常

a=sc.nextLine(); 
Integer.valueOf(a); // throws NumberFormatException

// this is number so go to top of loop
continue;
} catch(NumberFormatException b) { 
        System.out.println("There is NO problem with your input");
        // we can use `a` out side the loop 
} 

【讨论】:

  • 这很有用,因为它有帮助,无需为他完成所有工作,留下学习机会。荣誉
  • 问题是“我想在 Java 中将输入作为字符串并限制用户不使用 try catch 输入整数”但是当它不是数字时您的代码会出错。这与OP想要的完全相反。如果我错了,请纠正我。
  • @DhaRmvEErsiNgh 是的,我知道你来自哪里。理想情况下,这应该包含在一个 while 循环中,但我认为这不是 OP 遇到问题的地方。当然,打印错误消息也是可选的,但我相信它会比不打印更有用。
  • @ScaryWombat,实际上你的代码似乎倒置了......如果整数解析成功,它应该抛出异常,这意味着它不是 OP 想要的文本......
  • @TomazFernandes 是的,你是对的,我已经调整了我的代码
【解决方案2】:

看看这个:

Does java have a int.tryparse that doesn't throw an exception for bad data?

使用该技术尝试将用户输入的内容解析为 int。如果转换成功,这意味着他们输入了一个 int,你应该抛出一个异常,因为你说你不希望他们输入一个 int(我理解的意思是你不希望他们只输入一个数字序列)

我没有给你确切的答案/为你编写代码,因为你显然在学习 java,这是一个学术练习。你的大学/学校对教授/评估我的编程能力不感兴趣,他们对你的编程能力感兴趣,所以我为你做你的工作对你没有任何价值:)

如果您在执行我的建议时遇到困难,请编辑您的问题以包含您改进的代码,我们可以再次提供帮助

作为旁注,我建议您将错误消息更好地表述为“出现问题” 对于用户来说,没有什么比被告知存在问题而不是问题是什么或如何解决问题更令人沮丧的了。

【讨论】:

    【解决方案3】:

    你应该检查你的字符串是否有这样的数字:

    a=sc.nextLine();
    if (a.matches(".*\\d+.*")) {
         throw new InputMismatchException();
    }
    

    【讨论】:

    • 如果输入的数字多于 int 可以存储的数字怎么办?如果输入混合字符和数字怎么办(目前的问题似乎并没有禁止==严格来说没有遵循规范)
    • 由于代码是关于名称的,我认为假设 OP 想要阻止用户输入任何数字是非常安全的。因此,如果输入是 John123 或 1John34,它应该抛出异常。好点强硬。
    • 很久以前,在大学里,我因作业得了奖。在所有提交的应用程序中,我提交的应用程序是外观最糟糕、最讨厌的 java ui 使用。它之所以获胜,是因为它一字不差地遵循了规范,并且完全没有任何天赋地展示了它应该做的事情。这是一个宝贵的教训——当有人把规范交给你编码时,编写规范而不是假设你认为规范可能要求它是否是一个更好的规范。请参阅我对其他答案的评论,关于建议像正则表达式这样的高级概念是否是一个明智的想法
    • 我同意,这可能更像是一个理想的目标,但鉴于所展示的编程知识水平,我认为这项任务可能是分阶段进行的 - 1)创建一个应用程序,要求用户提供姓名,检查他们没有输入整数.. 2)修改应用程序以询问年龄,检查它是5到99之间的整数。..那种东西。直接跳到正则表达式,对于一个全班几乎不知道如何分配变量的人,或者“1234”和1234之间的区别......有点跳跃,叫嚣“他没有做这项工作他自己”.. 婴儿步,恕我直言
    • 我完全同意你的看法......不幸的是,我没有在 IT 方面有过这种学术经验,所以我自己很难想到那种情况。在 StackOverflow 中回答此类问题时,我会尝试更多地考虑这些术语。谢谢!
    【解决方案4】:

    使用正则表达式可以最好地解决这个问题,但是由于您的要求是使用 try catch,所以您可以使用以下方法

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = null;
    
        System.out.println("\n\nEnter the name");
    
        try {
            // try to get Integer if it is number print invalid input(because we
            // don't want number)
            sc.nextInt();
            System.out.println("There is problem with your input");
        }
        //getting exception means input was not an integer
        // if input was not an Integer then try to read that as string and print
        // the name
        catch (InputMismatchException b) {
            a = sc.next();
            System.out.println("You name is " + a);
        }
    }
    

    【讨论】:

    • 那么如果 OP 输入一个数字,然后输入另一个数字,会发生什么?
    • @ScaryWombat 您只能使用上述代码在线输入,并且不应该是数字。它不会要求第二次输入,因此 OP 在输入数字后无法输入第二个数字。即使您在这种情况下提供 2 个空格分隔的数字,两个也会失败并打印“您的输入有问题”。请您在投票前运行代码。
    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多