简体   繁体   中英

Java Exception problem with scanner and method

I've got some problems in java with putting scanner after an output, in a while loop. the scanner scans which method to go and then when it comes back to the start of the loop reset the variable.

I've already tried this and failed to find any understandable solution (I'm really new to java, and it is hard for me), or to solve it myself. here is the full code (i know the code is not so efficient):

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();
    }
}

        

as you can see, I tried myself to solve it and even put a comment on some of the code, but when it runs to the method and comes back, it fails because the scanner thinks there is something to scan before I wrote something. here is the exception-

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. You need a mechanism to loop-back (ie ask the user to enter the data again) in case of an invalid entry. One of the most common ways is to use do-while loop which guarantees to execute its body at least once. Check this tutorial to learn more about it.
  2. Use Scanner::nextLine instead of Scanner::next , Scanner::nextInt etc. because they do not consume the newline character, created by hitting Enter key, from the input. Check this discussion to learn more about it.
  3. Last but not least, never close a Scanner for System.in as it also closes System.in and there is no way to open it again without restarting the JVM. Note: If you are using Scanner to scan a File , make sure to close it in order to release the resource.

Demo:

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);
    }
}

A sample run:

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

Did you remember to import java.util.Scanner? Or how do you compile your source file? I had that same error message when compiled with gradle and i was missing one tiny line in gradle build file.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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