split method-生成空指针异常

时间:2013-10-04 21:27:10

标签: java split nullpointerexception

我编写了一个代码来计算给定元素列表中的因子数。 INPUT: 测试 - 没有测试用例 1个测试用例中的元素数量 numarr- string,其中的值(其产品的因子将被找到)除以空格。

输入时为:

  • 3
  • 3
  • 3 5 7
  • 3
  • 2 4 6
  • 2
  • 5 5 理想情况下,输出应为
  • 8
  • 10
  • 3

但是,例外是:

 Exception in thread "main" java.lang.NullPointerException
at Main.main(Main.java:31)


import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        int test = 0;

        Scanner scn = new Scanner(System.in);
        if (scn.hasNextLine())
            test = scn.nextInt();
        int op = 0;
        int[] out = new int[test];
        while ((test <= 100) && (test > 0)) {
            int num = 0;
            if (scn.hasNextLine())
                num = scn.nextInt();
            if (num <= 10) {
                String numarr = null;
                Scanner sc = new Scanner(System.in);
                if (sc.hasNextLine())
                    numarr = sc.nextLine();

                String splitt[] = null;
                if (numarr != null)

                splitt = numarr.split(" ");                           <--ERROR!!!
                if (splitt.length == num) {
                    double[] arr = new double[splitt.length];
                    int i = 0;
                    while (i < splitt.length) {
                        arr[i] = Double.parseDouble(splitt[i]);

                        ++i;
                    }

                    i = 0;
                    double prod = 1;
                    while (i < arr.length) {
                        prod *= arr[i];
                        ++i;
                    }

                    double[] factor = new double[100000];
                    int value = 0;
                    pfac(prod, factor);
                    for (i = 0; (i < factor.length) && (factor[i] != 0); ++i) {

                        value += 1;
                    }

                    out[op] = value;
                    op++;
                }
            }

            --test;
        }
        for (int i = 0; i < op; ++i) {
            System.out.println(out[i]);
        }

    }

    private static void pfac(double n, double[] factor) {
        int pos = 0;

        long max = (long) Math.sqrt(n);

        for (long i = 1; i <= max; ++i) {
            if (n % i == 0) {
                factor[pos] = i;
                pos += 1;
                if (n / i != i) {
                    factor[pos] = n / i;
                    pos += 1;
                }
            }
        }
    }

}

2 个答案:

答案 0 :(得分:1)

考虑一下你的代码在做什么:

if(numarr!=null)
    splitt=numarr.split(" ");
if(splitt.length==num)
{
...
}

如果numarr为null,则表示您没有进行拆分,这意味着当您开始使用它时,splitt仍为null。

将整件事放在{}。

if(numarr!=null)
{
    splitt=numarr.split(" ");
    if(splitt.length==num)
    {
    ...
    }
}

答案 1 :(得分:0)

您指定的行不能抛出NPE,因为前面的if语句可以保护它不会发生。但是,在numarrnull的情况下,您将在下一行获得NPE:

if (splitt.length==num)

我猜这是你认为if语句也涵盖下一行的情况。优良作法是始终在if语句中使用花括号,以清楚地标记它们的结束位置。