繁体   English   中英

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

[英]Java Exception problem with scanner and method

我在 java 中遇到了一些问题,在 while 循环中将扫描仪放在输出之后。 扫描器扫描要使用的方法,然后当它回到循环开始时重置变量。

我已经尝试过这个,但没有找到任何可以理解的解决方案(我对 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. 如果输入无效,您需要一种回送机制(即要求用户再次输入数据)。 最常见的方法之一是使用do-while循环,它保证至少执行一次其主体。 查看本教程以了解更多信息。
  2. 使用Scanner::nextLine而不是Scanner::nextScanner::nextInt等,因为它们不使用输入中通过按Enter键创建的换行符。 查看此讨论以了解更多信息。
  3. 最后但并非最不重要的一点是,永远不要关闭System.inScanner ,因为它也会关闭System.in并且无法在不重新启动 JVM 的情况下再次打开它。 注意:如果您使用Scanner扫描File ,请确保关闭它以释放资源。

演示:

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 吗? 或者你如何编译你的源文件? 用 gradle 编译时我有同样的错误消息,我在 gradle 构建文件中遗漏了一小行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM