我编写了一个代码来计算给定元素列表中的因子数。 INPUT: 测试 - 没有测试用例 1个测试用例中的元素数量 numarr- string,其中的值(其产品的因子将被找到)除以空格。
输入时为:
但是,例外是:
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;
}
}
}
}
}
答案 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
语句可以保护它不会发生。但是,在numarr
为null
的情况下,您将在下一行获得NPE:
if (splitt.length==num)
我猜这是你认为if
语句也涵盖下一行的情况。优良作法是始终在if
语句中使用花括号,以清楚地标记它们的结束位置。