java 出现“Exception in thread "main" java.lang.NullPointerException”

jjoke 发布于 2018/04/25 12:29
阅读 3K+
收藏 0

我是java初学者,种植学写一个小程序“学生成绩管理系统”,在51自学网上学习的。现在遇到一个问题如下:

Exception in thread "main" java.lang.NullPointerException
    at Admin.print(Admin.java:8)
    at Admin.create(Admin.java:35)
    at Text.main(Text.java:23)

所有代码如下
请大神门帮忙看一下问题出在哪里????
第一个文件 定义类文件

public class Student {
    private int on;
    private String name;
    private int age;
    private int java;
    private int C_shar;
    private int html;
    private int sql;
    private int sum;
    private int avg;
    public int getOn() {
        return on;
    }
    public void setOn(int on) {
        this.on = on;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getJava() {
        return java;
    }
    public void setJava(int java) {
        this.java = java;
    }
    public int getC_shar() {
        return C_shar;
    }
    public void setC_shar(int c_shar) {
        C_shar = c_shar;
    }
    public int getHtml() {
        return html;
    }
    public void setHtml(int html) {
        this.html = html;
    }
    public int getSql() {
        return sql;
    }
    public void setSql(int sql) {
        this.sql = sql;
    }
    public int getSum() {
        return sum;
    }
    public void setSum() {
        this.sum = this.java+C_shar+this.html+this.sql;
    }
    public int getAvg() {
        return avg;
    }
    public void setAvg() {
        this.avg =this.sum/4;
    }
    public String toString(){
        String msg="\t"+this.on+"\t"+this.name+"\t"+this.age+"\t"+this.java+"\t"
        +C_shar+"\t"+this.html+"\t"+this.sql+"\t"+this.sum+"\t"+this.avg;    
        return msg;
    }
}
第二个文件 主程序文件
import java.util.*;
public class Text {//主程序
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        //System.out.println("—请定义人数—");
        Student[] stuArr=new Student[4];
        Admin adminStu=new Admin();
        while(true){
            System.out.println("10:添加一个学生");
            System.out.println("11:查找一个学生");
            System.out.println("12:根据编号更新学生的基本信息");
            System.out.println("13:根据编号删除学生");
            System.out.println("14:根据编号输入学生的各门成绩");
            System.out.println("15:根据某一门成绩进行排序");
            System.out.println("16:根据总分进行排序");
            System.out.println("99:退出系统");
            int number=in.nextInt();
            if(number==10){
                System.out.println("请输入学生姓名");
                String name=in.next();
                System.out.println("请输入学生年龄");
                int age=in.nextInt();
                adminStu.create(name,age,stuArr);    //添加学生
            }else if(number==11){
                System.out.println("执行查找学生的基本信息操作");
                System.out.println("请输入学生编号进行查找");
                int on=in.nextInt();
                adminStu.select(on,stuArr);
            }else if(number==12){
                System.out.println("执行更新学生的基本信息操作");
                System.out.println("请输入学生编号");
                int on=in.nextInt();
                System.out.println("请输入学生姓名:");
                String name=in.next();
                System.out.println("请输入学生年龄:");
                int age=in.nextInt();
                adminStu.update(on,name,age,stuArr);
            }else if(number==13){
                System.out.println("执行删除学生操作");
                System.out.println("请输入学生编号");
                int on=in.nextInt();
                adminStu.delate(on,stuArr);

            }else if(number==14){
                System.out.println("执行输入成绩操作");
                System.out.println("请输入学生编号");
                int on=in.nextInt();
                adminStu.input(on,stuArr);            
            }
        }

    }

}
第三个文件:方法文件
import java.util.*;
public class Admin {//用来管理学生的类    
    String msg="\t编号\t姓名\t年龄\tjava\tC#\thtml\tsql\t总分\t平均分";
    public void print(Student[] arr){
        System.out.println(msg);
        for(int i=0;i<arr.length;i++){
            if(arr!=null){
                arr[i].setSum();
                arr[i].setAvg();
                System.out.println(arr[i]);
            }
        }
    }
    public boolean exist(int on,Student stu){//判断学生是否存在
        if(stu!=null){
            if(stu.getOn()==on){
                return true;
            }else{
                return false;
            }
        }
        return false;
    }
    public void create(String name,int age,Student[] arr){
        Student stu=new Student();
        stu.setName(name);
        stu.setAge(age);
        int i=this.setIndex(arr);
        stu.setOn(i);
        if(i==9999){
            System.out.println("学生人数已达到最大");
        }else{
            arr[i]=stu;
        }
        this.print(arr);
    }
    public int setIndex(Student[] arr){//返回为空的下标
        for(int i=0;i<arr.length;i++){
            if(arr[i]==null){
                return i;}
        }
        return 9999;
    }
    public void select(int on,Student[] arr){//查询方法
        System.out.println(msg);
        for (int i=0;i<arr.length;i++){
            if(this.exist(on, arr[i])==true){
                System.out.println(msg);
                System.out.println(arr[i]);
                return;
            }
        }
        System.out.println("没有这个人");
    }
    public void update(int on,String name,int age,Student arr[]){//更新学员信息
//        更新学员信息
        for(int i=0;i<arr.length;i++){
            if(this.exist(on, arr[i])){
                arr[i].setName(name);
                arr[i].setAge(age);
                System.out.println("******更新学生信息成功******");
                this.print(arr);    
                return;
            }
        }
        System.out.println("******更新信息没有成功******");
    }
    public void delate(int on,Student[] arr){
        for(int i=0;i<arr.length;i++){
            if(this.exist(on, arr[i])){
                arr[i]=null;
                this.print(arr);
                return;
            }
        }
        System.out.println("没有这个学生存在");
    }
    public void input(int on,Student[] arr){//输入学生成绩
        for(int i=0;i<arr.length;i++){
            if(this.exist(on, arr[i])==true){
                System.out.println("请输入"+arr[i].getName()+"java成绩:");
                Scanner in=new Scanner(System.in);
                arr[i].setJava(in.nextInt());
                System.out.println("请输入"+arr[i].getName()+"C#成绩:");
                arr[i].setC_shar(in.nextInt());
                System.out.println("请输入"+arr[i].getName()+"html成绩:");
                arr[i].setHtml(in.nextInt());
                System.out.println("请输入"+arr[i].getName()+"SQL成绩:");
                arr[i].setSql(in.nextInt());
                this.print(arr);
                break;

            }
        }
    }
    

}

