在什么情况下,旧版Java代码无法在较新版本上编译

Boz*_*zho 14 java

Java正在努力向后兼容.(在某种程度上,它使其仿制品瘫痪了).

但有些旧代码无法在较新版本上编译的情况(更重要的是Java 5和即将推出的Java 7)

Rya*_*des 9

实际上似乎有相当多的 - 好吧,并非所有这些都会导致编译错误,但这是sun的官方消息:http://java.sun.com/j2se/JM_White_Paper_R6A.pdf

我通常使用这些检查:

  1. 在1.4之前,如果文件类型已知并且响应代码大于或等于400,URLConnection.getInputStream会抛出FileNotFoundException.否则将抛出异常

  2. HttpURLConnection.getErrorStream可用于读取从服务器返回的错误页面.在1.4之前,getErrorStream()始终返回null.

  3. DOM接口中添加了新方法,因此某些现有应用程序无法使用新接口进行编译.

  4. 现在,应用程序可以将ErrorHandler,EntityResolver,ContentHandler和DTDHandler设置为null.在这种情况下,SAX 2.0要求XML处理器抛出java.lang.NullPointerException.(与大多数实现一样,5.0中实现的JAXP解析器通过使用默认设置对null做出反应.)

  5. DefaultHandler和EntityResolver子类中的resolveEntity方法抛出IOException和SAXException.以前它只抛出SAXException.

  6. 在SAX 2.0.1中,应用程序可以将ErrorHandler,EntityResolver,ContentHandler或DTDHandler设置为null.这是SAX 2.0中先前限制的放宽,在这种情况下会生成NullPointerException(NPE).

  7. 从5.0开始,XSLTC是默认的转换器,XSLTC不支持Xalan所做的所有扩展.这些扩展超出了JAXP和XSLT规范的定义.

  8. 在5.0中,org.apache类已经在5.0中移动到com.sun.org.apache.package.internal,这样它们就不会与更新的,开发人员下载的类版本冲突.

  9. BigDecimal方法在1.4和5.0之间更改了其行为,导致JDBC驱动程序出现故障.

  10. 从5.0开始,通过在Timestamp上调用compareTo将java.sql.Timestamp与java.util.Date进行比较会导致ClassCastException.

  11. java.net中添加了java.net.Proxy类,使得两个类名为Proxy:(java.lang.reflect.Proxy,java.net.Proxy)

  12. 在1.3和5.0之间的Java语言中添加了以下单词,因此它们不再可用作字段或方法标识符:[assert(在1.4中添加),枚举]


Omr*_*dan 7

是的,例如在较旧的jdks中使用枚举时:

Enumeration enum = ...
Run Code Online (Sandbox Code Playgroud)

将在1.5之前用jdks编译.

  • @Bozho - 另一个例子是旧代码使用'assert'作为标识符. (3认同)