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

时间:2010-06-08 05:41:54

标签: java

Java正在努力向后兼容。 (在某种程度上,它使其遗传因素瘫痪)。

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

7 个答案:

答案 0 :(得分: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. 在5.0中添加了java.net.Proxy类,使得两个类名为Proxy: (java.lang.reflect.Proxy,java.net.Proxy)

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

答案 1 :(得分:7)

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

Enumeration enum = ...

将在1.5之前使用jdks进行编译。

答案 2 :(得分:3)

新版本可能不会“破坏”任何内容,仍然会使代码无法编译。

例如,在JDK5中,添加了方法Timer.getId(),返回long
我们实际上有一个子类Thread,并且有自己的getId方法返回一个字符串。这当然会导致编译问题,因为我们突然试图覆盖一个方法并改变其返回值的类型。

答案 3 :(得分:0)

方法和类可以标记为已弃用,这会引发编译时错误。但是你可以告诉编译器忽略它。除了Enumeration,你可以编译

答案 4 :(得分:0)

有一次,他们带走了getenv,但接下来的版本又把它放回去了。

我曾遇到过一个问题,即新的库类名与我们创建的类的名称冲突。我们使用了“import java.whateveritwas。*”,所以我们拖入了新的类而不知道它。我忘记了类名是什么,但是任何新类都可能发生这种情况,特别是一个具有相当通用名称的类,如“List”或“Map”。

这是我记得遇到的新版本的唯一问题。

答案 5 :(得分:0)

我曾经遇到过类#getRessource()的相关问题 - 一些代码在1.4.2和1.5+下编译得很好,但是在JVM上没有工作> 1.4.2。

我还记得第三方库(某些版本的bea weblogic 8.1.4,如果我没记错的话)在Java 1.5环境中拒绝合作的一些问题,因为某些界面已被移动到不同的包(很久以前,如果细节不准确,请纠正我。)

答案 6 :(得分:0)

我最近使用迁移代码 1 遇到的最棘手问题是在OSX上使用Eclipse。问题在于Java5→6迁移,这是因为在OSX上,Java5的默认构建是32位,而Java6的唯一构建是64位。这导致了很多问题,因为SWT(Eclipse构建在其上)使用本机代码。

我知道的另一件事是您可以使用支持Web服务的各种库来解决这个问题,但我通常发现的修复程序是升级到Java6并尽可能使用系统库。这是Java6大大优于5的领域。


1 公平地说,这是前一段时间,Eclipse的新版本内置了所需的解决方法。