Java给类对象数组属性赋值时报错:Exception in thread “main“ java.lang.NullPointerException

博客介绍了在Java中如何定义一个Student类,创建对象数组并初始化,以及使用冒泡排序对学生信息进行排序。在编程过程中遇到了NullPointerException的问题,原因是未对数组元素进行实例化。修复这个问题后,程序能够正确地输出3年级学生信息和按成绩排序后的所有学生信息。此博客强调了实例化数组对象的重要性以及在数组操作中避免空指针异常的必要性。
摘要由CSDN通过智能技术生成

在学习“类中的方法和类的声明”时,写了一道关于学生信息的练习题,题目如下:

定义类Student,包含三个属性:
 * 学号number(int),年级state(int),成绩score(int)。
 * 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
 * 问题一:打印出3年级(state值为3)的学生信息。
 * 问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息

利用数组的方式写了一下这道题,代码如下:

public class StudentTest {
    public static void main(String[] args){
        Student[] stu=new Student[20];
        for(int i=0;i<stu.length;i++){
            stu[i].number=i+1;
            stu[i].state=(int)(Math.random()*(6-1+1)+1);
            stu[i].score=(int)(Math.random()*(100-0+1));
        }
        //遍历
        for(int i=0;i<stu.length;i++){
            System.out.println(stu[i].info());
        }

        System.out.println("*********以下是问题1*********");
        //问题一:打印出3年级(state值为3)的学生信息。
        for(int i=0;i<stu.length;i++){
            if(stu[i].state==3){
                System.out.println(stu[i].info());
            }
        }

        System.out.println("********以下是问题2**********");
        //问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息。
        for(int i = 0;i < stu.length - 1;i++){
            for(int j = 0;j <stu.length - 1 - i;j++){
                if(stu[j].score >stu[j+1].score){
                    //如果需要换序,交换的是数组的元素,Student对象!!!
                    Student temp = stu[j];
                    stu[j] = stu[j+1];
                    stu[j+1] = temp;
                }
            }
        }

        //遍历学生数组
        for(int i = 0;i < stu.length;i++){
            System.out.println(stu[i].info());
        }
    }

}
class Student{
    int number;
    int state;
    int score;
    public String info(){
        return "学号:"+number+",年级:"+state+",成绩:"+score;
    }
        }

但是运行之后发现报出如下错误:

Exception in thread "main" java.lang.NullPointerException
	at Day2.StudentTest.main(StudentTest.java:23)

 报错在第23行,但是经过检查,也并未发现有什么语法或者细节上的错误,于是就不得不进行我最不喜欢的Debug调试了。经过Debug竟然发现数组始终为空:

这样错误的原因就出来了:声明了数组后直接就引用对象变量,而并没有实例化数组对象。

于是加上一行代码对数组进行实例化如下:

stu[i] = new Student();

 重新运行程序之后,便可以按照计划实现输出了。

修改源代码如下(正确的、正确的、正确的!):

/*
 * 对象数组题目:定义类Student,包含三个属性:
 * 学号number(int),年级state(int),成绩score(int)。
 * 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
 * 问题一:打印出3年级(state值为3)的学生信息。
 * 问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
 * 提示:  1) 生成随机数:Math.random(),返回值类型double;  
 * 		2) 四舍五入取整:Math.round(double d),返回值类型long。
 * 
 */
public class StudentTest {
	public static void main(String[] args) {
		//声明一个Student类型的数组
		Student[] stu = new Student[20];
		
		for(int i = 0;i <stu.length;i++){
			//给数组元素赋值
			stu[i] = new Student();
			//给Student的对象的属性赋值
			stu[i].number = i + 1;
			//年级:[1,6]
			stu[i].state = (int)(Math.random() * (6 - 1 + 1) + 1);
			//成绩:[0,100]
			stu[i].score = (int)(Math.random() * (100 - 0 + 1));
		}
		
		//遍历学生数组
		for(int i = 0;i < stu.length;i++){
//			System.out.println(stu[i].number + "," + stu[i].state 
//				+  "," + stu[i].score);
			
			System.out.println(stu[i].info());
		}
		System.out.println("*********以下是问题1*********");
		
		//问题一:打印出3年级(state值为3)的学生信息。
		for(int i = 0;i < stu.length;i++){
			if(stu[i].state == 3){
				System.out.println(stu[i].info());
			}
		}
		System.out.println("********以下是问题2**********");
		
		//问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息。
		for(int i = 0;i < stu.length - 1;i++){
			for(int j = 0;j <stu.length - 1 - i;j++){
				if(stu[j].score >stu[j+1].score){
					//如果需要换序,交换的是数组的元素,Student对象!!!
					Student temp = stu[j];
					stu[j] = stu[j+1];
					stu[j+1] = temp;
				}
			}
		}
		
		//遍历学生数组
		for(int i = 0;i < stu.length;i++){
			System.out.println(stu[i].info());
		}
		
	}
}
class Student{
	int number;	//学号
	int state;	//年级
	int score;	//成绩
	
	//显示学生信息的方法
	public String info(){
		return "学号:" + number + ",年级:" + state + ",成绩:" + score;
	}
}

 总结,在对数组进行赋值时,必须先对数组进行实例化,否则计算机无法为其在内存中开辟空间。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值