加载中
0
ksfzhaohui
ksfzhaohui

 你是要判定if(arr!=null)还是if(arr[i]!=null)

0
Shazi199
Shazi199

连错误行号都给你了还看不出来吗。。

0
阮少爷
阮少爷
nullpointerexception应该是最好解决的异常
0
tcxu
tcxu

据空指针(java.lang.NullPointerException) 的例外信息 先找到出问题的代码行,进而分析出错原因,再着手修复。
at Admin.print(Admin.java:8) arr[i].setSum(); 执行学生数组下标为i的元素时,出现空指针,即引用(句柄 arr[i])为空。仔细查看上下文:

public void print(Student[] arr){
        System.out.println(msg); //打印字段名
        for(int i=0;i<arr.length;i++){
            if(arr!=null){
                arr[i].setSum(); //在代码第 8 行出错
                arr[i].setAvg();
                System.out.println(arr[i]);
            }
        }

可知,这个方法,使用for循环,依次 1. 处理学生分数, 2. 再打印学生的信息。
从类Text属性stuArr(学生数组)可知,已经定义其长度为 4。要知道,这时只是声明了长度,而每个元素(键值)都指空(null)。
用户开始,先选择10 仅添加了一个学生的姓名、年龄的信息,况且各门成绩也未知,就要求总分setSum(),求平均,然后打印出个该学生的信息。勉强可以处理第一个刚输进姓名和年龄的这个学生,只是成绩均为 0。再往下 问题就出在了 Admin.java:8,因为当控制变量 i 为 1 时,对应的元素为空。

解决办法:
将前一行的if判断语句改成: if (arr[i] != null) 即可。

注:余下的两条错误信息,是由于上述原因连锁产生的。一旦改正了上述错误,余下的就不会发生了。
at Admin.create(Admin.java:35) 
this.print(arr); 因此,调用Admin的成员方法 print(arr)当然出错,况且,这个方法的for循环体的最后一行System.out.println(arr[i]);也引用了有可能为空的 arr[i]。

at Text.main(Text.java:23)
adminStu.create(name,age,stuArr); 调用类admin成员方法create, 当然出错,因为  它用了学生数组做参数, 而学生数组的第2、3、4个元素为空。。

顺便看出:
类Student的成员方法 public void setSum()的定义有误:C_shar 的成绩没有句柄 this. 方法定义中的代码应改为: this.sum = this.java+this.C_shar+this.html+this.sql;

继续测试、修改,以完善此款软件吧。

返回顶部
顶部