Wednesday, August 7, 2013

JDK 6 与 JDK 7 的不兼容汇总

1、对classes文件的校验,jdk7中method的增加了堆栈映射表属性用于校验。因此任何工具修改字节码文件时都要必须修改更新 
    堆栈映射表。 

2、改进的异常处理导致不兼容。例如以下是jdk6的代码在jdk7里不兼容 
class Foo extends Exception {} 
class SonOfFoo extends Foo {} 
class DaughterOfFoo extends Foo {} 
... 
try { 
   throw new DaughterOfFoo(); 
} catch (final Foo exception) { 
   try { 
      throw exception; // used to throw Foo, now throws DaughterOfFoo 
   } catch (SonOfFoo anotherException) { // Reachable?    } 

第1个不兼容:throw exception。在jdk6里是抛出Foo,但在jdk7里抛出的是DaughterOfFoo。 
第2个不兼容:catch (SonOfFoo ...) 。在jdk6里是可达,但jdk7里不可达。 

3、MirroredTypeException 现在是 MirroredTypesException的子类。 

4、java.lang.Float.parseFloat(String) 和 parseDouble(String)可能会抛出一个NullPointerException,当参数为null时。 

5、在空的TreeMap,TreeSet中插入了null元素可能会导致NullPointerException。在jdk6中不会抛出NullPointerException。 

6、Formatter.format() 抛出了FormatFlagsConversionMismatchException 

7、子类不允许直接访问父类的私有成员变量。 

8、方法重载中,不允许参数相同返回值不同的情况。例如以下代码不允许: 
class A { 
   int m(List<String> ls) { return 0; } 
   long m(List<Integer> ls) { return 1; } 


9、不允许子类重写父类方法时,参数存在继承关系,例如: 
class A{ 
   public int compareTo(Object o){ 
      return 0; 
   } 


class B extends A implements Comparable<B> { 
   public int compareTo(B b){ 
      return 0; 
   } 


10、不允许出现超过1个参数相同的接口。例如: 
public interface Test extends Iterable<Class>, Iterable<Class> {} 

11、不允许通过new Outer.Inner()方式实例静态内部类,例如: 
class Outer { 
    static Inner{}; 

Inner in = new Outer.Inner(); 

12、当http响应码为-1时,Http协议处理程序将会关闭连接,此时再次调用getInputStream()时将抛出IOException。 
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Saturn和本文原始地址:
https://ndtm-idea.blogspot.com/2013/08/jdk-6-jdk-7.html

0 comments:

Post a Comment