记录一下编程过程中遇到的一些常见的异常处理,相信以后肯定不止一次的会遇到,希望下次再遇到的时候能够很快的定位解决问题。
1. java.util.IllegalFormatConversionException: d != java.lang.String**
背景:
学习java编程思想 – 13.5.5 Formatter转换,练习13-4遇到错误如下:
JDK API 异常说明:
当与格式说明符对应的参数是不兼容的类型时抛出未检查的异常。
异常代码:
Formatter f = new Formatter(System.out);
// public static final String FORMATER_TOTAL = "%-15s %5d %10.2f\n"; //错误代码
public static final String FORMATER_TOTAL = "%-15s %5s %10.2f\n"; //正确代码
f.format(FORMATER_TOTAL,"Total"," ",total*0.06); //第二个格式化参数应该是String类型(%5s),而不是int整型(%5d)
分析总结:
遇到此错误要检查使用的format方法的格式说明符是否正确,是否和传进去的参数匹配。
ps: “%-15s” 默认的情况下,数据是右对齐的,可以通过加上“-”标志改变对齐方式
2. java.lang.StackOverflowError
背景:
学习java编程思想 – 13.2 重载“+”与StringBuilder
JDK API 异常说明:
当堆栈溢出发生时抛出一个应用程序递归太深。。
异常代码:
@Override
public String toString() {
return "Exercise13_2 address:"+super.toString()+"\n"; //正确代码
return "Exercise13_2 address:"+this+"\n"; //错误代码
}
分析总结:
重载的toString方法中如果使用字符串加this,会造成不断递归调用自身的toString(),从而造成堆栈溢出。
遇到此异常要检查报错的代码行是否存在不断做递归操作。
3. java.lang.NullPointerException: null
背景:
对数据库中取出的数据进行操作时,报了空指针异常。
JDK API 异常说明:
当应用程序尝试在需要对象的情况下使用null时抛出
异常代码:
TDeviceInfo deviceInfo =tDeviceInfoMapper.findByDeviceId(deviceId)
List<TOrder> orders = tOrderMapper.findByDevId(deviceInfo.getId())
修改后的代码:
TDeviceInfo deviceInfo =tDeviceInfoMapper.findByDeviceId(deviceId)
if (deviceInfo != null) {
List<TOrder> orders = tOrderMapper.findByDevId(deviceInfo.getId())
} else {
//todo
}
分析总结:
- 根据deviceId从数据库中取出deviceInfo,deviceInfo可能为null,如果再对deviceInfo进行getId()操作就会出现空指针异常。
- 该异常就是对null对象进行了不合法的操作,大多情况可能就是对null对象调用类实例方法导致的。