【问题标题】:Scanner throwing java.util.NoSuchElementException when input is taken接受输入时扫描程序抛出 java.util.NoSuchElementException
【发布时间】:2018-09-07 09:57:39
【问题描述】:

下面的代码在函数aVeryBigSum 中抛出NoSuchElementException。 PS:这是hackerrank的任务,所以我只能修改函数中的代码:aVeryBigSum

此函数接受以下输入:n,即要添加的数组中的元素数,以及数组的元素。

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Solution {

    // Complete the aVeryBigSum function below.
    static long aVeryBigSum(long[] ar) {
        int n, sum = 0;
        Scanner read = new Scanner(System.in);
        n = read.nextInt();
        for(int i = 0; i < n; i++)
            sum += read.nextLong();
        return sum;
    }

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        BufferedWriter bufferedWriter
                = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

        int arCount = scanner.nextInt();
        scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

        long[] ar = new long[arCount];

        String[] arItems = scanner.nextLine().split(" ");
        scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

        for (int i = 0; i < arCount; i++) {
            long arItem = Long.parseLong(arItems[i]);
            ar[i] = arItem;
        }

        long result = aVeryBigSum(ar);

        bufferedWriter.write(String.valueOf(result));
        bufferedWriter.newLine();

        bufferedWriter.close();

        scanner.close();
    }
}

输出:

【问题讨论】:

  • 为什么你的 n 是 int 类型的,而该方法需要很长?
  • 是的,这也是一个错误:D

标签: java java.util.scanner nosuchelementexception


【解决方案1】:

您为什么在您的aVeryBigSum 方法中读取Scanner

只需遍历ar 参数并计算总和。

static long aVeryBigSum(long[] ar) {
    long _sum = 0;
    for(int i=0; i < ar.length; i++)
        sum += ar[i];
    return _sum;
}

【讨论】:

  • 解释:由于输入已经从main() 方法中的 Scanner 对象中读取。缓冲区中没有更多元素可供读取,这就是您收到此异常的原因。您只需要处理传递给您的aVeryBigSum(long[] ar) 方法的ar 参数。
  • 是问题的要求。即使我不阅读元素,我仍然必须阅读元素的数量,这就是引发异常的地方。
  • 其实你是对的!有效!!我从功能中删除了扫描仪。我什至没有输入元素的数量。但是我还是不明白为什么会抛出异常...是不是因为有两个 Scanner 对象使用相同的输入流?
【解决方案2】:
static long aVeryBigSum(long[] ar) {
    int n;
    Long sum = 0;
    Scanner read = new Scanner(System.in);
    n = read.nextInt();
    for(int i = 0; i < n; i++)
        sum += read.nextLong();
    return sum;
}

如果你改变它对我来说很好:int n; 长和=0;在现有代码中并尝试。

输出:2 1 2

5 1000000001 1000000002 1000000003 1000000004 1000000005 5000000015

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多