JDK异常及原因集合

异常:java.lang.UnsupportedOperationException

at java.util.AbstractMap.put(AbstractMap.java:186)

原因:Collections.emptyMap(); 返回的是一个继承自AbstractMap的EMPTY_MAP类,大部分方法没有实现只抛出异常。
在某些情况下,我们经常需要发挥一个空的集合对象,比如说在数据查询时,并不需要发挥一个NULL或是异常,那么就可以返回一个空的集合对象。

异常:java.util.UnknownFormatConversionException

原因:String.format()/System.out.prinlnt()的第一个参数中存在破坏%s/%d输出格式化的字符。

异常:java.lang.IllegalMonitorStateException

使用Object.wait() /wait()方法时,没有取得Object的锁,应该是Synchronized(obj){ obj.wait(); //do something; obj.notify;}。

异常:java.lang.ArrayStoreException:

往数组中存储不匹配的对象。见《TIJ4》

class Apple extends Fruit {} class Jonathan extends Apple {}class Orange extends Fruit {}

Fruit[] fruit = new Apple[10]; fruit[0] = new Fruit(); fruit[0] = new Orange();

编译通过,运行时报错:ArrayStoreException。

异常:Illegal modifier for the enum constructor; only private is permitted.

Enum类型实例化没有任何意义。enum构造函数只允许private和package两种可见性修饰。

 

异常:Matcher.find()方法返回值和Eclipse debug时在表达式中看到的不同。

Eclipse表达式中Matcher.find()方法会执行find()里面的代码(即使在find()的实现代码中打了断点,也不会产生中断),该方法中会改变Matcher的nextSearchIndex值。本地函数返回时该值已经修改,所以会有不同的值。

 

异常:使用File.renameTo修改文件名时,一直返回false。

原因:在使用被修改文件名的文件,在IO流中被使用,并且使用完后没有关闭流,关闭流后使用renameTo方法即可该文件名。

 

 异常:乘法计算溢出

代码中需要计算一百年时间的微秒数。

于是定时了常量 static final long MILLISECOND_100YEARS =  100 * 365 * 24 * 60 * 60 * 1000;

发现常量和当前时间相加后得到的long反而小了。将定义改为

final long MILLISECOND_100YEARS =  100L * 365L * 24L * 60L * 60L * 1000L;

计算结果正常。

原因:对整数计算时默认为int型,int型的值范围是-2G~2G-1,不足以表示这个大数字,计算过程中发生溢出,造成计算结果不正确。加上L后,告诉编译器这是一个long型,需要按long型来处理。



 

 


 

你可能感兴趣的:(Java)