日期:2014-05-20  浏览次数:20795 次

请教一个Java的调试方案,错误原因.
我写了一个程序,含有下面的代码:
    
System.out.println("ChatServer.TeacherGrade.get(MyFriIntegerNum)                 "+ChatServer.TeacherGrade.get(MyFriIntegerNum));
System.out.println("ChatServer.TeacherGrade.get(MyFriIntegerNum).myclientds                  "+ChatServer.TeacherGrade.get(MyFriIntegerNum).myclientds);
System.out.println("ChatServer.TeacherGrade.get(MyFriIntegerNum).myclientds.get(MyIndexInteger)                  "+ChatServer.TeacherGrade.get(MyFriIntegerNum).myclientds.get(MyIndexInteger));
System.out.println("ChatServer.TeacherGrade.get(MyFriIntegerNum).myclientds.get(MyIndexInteger).MyState                   "+ChatServer.TeacherGrade.get(MyFriIntegerNum).myclientds.get(MyIndexInteger).MyState)

    打印的结果如下:
    
    其中上文的“TeacherGrade”是一个“HashMap的实例”,他的键为一个“Integer类型的变量”,他的值为一个我自定义的“WorkingSysMemDS”类型,本WorkingSysMemDS类型的代码如下:
    
public class WorkingSysMemDS {
HashMap<Integer,MyUserDS> myuserds = new HashMap<Integer,MyUserDS>();
HashMap<Integer,MyUserDS> myclientds = new HashMap<Integer,MyUserDS>();
Integer MyUserKeyNum = -1;
    byte MyUserGrade = 0;
    boolean MyState = true; 
    
public Integer getMyUserKeyNum() {
return MyUserKeyNum;
}
public void setMyCodestate(boolean state){
MyState = state;
}
public void setMyUserKeyNum(Integer OurUserKeyNum) {
MyUserKeyNum = OurUserKeyNum;
}
public byte getMyUserGrade() {
return MyUserGrade;
}
public void setMyUserGrade(byte UserGrade) {
MyUserGrade = UserGrade;
}
public WorkingSysMemDS(Integer MyUserKey,byte i,boolean state,String MyFriRole){
MyUserKeyNum = MyUserKey;
MyUserGrade = i;
MyState = state;
if(MyFriRole.equals("Cus")){
myuserds.put(MyUserKeyNum, new MyUserDS(MyUserKeyNum,MyUserGrade,MyState));
}else{
myclientds.put(MyUserKeyNum, new MyUserDS(MyUserKeyNum,MyUserGrade,MyState));
}
}
}

    上面的打印语句中的代码“TeacherGrade”,是一个HashMap,他的init部分的代码如下:
    
for(Integer i = 0;i<203;i++){
            for(Integer j= 0;j<203;j++){
                TeacherGrade.put(i, new WorkingSysMemDS(j,(byte)1,false,"Mem"));
            }
        }

        我已经将上面的TeacherGrade中的数据结构,进行了init了呀?
    为什么还会报错呢?
    上面打印的语句语句中的MyFriIntegerNum这个变量的值为1,MyIndexInteger的值为2.
    希望能够得到高手的相助:
    为什么我打印语句出的结果,会有:
    最后一行为“NullPointerException”,而倒数第二行代码打印的结果为:
    null
    值?
    希望高手帮帮忙!!
    这个错误怎么调?
    这个错误是什么原因?
------解决方案--------------------
这就是个空指针错误,由于你第三行的值为null所有当你第四行打印时有了这个对象的方法出现空指针错误
------解决方案--------------------
下面的两层for循环我没看明白
当i=0时:

TeacherGrade.put(0, new WorkingSysMemDS(j,(byte)1,false,"Mem"));

会执行203次,有什么意义呢?
------解决方案--------------------
上面的代码效果等同于for(Integer i = 0;i<203;i++){
                           TeacherGrade.put(i, new WorkingSysMemDS(203,(byte)1,false,"Mem"));
                  }
比如当I=1时,J循环到2与put之后,此时,TeacherGrade.get(1)已经由原本的new WorkingSysMemDS(1,(byte)1,false,"Mem")变成了new WorkingSysMemDS(2,(byte)1,false,"Mem")了,new WorkingSysMemDS(1,(byte)1,false,"Mem")这个VALUE已经被覆盖掉了,因为相对TeacherGrade他的键 1只能对应一个数据