Ошибка компилятора JDK - PullRequest
3 голосов
/ 01 июня 2011

Прежде чем кто-то кричит о EOL'е JDK, я хотел бы отметить, что мой вопрос , а не о том, как скомпилировать следующее.Здесь есть реальный вопрос, и дело не в том, что JDK 1.5 - EOL'ed ...

Следующее в JDK 1.5, вплоть до 1.5.0_22 (последнее, что я смог найти), создает в моей системе компиляторошибка:

private Object[] boozinga() {
    boolean b = Math.abs(42) > 0;
    Object[] res = new Object[1];
    res[0] = b ? new int[1] : new String[1];
    return res;
}

Изменение Math.abs (42)> 0 на true позволяет компилировать.

Изменение троичного "назначения"на , если / else разрешает компиляцию.

Использование JDK 1.6 позволяет компиляцию.

Поэтому мне было интересно: есть ли что-то недопустимое в приведенном выше коде под Java 1.5 иэто разрешено в Java 1.6?

Вылетает ли это для тех из вас, кто работает под Java 1.5 тоже?

Авария говорит что-то вроде этого:

Anисключение произошло в компиляторе (1.5.0_22).Пожалуйста, отправьте сообщение об ошибке в Java Developer Connection (http://java.sun.com/webapps/bugreport) после проверки парада ошибок на наличие дубликатов. Включите вашу программу и следующую диагностику в ваш отчет. Спасибо.

Я понимаю, что заполняю ошибкуОтчет по EOL'у JDK - бесполезное занятие, но я все же хотел бы знать, является ли приведенный выше код верным Java 1.5 или нет.

Ответы [ 3 ]

3 голосов
/ 11 июня 2011

Я думаю, что это законно.Доказательством тому является то, что JDK 1.6.0_21 компилирует его с параметрами -source 1.5 -target 1.5.Разве вы не можете использовать JDK 1.6 с этими опциями для компиляции и JRE 1.5 для запуска?

У меня тоже происходит сбой (JDK 1.5.0_12).Это дает сбой даже при:

public Object boozinga() {
    boolean b = true;
    Object res = b ? new int[1] : new String[1];
    return res;
}

Сложность для компилятора заключается в том, что тип b ? new int[1] : new String[1] равен java.lang.Object & java.io.Serializable & java.lang.Cloneable.

0 голосов
/ 14 июня 2011

Проблема здесь в том, что компилятор не может определить тип выражения b ? new int[1] : new String[1]. У меня было что-то подобное раньше (с 1.1.8 или 1.2, я думаю - но с реальным сообщением об ошибке, а не сбоем компилятора), а затем просто использовал приведение, чтобы помочь компилятору здесь.

 res[0] = b ? (Object)new int[1] : new String[1];

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

0 голосов
/ 01 июня 2011

Это похоже на AutoBoxing-ад.

Подумайте об использовании Boolean вместо Boolean и Integer [1] вместо int [1].

Редактировать: После поясняющего комментария, в котором говорится не о том, как исправить код, а о том, как обрабатывать ошибку компилятора, я бы предложил вместо этого попробовать с компилятором Eclipse.

Мы хотим иметь возможность строить на простой JRE (поскольку Eclipse может работать и на простой JRE), и поэтому я экспериментировал с использованием ecj35.jar в качестве компилятора. Мы были очень довольны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...