В общем...как обычно, в начале и процессе решения задач чувствуешь себя абсолютным недоумком и идиотом а когда приходишь к решению...чувствуешь как к тебе возвращается сила)))
Пока искал инфо в инете, наткнулся на интересную статейку про null, короч это еще та заноза в *опе java)
https://tproger.ru/articles/9-things-about-null-in-java/
Мало ли кому будет интересно)
Как я понимаю, логика тут у компилятора такая:
Тернарник должен иметь все значения внутри себя одинакового типа.
Он смотрит на правую часть:
1) 200 : null - тут int и null, к чему их привести? К int null привести нельзя, зато оба можно к Integer
Отлично, с правой частью все решили, теперь левую:
2) 100 : Integer - (сразу написал Integer из пункта 1, чтобы было нагляднее) У нас int и Integer, по правилам Java в такой ситуации их нужно привести к примитиву int
Теперь у нас все значения в тернарнике имеют тип int, который будет преобразован к Integer, чтобы его можно было вернуть. Приведение к примитиву int происходит при вызове метода intValue() у объекта. Все бы ничего, так как в ситуации 100 : Integer. У Integer есть такой метод, но если вспомнить, что в части Integer у нас лежит null, то становится ясна проблема: нельзя написать null.intValue(). А компилятор именно это и делает
Ну и подсказка для решения:
Нам нужно избавить компилятор от необходимости приводить что-то к int
Ну грубо говоря, у нас есть условия в тернарном, идем с конца
200 и null, здесь приведется к Integer, идём обратно
здесь: 100 и Integer, в предыдущих лекциях объясняли когда у нас int и integer то перед сравнением приведется к примитиву int.
Получается у нас тернарный оператор вернет тип данных int, значение null, что и вызывает NullPointerException.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
*опеjava) https://tproger.ru/articles/9-things-about-null-in-java/ Мало ли кому будет интересно)Вторая задачаКак я понимаю, логика тут у компилятора такая: Тернарник должен иметь все значения внутри себя одинакового типа. Он смотрит на правую часть: 1) 200 : null - тут int и null, к чему их привести? К int null привести нельзя, зато оба можно к Integer Отлично, с правой частью все решили, теперь левую: 2) 100 : Integer - (сразу написал Integer из пункта 1, чтобы было нагляднее) У нас int и Integer, по правилам Java в такой ситуации их нужно привести к примитиву int Теперь у нас все значения в тернарнике имеют тип int, который будет преобразован к Integer, чтобы его можно было вернуть. Приведение к примитиву int происходит при вызове метода intValue() у объекта. Все бы ничего, так как в ситуации 100 : Integer. У Integer есть такой метод, но если вспомнить, что в части Integer у нас лежит null, то становится ясна проблема: нельзя написать null.intValue(). А компилятор именно это и делает Ну и подсказка для решения: Нам нужно избавить компилятор от необходимости приводить что-то к int