为什么错误" java.util.NoSuchElementException"被抛出?

时间:2016-07-26 20:51:59

标签: java

这个问题是从Hackerrank复制的:

  加里是一个狂热的徒步旅行者。他精心追踪他的徒步旅行,密切关注地形等小细节。在他最后一次徒步旅行中,他采取了一些措施。对于他采取的每一步,他都注意到这是一个上坡还是一个下坡的步骤。加里的徒步在海平面开始和结束。我们定义以下术语:

     

一座山是海平面以上连续阶梯的非空序列,从海平面上升一步,一步到海平面。

     

山谷是海平面以下连续阶梯的非空序列,从海平面向下逐步开始,向海平面逐步结束。鉴于加里在上次徒步旅行期间的上下步骤,找到并打印他走过的山谷数量。

     

输入格式:

     

第一行包含一个整数,表示加里加息中的步数。

     

第二行包含单个字符串。每个字符都是(其中U表示向上迈步,D表示向下逐步),字符串中的字符描述了加里在徒步旅行中的步骤。

     

约束:

     

输出格式:

     

打印一个整数,表示加里在徒步旅行期间走过的山谷数量。

     

示例输入:

     

8   UDDDUDUU

     

示例输出:   1

     

说明:   如果我们将_表示为海平面,将步骤表示为/,并逐步降低为\,加里的徒步旅行可以表示为:

_/\      _
   \    /
    \/\/
     

很明显,那里只有一个山谷,所以我们在一条新线上打印。

这是我提交的解决方案:

import java.io.*;
import java.util.*;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        String arr = "";
        for(int i = 0; i < n; i++){
            arr += scan.next();
        }

        int total = 0;
        int counter = 0;
        boolean isValley = false;
        String sub = "";

        for(int i = 0; i < arr.length(); i++){
            sub = arr.substring(i, i + 1);
            if(sub.equals("U")){
                total++;
            }
            if(sub.equals("D")){
                total--;
            }
            if(total == 0){
                isValley = true;
            }
            if(total < -1 && isValley){
                counter++;
                isValley = false;
            }
        }
        System.out.println(counter);
    }
}

我不确定为什么,但是ide会抛出这个错误:

  

线程中的异常&#34; main&#34; java.util.Scanner.throwFor(Scanner.java:862)java.util.NoSuchElementException,java.util.Scanner.next(Scanner.java:1371)at Solution.main(Solution.java:12)

1 个答案:

答案 0 :(得分:1)

Scanner#next读取整个令牌,而不是字符。在for循环

arr += scan.next();

在第一遍中消耗UDDDUDUU。第二遍没有什么可读的。因此,java.util.NoSuchElementException