Почему Java дает мне две разные ошибки в двух разных средах, хотя (простой) код одинаков? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть этот простой код:

public class Main {

    public static void main(String[] args) {

        byte a = 10, b = 20, c = a+b;

          System.out.println(a);

    }

}

Это, конечно, ошибка. Но если я скомпилирую код с помощью онлайн-редактора (такого как JDoodle), я получу такой ввод, который я ожидаю:

  error: incompatible types: possible lossy conversion from int to byte
      byte a = 10, b = 20, c = a+b;
                                ^
  1 error

В противном случае, если я скомпилирую код с Eclipse (2018-12) + JDK:

  java version "1.8.0_231"
  Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
  Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

Я получаю эту другую ошибку:

   Unresolved compilation problem: 
    Type mismatch: cannot convert from int to byte

Как это возможно? Я думаю, что первая ошибка - правильное (ожидаемое) поведение. Должен ли я думать, что есть проблема в моем JDK?

1 Ответ

1 голос
/ 11 февраля 2020

Нет конкретного сообщения об ошибке, предписанного Java Спецификацией языка. В спецификации просто говорится что-то вроде (все примеры из JLS, глава 14 , но аналогичные примеры можно найти в спецификации c):

Это ошибка времени компиляции если final появляется более одного раза как модификатор для объявления локальной переменной.

Это ошибка времени компиляции, если T имеет нулевой тип.

Это ошибка времени компиляции, если имя метки помеченного оператора используется в области действия метки как метка другого помеченного оператора.

Правило Speci c, которое генерирует ошибку вашего компилятора, содержится в JLS 15.26.1 :

Если тип правого операнда не является присваиванием, совместимым с типом переменной (§5.2), то возникает ошибка времени компиляции.

Разработчики компилятора могут свободно размещать сообщения, которые они считают полезными. Считай, что тебе повезло, что они не просто говорят: Erk!.

...