Отсутствует ошибка Java в условном выражении? - PullRequest
3 голосов
/ 07 июня 2010

При использовании методов test1() и test2() я получаю Ошибка несоответствия типов: Невозможно преобразовать из null в int , что правильно;но почему я не получаю то же самое в методе test3()?Как в этом случае Java по-разному оценивает условное выражение?(очевидно, NullPointerException будет расти во время выполнения).Это пропущенная ошибка?

public class Test {

    public int test1(int param) {
        return null;
    }

    public int test2(int param) {
        if (param > 0)
            return param;
        return null;
    }

    public int test3(int param) {
        return (param > 0 ? param : null);
    }

}

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 07 июня 2010

Условный оператор довольно сложен, когда вы смешиваете тип операторов; это тема многих Java Puzzlers .

Вот классический пример:

System.out.println(true ? Integer.valueOf(1) : Double.valueOf(2));
// prints "1.0"!!!

А вот еще один:

System.out.println(true ? '*' : 0);     // prints "*"
int zero = 0;
System.out.println(true ? '*' : zero);  // prints "42"

И, как вы только что обнаружили:

System.out.println(true  ? 1 : null);   // prints "1"
System.out.println(false ? 1 : null);   // prints "null"

Понять все тонкости условного оператора ?: может быть довольно сложно. Лучший совет - просто не смешивать типы во втором и третьем операндах.

Следующая цитата является выдержкой из урока Java Puzzlers, Puzzle 8: Dos Equis :

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

JLS ссылки

2 голосов
/ 07 июня 2010

См. Ответ на этот вопрос.По сути, компилятор попытается автоматически распаковать нулевое значение (и сгенерирует исключение нулевого указателя).Я предполагаю, что это синтаксис, с которым у вас возникли проблемы:

public int test3(int param) { 
    return (param > 0 ? param : null); 
} 
...