【问题标题】:NumberFormatException when reading from System.in从 System.in 读取时出现 NumberFormatException
【发布时间】:2015-05-06 12:54:04
【问题描述】:

我在运行代码时遇到这些异常

Exception in thread "main" java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Integer.java:542)
    at java.lang.Integer.parseInt(Integer.java:615)
    at Ideone.main(Main.java:22)

我是 java 新手,无法解决此错误。请帮忙 ! 这是我的代码->

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


class etest {
    public static void main (String[] args) throws java.lang.Exception{
        int n,k;
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        k = in.nextInt();
        BufferedReader input = new BufferedReader( new InputStreamReader(System.in));
        //StringTokenizer token = new StringTokenizer(input.readLine());
        int total=0;
        int values[] = new int[n];
        for(int i =0; i<n; i++) {
            values[i] = Integer.parseInt(input.readLine());
            if ((values[i]%k)==0) {
                total++ ;
            }
            input.close();
        }
        System.out.println(total);
    }
}

我正在使用以下输入示例来运行程序。 非常感谢您的帮助!

7 3
1
51
966369
7
9
999996
11

【问题讨论】:

  • 如果您的流已用尽,input.readLine() 返回null
  • 那么如何克服呢?
  • 仅使用Scanner 和类似while (scanner.hasNextInt()) { values[i] = Integer.parseInt(scanner.nextInt()); } 的东西会不会容易得多
  • @Jyr 没有必要为scanner.nextInt()Integer.parseInt 因为已经是int
  • 你一次尝试了太多的东西......使用ScannerBuffredReader保持简单,使用后立即关闭IO流(如果它没有进一步使用)跨度>

标签: java system.in


【解决方案1】:

你的程序有太多错误:

您可以如下更改您的代码

public static void main(String[] args) throws java.lang.Exception {
    int n, k;
    Scanner in = new Scanner(System.in);
    n = in.nextInt();
    k = in.nextInt();
    int total = 0;
    int values[] = new int[n];
    for (int i = 0; i < n; i++) {
        values[i] = in.nextInt();
        if ((values[i] % k) == 0) {
            total++;
        }
    }
    System.out.println(total);
}

1) 你不应该关闭 BufferedReader 它也会自动关闭输入流。

2) 您不需要同时使用 Scanner 和 BufferedReader。您的解决方案可以使用其中任何一种。

3) 使用Integer.parseInt(String str);时最好使用try-catch

如果您想使用 BufferedReader,那么您需要将代码更改为

public static void main(String[] args) throws java.lang.Exception {
    int n, k;


    BufferedReader input = new BufferedReader( new InputStreamReader(System.in));
    String str[]= input.readLine().split(" ");
    n = Integer.parseInt(str[0]);
    k = Integer.parseInt(str[1]);
    int total = 0;
    int values[] = new int[n];
    for (int i = 0; i < n; i++) {
        values[i]=Integer.parseInt(input.readLine());
        if ((values[i] % k) == 0) {
            total++;
        }
    }
    System.out.println(total);
}

【讨论】:

  • 这将花费太多时间,我必须使用缓冲阅读器在更短的时间内解决这个问题
  • @AkashKesarwani 你为什么要限制时间
  • @deme72 我有一个时间限制,在运行时每秒至少有 2.5MB 的输入数据
  • @AkashKesarwani:我用 BufferedReader 更改了扫描仪。
  • @Prashant 现在可以正常工作了。我认为这是因为在同一个程序中使用了两种不同的方法。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多