требуется объяснение: троичный оператор в Java - PullRequest
2 голосов
/ 19 сентября 2011

Строка, о которой идет речь, return pFile.exists() ? true : null;.Поскольку это не вызывает каких-либо ошибок компиляции, что является объяснением этого.В итоге поднялось NPE.

import java.io.File;
public class Main {
  public static void main(String... args) {
    boolean accept = accept(new File(""));
    System.out.println("accept = " + accept);
  }
  public static boolean accept(File pFile) {
    System.out.println(pFile.exists()); // prints: false, so pFile is not null
    return pFile.exists() ? true : null; //this line should throw compilation error
  }
}

pFile не null;File создается, как вы можете видеть.Но, очевидно, файла там нет.Вопрос не о pFile.Меня интересует, как оператор справляется с null.

Ответы [ 3 ]

7 голосов
/ 19 сентября 2011

Ваш код эквивалентен:

public static boolean accept(File pFile) {
    System.out.println(pFile.exists()); // prints: false, so pFile is not null
    Boolean tmp = pFile.exists() ? true : null;
    return (boolean) tmp;
}

Другими словами, в этом случае тип условного оператора равен Boolean, а затем значение распаковывается, чтобы вернуть boolean.Когда null распакован, вы получаете исключение.

Из раздела 15.25 Спецификации языка Java:

В противном случае второй и третий операндытипов S1 и S2 соответственно.Пусть T1 будет типом, который следует из применения преобразования бокса в S1, и пусть T2 будет типом, который следует из применения преобразования бокса в S2.Тип условного выражения является результатом применения преобразования захвата (§5.1.10) к lub (T1, T2) (§15.12.2.7).

Я полагаю, что это применимо здесь, хотя я допускаю, что это не так ясно, как могло бы быть.

2 голосов
/ 19 сентября 2011

Вы возвращаете Boolean null из функции, определенной как возвращающая boolean (примитивный тип; примечание маленькое b).Значение null автоматически распаковывается и вызывает NPE.

0 голосов
/ 19 сентября 2011

На самом деле, пустая строка используется для создания file. В результате получается пустой abstract pathname без префикса (или каталога) и пустой последовательности имен. Таким образом, Windows не может создать file. Это в свою очередь бросает NPE

...