Java Исключительная проблема со сканером и методом - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть некоторые проблемы в java с выводом сканера после вывода, через некоторое время l oop. Сканер сканирует, какой метод go, а затем, когда он возвращается к началу цикла, сбрасывает переменную.

Я уже пробовал это, и не смог найти какое-либо понятное решение (я действительно плохо знаком с 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)

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Используйте Scanner::nextLine вместо Scanner::next, Scanner::nextInt et c. Проверьте Сканер пропускает nextLine () после использования next () или nextFoo ()? , чтобы узнать почему.

Кроме того, попробуйте использовать do...while везде, где вам нужно попросить пользователя ввести данные снова в случае неверной записи.

Ниже приведен пример кода, включающий следующие пункты:

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
0 голосов
/ 02 апреля 2020

Вы не забыли импортировать java .util.Scanner? Или как вы компилируете свой исходный файл? У меня было то же самое сообщение об ошибке при компиляции с Gradle, и мне не хватало одной крошечной строки в файле сборки Gradle.

...