0

我编写了一个代码来计算给定元素列表的因子数。INPUT: test- 测试用例数 num- 1 个测试用例中的元素数 numarr- 其中值(要找到其乘积的因子)除以空格的字符串。

当输入为:

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

}
4

2 回答 2

1

想想你的代码在做什么:

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

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

将整个内容放入 {}。

if(numarr!=null)
{
    splitt=numarr.split(" ");
    if(splitt.length==num)
    {
    ...
    }
}
于 2013-10-04T21:36:08.730 回答
0

您指出的行不能抛出 NPE,因为前面的if语句可以防止这种情况发生。但是,在 where 的情况下numarrnull您将在下一行获得 NPE:

if (splitt.length==num)

我猜这是您认为该if声明也涵盖下一行的情况。最好在语句中始终使用花括号if,以清楚地标记它们的结束位置。

于 2013-10-04T21:32:11.747 回答