无法弄清楚为什么我得到空值

时间:2018-12-06 01:20:22

标签: java

该程序应该打印出选择每个名称的次数(用星号(*)表示。我的大部分代码都在工作,但由于某些原因,每个输出包含两个空值)名称,我不确定如何解决该问题。如果您有时间,我也会努力找出哪个名称带有最多的星号。这是示例输出:

1:nullnull ************************ Conner

2:nullnull **************************************约翰 等等... (对所有10个名称都执行此操作)

public class RandomStudentsLab {
    public static void main(String[] args){

        //create an array with 10 students
        String [] StudentList = new String[10];
        String [] StarString = new String[10];
        String [] FinalString = new String[10];

        //add 10 names to the student list
        StudentList[0] = "Conner";
        StudentList[1] = "John";
        StudentList[2] = "Alex";
        StudentList[3] = "Robert";
        StudentList[4] = "James";
        StudentList[5] = "Carl";
        StudentList[6] = "Sarah";
        StudentList[7] = "Bob";
        StudentList[8] = "Ethan";
        StudentList[9] = "Chris";


        //loop 250 times selecting each student randomly

        for(int i=0; i<250; i++){
            int randomNum = (int)((Math.random()*10));
            for(int x=0; x<10; x++){
                if(randomNum == x){
                    StarString[x] += "*";
                }
            }
        }



        for(int z=0; z<10; z++){
            System.out.println((z+1)+": "+(FinalString[z] += StarString[z] + " "+StudentList[z]));      
        }

    }

}

2 个答案:

答案 0 :(得分:2)

FinalString和StarString数组中的元素仍未初始化。因此,使用+ =运算符,它会在null元素上调用toString,并为每个字符串加上前缀“ null”。

答案 1 :(得分:0)

正如Karthik在他的回答中提到的那样,您从未初始化(就像您从未分配值一样)FinalString数组。这就是导致您出错的原因。

您可以轻松地判断出您的 System.out.println()正在打印:

Number : nullnull Stars Name

很明显,您的问题出在FinalString上,它是唯一无法正确打印的变量。

System.out.println((z+1)+": "+(FinalString[z] += StarString[z] + " "+StudentList[z]));

您在使用StarString数组时犯了同样的错误。在这种情况下,您很幸运能够摆脱它,因为您最终在循环中向StarString添加了变量。

但是,不初始化任何变量是>>可怕的<<< / strong>做法。您永远都不知道以前存储在内存中的内容,这可能导致您的变量被分配一些其他程序遗留在内存中的“外来”数据。其次,这就是您的问题所在,如果您忘记初始化,可能会遇到 null 错误等。

因此,根据良好的编码习惯,请始终将变量初始化为某种形式。即使您稍后使用该变量两行,也没关系。创建变量时,为其分配一个值:

如果是整数,则为0或-1。最好是程序中不会出现该值,因此,如果代码中有错误,则可以轻松发现它,因为整数将是-1而不是x y z。 如果是字符串,则将其命名为“ banana”或“ peanuts”或其他名称。 如果是对象,请确保初始化所有属性 等等...

P.S。不知道我是否遇到过这么苛刻,但这绝对不是我的意图。良好的编码习惯非常重要,并且在将来会非常有帮助。

祝你好运!

编辑:

稍作更新,以反映您对另一个答案的评论。 在String [] FinalString = new String[10];处创建FinalString时,您没有为其分配任何值,这与您对名称所做的不同。

因此,当您的代码到达此处的最终for循环时:

for(int z=0; z<10; z++){
        System.out.println((z+1)+": "+(FinalString[z] += StarString[z] + " "+StudentList[z]));      
    }

}

}

然后尝试为 FinalString [z] 做一个 System.out.println(),FinalString [z]仍然没有值。您没有在代码中编写

FinalString[0] = "Banana";

因此显然它将打印null。