java错误消息空指针异常

时间:2014-04-01 05:30:58

标签: java

这是我在下面尝试运行代码时收到的错误。我的老师说我们可以随时随地寻求帮助。如果有人能帮我解决这个错误,我将非常感激

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

6 个答案:

答案 0 :(得分:2)

您的for循环计为daysArray.length,但daysArraynull。此外,你的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。

  1. 在使用之前初始化您的数组。

    然后尝试一下,你就会得到你想要的东西。

答案 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分配了一个对象,您应该会看到其余的代码。也许你忘了或者由于逻辑错误而发生这种情况。

啰嗦道,但是因为你是新人,我做到了。