前提:SalariedEmployee
(月薪资) 和HourlyEmployee
(时薪资)子类继承Employee
的抽象父类,来获取父类里的属性/方法,并重写扩展为自己的方法。
先来看下我的报错情况:NullPointerException
- 此处输出的3是因为我获取了一下当前的月份,所以基本锁定在输出语句
System.out.println(month);
也就是24行之后;
空指针异常:是一个运行级别的异常,即只有在运行时才会抛出
NullPointerException
;
在看到这个异常之后,我首先想我的数组是存在的,有没有初始化?有;访问的对象是否存在?存在;对象是否为空?应该不为空(结果是空的,草率了)
- 断点调试:主要针对24行以后的代码:可以看到
emps[0] = null; emps[1] = null;
首先我确定了数组有初始化后,其次new SalariedEmployee()
和new HourlyEmployee()
是没问题的;接着name/number/birthday
等的赋值操作都是调用的子类的toString()
方法;
- 继续往下走,果然显示
toString()
方法抛出了NullPointerException
;
- 首先两个子类的
toString()
方法都是重写的父类的toString()
方法,但方法内部调用了super.toString();
- 继续往下走,可以看到父类
Employee
的toString()
方法只是return
了name,number,birthday.toDateString()
方法而已;
- 想着总不可能变量出错吧,检查
birthday.toDateString()
方法,里面也只是return
了MyDate
的属性,且没有问题;
- 一路都没有问题,不得不去检查
Employee
的属性了,好吧,破案了!属性没有问题,构造器里空空如也,没有this
调用,所以当调用此构造器时,输入的name/number/birthday
将不能传给此时正在创建的对象,当然也就无法输出了;
8.破案后的正常输出!
名言(我说的):debug
很难搞,但debug
成功后还好:)