【问题标题】:NoSuchElementException when using Scanner使用 Scanner 时出现 NoSuchElementException
【发布时间】:2015-09-13 08:20:45
【问题描述】:

此代码是 prifix 的计算器。 第一个输入表示要计算的行数, 然后输入表达式。

例如) 2\n 12+3*\n 31/2-4*2+\n

它在 Eclipse 中运行良好,但在评分站点中不起作用。 评分网站说

异常:java.util.NoSuchElementException 也许在:在 Calculation.main(Calculation.java:16)

第 16 行是 'String string=scan2.nextLine();'

但我不知道哪里错了。

    import java.util.*;
    public class Calculation{

        public static void main(String[] args){

            System.out.print("Enter a number: ");
            Scanner scan1=new Scanner(System.in);
            int n=scan1.nextInt();

            ArrayList<String> input=new ArrayList<String>();

            for(int i=0;i<n;i++){

                System.out.print("Enter a expression in postfix: ");
                Scanner scan2=new Scanner(System.in);
                String string=scan2.nextLine();
                input.add(i,string);

            }

            Stack<Integer> stack=new Stack<Integer>();

            for(int i=0;i<=input.size()-1;i++){
                for(int j=0;j<=input.get(i).length()-1;j++){
                    if(input.get(i).charAt(j)>=48&&input.get(i).charAt(j)<=57)
                        stack.push(Integer.parseInt(input.get(i).valueOf(input.get(i).charAt(j))));
                    else{
                        int n2=stack.pop();
                        int n1=stack.pop();

                        if(input.get(i).charAt(j)=='+')
                            stack.push(n1+n2);
                        if(input.get(i).charAt(j)=='-')
                            stack.push(n1-n2);
                        if(input.get(i).charAt(j)=='/')
                            stack.push(n1/n2);
                        if(input.get(i).charAt(j)=='*')
                            stack.push(n1*n2);          
                    }   

                }

                int output=stack.pop();
                System.out.println(output);
            }

        }

    }

【问题讨论】:

  • 评分网站是使用测试用例来检查您的算法还是只是一个在线编译器?
  • 不要为同一个输入流打开多个扫描器。并关注clearing the scanner after nextInt

标签: java nosuchelementexception


【解决方案1】:

问题是当你使用

String str=scan1.nextLine();

它只会读取你的输入直到空格之后它不会读取字符串输入只是使用

String str=scan1.next();

【讨论】:

    【解决方案2】:

    阅读整行以与行尾保持同步。不要使用其他扫描仪。

      int n=scan1.nextInt();
      scan1.nextLine();
      ArrayList<String> input=new ArrayList<String>();
      for(int i=0;i<n;i++){
           System.out.print("Enter a expression in postfix: ");
           String string=scan1.nextLine();
           input.add(i,string);
      }
    

    【讨论】:

      【解决方案3】:

      当您在 nextInt() 之后执行 scan2.nextLine(); 之前的换行符未被处理时,这就是为什么仍在缓冲区中的换行符通过您的 scan2.nextLine() 而不是您的新输入读取。

      你可以通过两种方式处理它 -

      1. 在第一次nextInt() 调用之后立即执行一个空的scan1.nextLine()

      2. 或者不使用nextInt(),而是使用nextLine()并使用Integer.parseInt()将该字符串转换为整数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 2019-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多