Получение ошибки Exception в потоке "main" java.util.NoSuchElementException - PullRequest
0 голосов
/ 21 сентября 2019
import java.util.Scanner;
/**
 * @author  SUBHA FAIRUZ
 *
 */
public class calculation {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int i;
        for( i=0; i<=4;i++) {
            System.out.println("1.ADDITION\n2.SUBTRACTION\n3.MULTIPLICATION\n4.DIVISION\n5.EXIT");
            System.out.print("Choose Your Operator:");  
            Scanner input = new Scanner(System.in);
            int option= input.nextInt();

            if(option==5)
                System.exit(0);

            while(option>=6 || option<=0){
                System.out.println("Please select one(1) to five(5).");
                option= input.nextInt();

            }
            add addobj= new add();
            subtract subobj= new subtract();
            multiplication mulobj= new multiplication();
            division divobj= new division();

            if(option!=5)
                System.out.println("Enter two number:");
                int number1= input.nextInt();
                int number2=input.nextInt();

            switch(option) {
            case 1:
                System.out.println("Addition:"+"("+ number1 +") + ("+ number2 +") =  "+ addobj.result(number1,number2));
                break;
            case 2:
                System.out.println("Subtraction:"+"("+ number1 +") - ("+ number2 +") = "+ subobj.result(number1,number2));
                break;
            case 3:
                System.out.println("Multiplication:"+"("+ number1 +") * ("+ number2 +") = "+ mulobj.result(number1,number2));
                break;

            case 4:
                while(number1==0){
                System.out.println("Please enter non-zero value of first number:");
                number1= input.nextInt();
                number2= input.nextInt();

                }
                System.out.println("Division:"+ "("+ number1 +") / ("+ number2 +") = "+ divobj.result(number1,number2));
                break;
            case 5:
                    System.exit(0);
                //break;
            default:
                break;
            }
            System.out.println("\n");
            input.close();
        }
        return ;
    }
}

Мой код работает нормально, но я получаю одно предупреждение, что я не закрыл свой сканер.Но когда я закрываю сканер, он дает мне еще одну ошибку!Исключение в потоке "main" java.util.NoSuchElementException

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Вы получите java.util.NoSuchElementException, когда попытаетесь вызвать nextInt, когда нет такого элемента, который вы ввели.Эту проблему можно избежать, воспользовавшись функцией check с помощью вызова метода экземпляра сканера hasNextInt.Я думаю, что проблема связана с вашей операцией деления, где вы должны проверить, что делитель равен 0 вместо делимого, и принимать только новое значение делителя вместо обоих.

Несколько вещей о вашем коде:

а.Вы создаете временный объект в течение цикла.Вы можете создать их вне цикла.
b.Вам не нужно закрывать сканер, если вы используете конструкцию try with resource, которая доступна с JDK 7.
c.Если вы когда-нибудь захотите закрыть сканер, вы должны закрыть его в блоке finally, где это может произойти, вы получите исключение, и вы можете получить утечку ресурса.
d.Ваше первое условие if для проверки option == 5 должно быть после цикла while while(option>=6 || option<=0){

Подводя итог, это может быть код для решения вашей проблемы:

public static void main(String[] args) {
    add addobj= new add();//Use camel case naming convention for classes
    subtract subobj= new subtract();
    multiplication mulobj= new multiplication();
    division divobj= new division();
    try(Scanner input = new Scanner(System.in)) {
        for(int i=0; i<=4;i++) {
            System.out.println("1.ADDITION\n2.SUBTRACTION\n3.MULTIPLICATION\n4.DIVISION\n5.EXIT");
            System.out.print("Choose Your Operator:");  
            int option= input.nextInt();

            while(option>=6 || option<=0){
                System.out.println("Please select one(1) to five(5).");
                option= input.nextInt();
            }

            if(option==5)
                return;

            System.out.println("Enter two number:");
            int number1= input.nextInt();
            int number2=input.nextInt();

            switch(option) {
            case 1:
                System.out.println("Addition:"+"("+ number1 +") + ("+ number2 +") =  "+ addobj.result(number1,number2));
                break;
            case 2:
                System.out.println("Subtraction:"+"("+ number1 +") - ("+ number2 +") = "+ subobj.result(number1,number2));
                break;
            case 3:
                System.out.println("Multiplication:"+"("+ number1 +") * ("+ number2 +") = "+ mulobj.result(number1,number2));
                break;
            case 4:
                while(number2==0){
                    System.out.println("Please enter non-zero value of second number:");
                    number2= input.nextInt();
                }
                System.out.println("Division:"+ "("+ number1 +") / ("+ number2 +") = "+ divobj.result(number1,number2));
                break;
            }
            System.out.println("\n");
       }
    }
}
0 голосов
/ 21 сентября 2019

java.util.NoSuchElementException - это исключение RuntimeException, которое может вызываться различными классами в Java, такими как Iterator, Enumerator, Scanner или StringTokenizer.

Все эти классы имеют метод для выборки следующего элемента или следующих токенов, если они лежат в основеструктура данных не имеет никакого элемента, который Java выдает «java.util.NoSuchElementException».

Наиболее распространенный пример этой итерации по hashmap без проверки наличия элемента или его отсутствия, и поэтому рекомендуется использовать hashNext() перед вызовом next () для Итератора.


Инициализируйте ваш сканер вне цикла for

Scanner input = new Scanner(System.in);
for( i=0; i<=4;i++) {

}

Закройте свой сканер снаружи цикла.

for( i=0; i<=4;i++) {

}
input.close();

Заранее прочитайте поток данных класса сканера, чтобы обеспечитьлучшая производительность.который может быть выпущен здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...