В каких случаях устаревший код Java не будет компилироваться в более новых версиях

Java стремится к обратной совместимости. (Это до такой степени, что он искалечил для этого свои дженерики).

Но есть ситуации, когда старый код не будет компилироваться в более новых версиях (что более важно, Java 5 и предстоящий Java 7)

Ответы

Ответ 1

На самом деле их довольно много - ну, не все из них приводят к ошибке компиляции, но это официальное слово от солнца: http://java.sun.com/j2se/JM_White_Paper_R6A.pdf

Обычно я использую эти проверки:

  • До 1.4 URLConnection.getInputStream выдал исключение FileNotFoundException, если тип файла был известен, а код ответа был больше или равен 400. В противном случае исключение не будет выбрано

  • HttpURLConnection.getErrorStream может использоваться для чтения страницы с ошибкой, возвращаемой с сервера. При использовании переменной 1.5, getErrorStream() всегда возвращает null.

  • На интерфейсы DOM добавлены новые методы, поэтому некоторые существующие приложения не смогут скомпилировать новые интерфейсы.

  • ErrorHandler, EntityResolver, ContentHandler и DTDHandler теперь могут быть установлены нулевыми приложениями. SAX 2.0 требовал от XML-процессора бросить java.lang.NullPointerException в этом случае. (Парсер JAXP, реализованный в версии 5.0, как и большинство реализаций, реагирует на нуль, используя настройки по умолчанию.)

  • Метод resolveEntity в подклассе DefaultHandler и EntityResolver вызывает исключение IOException и исключение SAXException. Ранее он выдавал только исключение SAXException.

  • В SAX 2.0.1 приложение может установить ErrorHandler, EntityResolver, ContentHandler или DTDHandler в значение null. Это является релаксацией предыдущего ограничения в SAX 2.0, в результате которого в таких обстоятельствах генерируется NullPointerException (NPE).

  • Начиная с версии 5.0, XSLTC является трансформатором по умолчанию, XSLTC не поддерживает все расширения, которые делает Xalan. Эти расширения не соответствуют спецификациям JAXP и XSLT.

  • В 5.0 классы org.apache переместились с 5.0 на com.sun.org.apache.package.internal, чтобы они не столкнулись с более поздними версиями классов, загруженными разработчиками.

  • Метод BigDecimal изменил свое поведение между 1.4 и 5.0, в результате чего драйверы JDBC были сбойными.

  • Начиная с 5.0, сравнение java.sql.Timestamp с java.util.Date путем вызова compareTo в Timestamp приводит к исключению ClassCastException.

  • Класс java.net.Proxy был добавлен в 5.0, создав два класса с именем Proxy: (Java.lang.reflect.Proxy, java.net.Proxy)

  • Следующие слова были добавлены к языку Java между 1.3 и 5.0, поэтому они больше не доступны для использования в качестве идентификаторов полей или методов: [assert (добавлено в 1.4), enum]

Ответ 2

Да, например, при использовании перечисления в старых jdks:

Enumeration enum = ...

будет компилироваться с помощью jdks до 1.5.

Ответ 3

Новые версии могут не "сломать" что-нибудь и все равно сделать ваш код не компилируемым.

Например, в JDK5 был добавлен метод Timer.getId(), который возвращает long.
На самом деле у нас был класс, который был подклассифицирован Thread и имел свой собственный метод getId, который возвращал строку. Это, конечно, вызвало проблемы с компиляцией, потому что внезапно мы пытались переопределить метод и изменить тип возвращаемого значения.

Ответ 4

Методы и классы могут быть помечены как устаревшие, что вызовет ошибку времени компиляции. Но вы можете сказать компилятору игнорировать его. Помимо перечисления, вы можете скомпилировать

Ответ 5

В какой-то момент они забрали getenv, но затем следующую версию они вернули.

У меня когда-то была проблема, когда новое имя класса библиотеки противоречило имени класса, который мы создали. Мы использовали "import java.whateveritwas. *", Поэтому мы перетащили новый класс, даже не зная об этом. Я забыл, что такое имя класса, но это может случиться с вами с любым новым классом, особенно с довольно общим именем типа "Список" или "Карта".

Это единственные проблемы с новыми версиями, на которые я нахожусь.

Ответ 6

У меня когда-то была проблема с Class # getRessource() - некоторый код, который скомпилирован под 1.4.2 и 1.5+, но не работал на JVM > 1.4.2.

И я помню некоторые проблемы с сторонними библиотеками (некоторые версии bea weblogic 8.1.4, если я правильно помню) отказались от сотрудничества в среде Java 1.5, потому что какой-то интерфейс был перенесен в другой пакет (он давно, исправьте меня, если детали не точны.)

Ответ 7

Самые неприятные проблемы, с которыми я недавно сталкивался, 1 с мигрирующим кодом, были с Eclipse на OSX. Проблема заключалась в миграции Java5 → 6 и была связана с тем, что по OSX стандартная сборка Java5 была 32-битной, а единственная сборка Java6 была 64-разрядной. Это вызвало множество проблем, поскольку SWT (на котором построено Eclipse) использует собственный код.

Другая вещь, о которой я знаю, - это путаница, с которой вы можете столкнуться с различными библиотеками, которые поддерживают веб-службы, но исправление, которое я обычно обнаружил, заключается в том, чтобы перейти на Java6 и использовать, по возможности, системные библиотеки. Это область, где Java6 был значительно лучше, чем 5.


1 Чтобы быть справедливым, это было давно, а новые сборки Eclipse поставляются с необходимыми обходными решениями.