【问题标题】:Getting error Exception in thread "main" java.util.NoSuchElementException在线程“main”java.util.NoSuchElementException中获取错误异常
【发布时间】:2020-01-22 01:26:37
【问题描述】:
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 ;
    }
}

My code is working fine but i'm getting one warning that i didn't closed my scanner. But when i'm closing the Scanner,it's giving me another error!! Exception in thread "main" java.util.NoSuchElementException

【问题讨论】:

    标签: java multithreading exception


    【解决方案1】:

    当您没有输入这样的元素时,当您尝试调用nextInt 时,您会得到java.util.NoSuchElementException。您可以通过在扫描仪实例方法hasNextInt 上使用方法调用检查来避免此问题。我认为问题在于您的除法运算,您应该检查除数是否为 0 而不是除数,并且只取除数的新值而不是两者。

    关于您的代码的几件事:

    一个。您正在 for 循环中创建瞬态对象。您可以在循环之外创建它们。
    湾。如果您使用自 JDK 7 起可用的 try with resource 构造,则无需关闭扫描仪。
    C。如果您想关闭扫描仪,您应该在 finally 块中将其关闭,这可能会发生异常,并且您最终可能会泄漏资源。
    d。检查option == 5 的第一个if 条件应该在while 循环while(option&gt;=6 || option&lt;=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");
           }
        }
    }
    

    【讨论】:

    • 什么是“with(Scanner input = new Scanner(System.in))”?
    • 非常感谢您的努力。我是一个新的学习者,并按照您的指示进行操作。
    • 太棒了@subhafairuz,你的代码很完美!通过更多的练习,您将理清这些概念。如果您需要我的帮助,请随时致电寻求帮助。
    【解决方案2】:

    java.util.NoSuchElementException 是一个 RuntimeException,它可以被 Java 中的不同类抛出,例如 Iterator、Enumerator、Scanner 或 StringTokenizer。

    如果底层数据结构没有任何元素,所有这些类都有获取下一个元素或下一个标记的方法 Java 抛出“java.util.NoSuchElementException”。

    在不检查是否有任何元素的情况下迭代 hashmap 的最常见示例,这就是为什么建议在 Iterator 上调用 next() 之前使用 hashNext()。


    在 for 循环之外初始化你的扫描仪

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

    在 for 循环之外关闭您的扫描仪。

    for( i=0; i<=4;i++) {
    
    }
    input.close();
    

    Scanner 类提前读取数据流以提供更好的性能。这可能是这里的问题。

    【讨论】:

    • 如果您遇到同样的问题,请在此处评论您的问题。
    • 我也试过了,但没有解决问题。给我同样的错误
    • 您是否在 for 循环之外定义了您的扫描仪并在 for 循环之外将其关闭。从 for 循环内部删除扫描仪初始化程序和关闭方法。它应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多