当前位置: 首页 > 知识库问答 >
问题:

在java中从“try”到“catch”获取输入

邓光耀
2023-03-14

下面是练习:

如果输入的是有效的等级号,程序应该打印“确定”。否则,程序应该打印输入的值和“不是有效的等级”。并再次提示等级号。程序应该继续询问等级号,直到用户输入有效的等级号。

示例输出:

输入年级(0-5): 9
9 不是有效成绩

输入成绩 (0-5): 两
个两个不是有效成绩

输入等级 (0-5): 2
OK

我在time循环中使用NumberFormatException的“try and catch”。但是,我不能像示例中的第二个那样打印输出。我的输出如下所示:

进入等级(0-5):9
9不是有效等级

进入等级(0-5):两个
9不是有效等级

进入等级(0-5):2
OK

新的输入'2'未保存。我该如何解决这个问题?

下面是我的代码:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

        System.out.print("Enter grade (0-5): ");
        int grade = Integer.parseInt(input.nextLine());


        if (0 <= grade && grade <= 5) {
            System.out.print("OK");
        } else {
            while (grade < 0 || grade > 5) {
                try {
                    System.out.println(grade + " is not a valid grade.");
                    System.out.print("\n");
                    System.out.print("Enter grade (0-5): ");
                    grade = Integer.parseInt(input.nextLine());
                } catch (NumberFormatException nfe) {   
                    System.out.println( " is not a valid grade.");
                    System.out.print("\n");
                    System.out.print("Enter grade (0-5): ");
                    grade = Integer.parseInt(input.nextLine());
                    }
            }                   
            System.out.print("OK");
        }

}

共有1个答案

鄢承运
2023-03-14

如果< code>grade的值是< code>9,输入是< code >“two”,这一行会发生什么?:

grade = Integer.parseInt(input.nextLine());

该行当然会抛出异常。但更重要的是,这一行不会将字符串值“二”分配给整数变量等级

请将输入存储在字符串中。类似于:

String gradeInput = input.nextLine();
int grade = Integer.parseInt(gradeInput);

如果此操作抛出异常,则输入无效。如果它没有抛出异常,但等级超出了要求范围,则输入无效。但这两种情况都需要单独测试。

此外,请注意,您的第一个输入解析在try/catch之外。所以它可能完全失败。请考虑这样的结构:

Scanner input = new Scanner(System.in);
String gradeInput;
int grade = -1;

while (grade < 0 || grade > 5) {
    try {
        System.out.print("Enter grade (0-5): ");
        gradeInput = input.nextLine();
        grade = Integer.parseInt(gradeInput);
        if (grade < 0 || grade > 5) {
            System.out.println(gradeInput + " is not a valid grade.");
            System.out.print("\n");
        }
    } catch (NumberFormatException nfe) {   
        System.out.println(gradeInput + " is not a valid grade.");
        System.out.print("\n");
    }
}

我想有多种方法可以把它放在一起并重构,以尝试减少这里重复的几行。但关键是你不想重复接受输入并将其解析为整数的行,就像你当前的代码一样。因为如果在 catch 中或完全在 try/catch 之外引发异常,则系统将失败。从字符串中解析整数值的尝试需要在 try 块中。

 类似资料:
  • 我实现了一个try-catch块。 我试图用一种特定的方式实现捕捉块,但是它不太好用。如果输入不是整数,它应该重复并返回到try块。它只工作一次,但更多。 你能给我一些帮助吗?非常感谢。

  • 问题内容: 我最初从大学开始编程,然后学习了vb.net。现在,我决定转向Java并进行一些查询。在vb中,try catch语句的布局如下 但是在Java网站(https://docs.oracle.com/javase/tutorial/essential/exceptions/putItTogether.html)中,我发现在Java中,您使用了两个陷阱,如下所示: 我希望有人能够解释为什么

  • 问题内容: 我正在审查一些新代码。该程序仅具有try和finally块。由于不包含catch块,如果try块遇到异常或任何可抛出的异常,它将如何工作?它是否直接进入了finally块? 问题答案: 如果try块中的任何代码都可以引发已检查的异常,则它必须出现在方法签名的throws子句中。如果引发了未经检查的异常,则该异常会冒泡退出方法。 无论是否引发异常,都始终执行finally块。

  • 问题内容: 大家。我有一个关于java中返回值的菜鸟问题。这是我的代码。 Eclipse报告“此方法必须返回long类型的结果”错误。但是我确实在try块中返回了提示。eclipse建议在try / catch块之后添加一个返回值,这会破坏逻辑。你能告诉我这里有什么问题吗?谢谢。 问题答案: 当一个被抛出的返回值是不确定的。引发异常时,控制权立即传递给异常处理程序。在这种情况下,您记录错误。然后控

  • 在实际开发中,根据 try catch 语句的执行过程,try 语句块和 catch 语句块有可能不被完全执行,而有些处理代码则要求必须执行。例如,程序在 try 块里打开了一些物理资源(如数据库连接、网络连接和磁盘文件等),这些物理资源都必须显式回收。 Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只回收堆内存中对象所占用的内存。 所以为了确保一定能回收 try 块中打开的物理资源,异

  • 我刚刚开始用java编写一个21点游戏。我试图让程序要求用户再次输入,如果他们输入的现金不是一个有效的整数。我看到许多带有catch的try语句示例,但没有一个是有效的。程序给出的错误InputMismatchException无法解析为类型。我遵循的一个线程就是这个,我有完全相同的代码,只是变量名不同。给你。Java输入不匹配异常 这是我的密码: 任何关于为什么我几乎精确的代码不起作用的帮助都将