这是我在下面尝试运行代码时收到的错误。我的老师说我们可以随时随地寻求帮助。如果有人能帮我解决这个错误,我将非常感激
java.lang.NullPointerException
at Practise_Assessment.main(Practise_Assessment.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
如果需要,这是我的代码
import java.text.NumberFormat;
import java.util.Arrays;
public class Practise_Assessment {
public static String absences(String prompt) {// user input for name and
// days absent
System.out.println(prompt);
java.util.Scanner keyboard = new java.util.Scanner(System.in);
return keyboard.nextLine();
}
public static void main(String[] args) throws Exception {
int numDayEntries ;
int numNameEntries;
int[] daysArray = null ;
String[] nameArray = null ;
boolean done = false;
while (!done) {
System.out.println("enter # to stop");
String absences = absences("enter name of person absent then the amount of days they were absent");// the value of the users input
for(numDayEntries =0; numDayEntries < daysArray.length;numDayEntries++ ){
daysArray = new int[numDayEntries];
}
for(numNameEntries = 0; numNameEntries < nameArray.length;numNameEntries++ ){
nameArray = new String[numNameEntries];
}
if (absences.equalsIgnoreCase("#")) {
done = true;
} else {
String DaysAbsent =absences.replaceAll("[^0-9]", "") ;
int daysAbsent = ((Number) NumberFormat.getInstance().parse(DaysAbsent)).intValue();// converts a string to an int
String absentee = absences.replaceAll("\\d", "");// replace all digits in the user input to nothing leaving just the name
daysArray[numDayEntries] = daysAbsent;
nameArray[numNameEntries] = absentee;
}
}
System.out.println(Arrays.toString(daysArray));
}
}
答案 0 :(得分:2)
您的for
循环计为daysArray.length
,但daysArray
为null
。此外,你的for
循环无论如何都没有任何意义;你正在创建然后扔掉许多相同的数组。目前还不清楚你的代码想要完成什么,因为你要求一个单个人的名字,然后是一个单个号码,表示缺席次数。
推荐的方法是(1)使用包含学生姓名和缺席次数的对象,将这些信息保存在一个记录中;(2)使用List
而不是数组你不知道你需要多少项,因为List
的大小可变。
答案 1 :(得分:1)
daysArray
为null,从空引用访问.length
。这是NPE
的原因。您需要在使用数组之前对其进行初始化。你的for
循环根本没有任何意义。
答案 2 :(得分:1)
堆栈跟踪告诉您问题出在Practise_Assessment类的第35行。你需要看一下那条线。
如果第35行是这样的话:
for(numDayEntries =0; numDayEntries < daysArray.length;numDayEntries++ ){
然后可能是因为你没有初始化daysArray--你把它设置为null。
答案 3 :(得分:1)
daysArray为null numNameEntries IS NULL
答案 4 :(得分:1)
for循环中的问题。您的数组设置为NULL。
在使用之前初始化您的数组。
然后尝试一下,你就会得到你想要的东西。
答案 5 :(得分:1)
此行是异常的原因 - for(numDayEntries =0; numDayEntries < daysArray.length;numDayEntries++ )
。
查看您获得的异常 - NULL-PointerException或NPE。它告诉我们一些REFERENCE或TYPE被设置为NULL,也就是说,我们没有为它分配一个合适的对象。例如。 Car nfs = null;
。我们应该做Car nfs = new Car();
现在,错误导致行中唯一的OBJECT是daysArray
。其他一切都是int。
因此,如果正确地为daysArray
分配了一个对象,您应该会看到其余的代码。也许你忘了或者由于逻辑错误而发生这种情况。
啰嗦道,但是因为你是新人,我做到了。