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

扫描器和方法的Java异常问题

史修谨
2023-03-14

我已经尝试过了,但没有找到任何可以理解的解决方案(我对java非常陌生,这对我来说很难),或者自己解决它。以下是完整的代码(我知道代码不是那么高效):

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int con = 1;
        System.out.println("Hey!,welcome to my games!");
        Scanner scanner = new Scanner(System.in);
        String game;
        while (con == 1) {
            System.out.println(
                    "Here Some games i have(Enter the text for the one you want):\nto stop=0\n1)calculator=1\n2)!Soon! Random numbers");
            game = scanner.nextLine();
            calculator();
            scanner.reset();
            System.out.println(game);
//          if(game.equals("0")) {
//              con=0;
//          }
//          else if(game.equals("1")) {

//              System.out.println("Welcome Back!");
//          }
//          else {
//              System.out.println("There is a mistake in your text");
//          }

        }
        scanner.close();
    }

    static void calculator() {
        int num1, num2, con = 1, stop = 1;
        String op, ad = "add", su = "sub", mul = "multi", di = "div";
        Scanner af = new Scanner(System.in);
        while (con == 1) {
            stop = 1;
            System.out.println("Write number 1");
            num1 = af.nextInt();
            System.out.println("Write number 2");
            num2 = af.nextInt();
            System.out.println(
                    "Write an operation (one of these):\nAddition=add\nSubtraction=sub\nMultiplication=multi\nDivision=div");
            op = af.next();
            op = op.toLowerCase();
            int minus = num1 - num2;
            int plus = num1 + num2;
            if (op.equals(ad)) {
                System.out.println("The Operation is:Addition\n" + num1 + "+" + num2 + "=" + plus);
            } else if (op.equals(su)) {
                System.out.println("The Operation is:Subtraction\n" + num1 + "-" + num2 + "=" + minus);
            } else if (op.equals(mul)) {
                System.out.println("The Operation is:Multiplication\n" + num1 + "*" + num2 + "=" + num1 * num2);
            } else if (op.equals(di)) {
                System.out.println("The Operation is:Division\n" + num1 + "/" + num2 + "=" + num1 / num2);
            } else {
                System.out.println("Um,Did you make a mistake in your text?\nDo you want the calculator again?");
                String yn = af.next();
                yn = yn.toLowerCase();
                if (yn.equals("yes") || yn.equals("yep")) {
                    stop = 0;
                }
            }
            if (stop == 1) {
                con = 0;
            }
        }
        af.close();
    }
}

        

正如您所看到的,我试图自己解决它,甚至在一些代码上添加了注释,但当它运行到方法并返回时,它失败了,因为扫描器认为在我写东西之前有东西要扫描。这里有个例外-

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:937)
    at java.base/java.util.Scanner.next(Scanner.java:1478)
    at Main.main(Main.java:12)

共有1个答案

司寇祺
2023-03-14
  1. 您需要一种机制,在输入无效的情况下进行循环(即要求用户再次输入数据)。最常见的方法之一是使用do-while循环,该循环保证至少执行一次其主体。查看本教程以了解有关它的更多信息。
  2. 使用scanner::nextline而不是scanner::nextintscanner::nextint等,因为它们不使用从输入点击Enter键创建的换行符。查看此讨论以了解更多信息。
  3. 最后但并非最不重要的一点是,永远不要关闭system.in扫描程序,因为它也会关闭system.in,而且如果不重新启动JVM就无法再次打开它。注意:如果使用扫描程序扫描文件,请确保关闭该文件以释放资源。

演示:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int option;
        boolean valid;
        Scanner input2 = new Scanner(System.in);
        do {
            valid = true;
            System.out.println("Choose an option:\n" + "1-Addition\n" + "2-Subtraction\n" + "3-Exit");
            try {
                option = Integer.parseInt(input2.nextLine());
                if (option < 1 || option > 3) {
                    throw new IllegalArgumentException();
                }
                // ...Place here the rest of code (which is based on the value of option)
            } catch (IllegalArgumentException e) {
                System.out.println("This is an invalid entry. Please try again.");
                valid = false;
            }
        } while (!valid);
    }
}

示例运行:

Choose an option:
1-Addition
2-Subtraction
3-Exit
x
This is an invalid entry. Please try again.
Choose an option:
1-Addition
2-Subtraction
3-Exit
10.5
This is an invalid entry. Please try again.
Choose an option:
1-Addition
2-Subtraction
3-Exit
1

 类似资料:
  • 我正在编写一个程序,它接受来自文件的输入,并打印城市及其降雨量的列表。我在确定阵列长度和城市降雨量数据的扫描仪上遇到了麻烦。 我一直得到这个例外 在java.util.scanner.throwfor(scanner.java:909)在java.util.scanner.next(scanner.java:1530)在java.util.scanner.nextInt(scanner.java:

  • 问题内容: 我真的试图通过线程找到答案,但仍然希望能得到一些反馈。 我认为下面的代码风格不好,但是我不知道为什么在输入数字后会把我射杀 ,因为我为两个方法创建了两个Scanner对象,并且我应该能够开始一个新的输入。而且,如果我删除了inputAndPrintNumber()中的内容,它将正常工作并正确编译。我真的希望知道如果我仍然使用两个Scanner obj并且不删除(如果可能的话)为什么以及

  • 我正试图使用Eclipse和EclEmma在java中覆盖我的代码。 我的测试使用JUnit 4,我有一些测试看起来像这样: EclEmma说测试失败是因为抛出了一个IllegalArgumentExc0019。所以它会丢弃我的代码覆盖率指标,即使它应该抛出一些东西。有没有一个选项可以让它看到JUnit期望的异常标签? 编辑:我发现,如果您将抛出添加到测试声明中,它也可以工作!

  • 问题内容: 发生异常时,如何使扫描仪重试? 考虑此应用程序在CLI模式下运行。 例: 如果用户未输入类型输入,则抛出错误。但我想在错误消息出现之后。应该要求用户再次输入 宽度 。 怎么做? 问题答案: 如果我对您的理解正确,则希望该程序在失败后要求用户重新输入正确的输入。在这种情况下,您可以执行以下操作: 注意:您 只能 捕获并重试一次。这些方法会引发其他异常,如果您尝试重试这些异常,则您的应用程

  • 一段时间以来,我一直在做一个作为拼字字典的编程作业。该程序接受用户的输入,并输出一个包含单词列表的文件,这取决于用户从菜单中请求的内容。我遇到的问题与Scanner.nextLine()有关。 我不是很清楚为什么,但由于某种原因,有时我必须按一次enter键,然后我的代码才会接受我的输入并将其存储为变量。本质上,我最终输入了两次输入。我尝试在代码周围插入Scanner.nextLine()以“占用

  • 问题内容: 如何将扫描仪的定界符设置为;或换行? 我试过: 但这不起作用。 问题答案: 通常,在模式中,您需要将翻倍。 所以,尝试 要么 编辑 :如果是问题,则可能要尝试以下操作: 它匹配的一个或多个,和。 注意 :我还没有尝试过这些。