使用Scanner时NoSuchElementException

时间:2015-09-13 08:20:46

标签: java nosuchelementexception

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

e.g) 2 \ n 12 + 3 * \ n 31 / 2-4 * 2 + \ n

它在日食中效果很好但在得分网站上没有用。 得分网站说了

  

异常:java.util.NoSuchElementException也许at:at   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);
            }

        }

    }

3 个答案:

答案 0 :(得分:0)

当你使用

String str=scan1.nextLine();

它只会读取您的输入,直到空格之后才会读取字符串输入,只需使用

String str=scan1.next();

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

你可以用两种方式处理 -

  1. 在第一次scan1.nextLine()电话后立即执行空nextInt()

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