java空指针异常问题 程序运行空指针异常

//这个是学生类
public class Student {
private int on;
private String name;
private int age;
private int java;
private int c;
private int html;
private int sql;
private int sum;
private int avg;
Student(){
}
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() {
return c;
}
public void setC(int c) {
this.c = c;
}
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+this.c+this.sql+this.html;
}
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"+this.c+"\t"+this.html+"\t"+this.sql+"\t"+this.sum+"\t"
+this.age;
return msg;
}
}

public class Admin {//管理学生类
Student[] stuArr=new Student[10];
public void addStudent(String name,int age,int renShu,int i){
stuArr=new Student[renShu];
stuArr[i].setName(name);
stuArr[i].setAge(age);
}
public String showStudent(){
String show="";
for(int i=0;i<stuArr.length;i++){
show=stuArr[i].toString();
}
return show;
}
}

import java.util.*;

public class Test {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner in=new Scanner(System.in);
    Student student=new Student();
    System.out.println("------请输入学生人数------");
    int studentNum=in.nextInt();
    Student[] stuArr=new Student[studentNum];
    Admin admin=new Admin();
    int c=0;
    do{
        System.out.println("请选择你要执行的功能:");
        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:退出系统");
        c=in.nextInt();
        if(c==10){
            System.out.println("请输入学生姓名:");
            String name=in.next();
            System.out.println("请输入学生年龄:");
            int age=in.nextInt();
            int i=0;
            admin.addStudent(name, age, studentNum, i);
            System.out.println("\t编号\t姓名\t年龄\tjava\tc\thtml\tsql\t总分\t平均分");
            System.out.println(admin.showStudent());
            i++;
        }
    }while(c!=99);
}

}

public void addStudent(String name,int age,int renShu,int i){
stuArr=new Student[renShu];
stuArr[i].setName(name);
stuArr[i].setAge(age);
}

这个不对
首先,根据你调用的代码
admin.addStudent(name, age, studentNum, i);
你不应该每调用一次addStudent就来一个stuArr=new Student[renShu];
其次
stuArr[i].setName(name);
前面应该加上
stuArr[i] = new Student();

 public class Admin {
Student[] stuArr; //这里先不分配
public Admin(int renShu) //加上构造函数
{
stuArr=new Student[renShu];
}
...
}

然后
Admin admin=new Admin();
修改为
Admin admin=new Admin(studentNum);
Main函数里的Student[] stuArr=new Student[studentNum]; 似乎没有用上,可以删除,不删除也没事。

最后
public void addStudent(String name,int age,int renShu,int i){
//stuArr=new Student[renShu];删除这个
stuArr[i] = new Student(); //加上这个
stuArr[i].setName(name);
stuArr[i].setAge(age);
}

当然,int renShu其实也用不上了,可以删除,并且把调用的那个也对应去掉。留着也不影响

for(int i=0;i<stuArr.length && stuArr != null;i++){
show=stuArr[i].toString();
}

我将你的代码进行了一下调试,出错的原因为 stuArr[i] 没有实例化
public class Admin {//管理学生类
Student[] stuArr=new Student[10];
public void addStudent(String name,int age,int renShu,int i){
stuArr=new Student[renShu];
stuArr[i].setName(name);

stuArr[i].setAge(age);
}

另外 showStudent() 这里你需要判断一下stuArr[i] .toString 是否为空。 建议加上try,catch进行调试,很容易找到问题原因!
public String showStudent(){
String show="";
for(int i=0;i<stuArr.length;i++){
show=stuArr[i].toString();
}
return show;
}
}

run:
------请输入学生人数------
5
请选择你要执行的功能:
10:添加一个学生
11:查找一个学生
12:根据学生编号跟新学生信息
13:根据学生编号删除学生
14:根据编号输入学生各门成绩
15:根据某门成绩进行排序
16:根据总分进行排序
99:退出系统
10
请输入学生姓名:
lj
请输入学生年龄:
23
编号 姓名 年龄 java c html sql 总分 平均分
Exception in thread "main" java.lang.NullPointerException
at myrobot.Admin.showStudent(Admin.java:30)
at myrobot.Test.main(Test.java:44)

new出来一个数组 只是在内存中开辟一段空间 一定要为数组指定实例对象 否则会报指针异常

你每次addStudent都变一下students数组,当然会报空指针。建议参考一下ArrayList的实现,判断一下当前容量再扩容

public void addStudent(String name, int age, int renShu, int i) {
stuArr = new Student[renShu];
stuArr[i].setName(name);
stuArr[i].setAge(age);
}
这函数在被调用时,为stuArr分配了renShu个引用的内存大小,每个引用的值都是null,所以在执行stuArr[i].setName(name);时会报空指针异常。正确的做法是给stuArr[i]分配空间,即stuArr[i]=new Student(),使得stuArr[i]的值由原先的null变成student对象。如果用C语言去理解的话,就是为原来的空指针分配空间,使其指向这块空间。分配了空间后,就可以在空间上存储数据了。