Strange NullPointerException из условного оператора [дубликат]

Проблема связана с тем, что тильда находится в двойных кавычках.

Чтобы ее расширить, вам нужно поставить тильду вне кавычек:

if [ -d ~/".git" ]; then   # note tilde outside double quotes!
   echo "Do stuff"
fi

Или, альтернативно, как указано в комментарии hek2mgl, используйте $HOME вместо ~:

if [ -d "$HOME/.git" ]

Из POSIX в Расширение Тильды :

«Тильда-префикс» состоит из некотируемого символа в начале слова, за которым следуют все символы, предшествующие первому, не указанному в слове, или все символы в слове, если их нет.

Из POSIX в Двойные кавычки :

Вложения символов в двойных кавычках ("") сохраняют буквальное значение всех символов в двойном -quotes, за исключением символов доллара, обратного кавычки и обратной косой черты, следующим образом:

Вы можете найти дополнительные объяснения в . Почему тильда (~) не расширяется внутри двойных кавычек? из Unix & amp; Linux Stack.

13
задан Markus A. 6 October 2012 в 22:38
поделиться

3 ответа

Согласно JLS : -

Тип условного выражения определяется следующим образом:

  • Если второй и третьи операнды имеют один и тот же тип (который может быть нулевым типом), то это тип условного выражения.
  • Если один из второго и третьего операндов имеет примитивный тип T, а тип другой - результат применения преобразования бокса (п. 5.1.7) в Т, тогда тип условного выражения равен T.
14
ответ дан Rohit Jain 26 August 2018 в 12:08
поделиться

Так оно и должно работать. Тернарный оператор не означает эквивалент регулярного оператора if. Телами if и else являются утверждения , а части, следующие за ? и :, являются выражениями , которые должны оцениваться одним и тем же типом .

Иными словами: a = b ? c : d не должен быть эквивалентен if (b) a = c; else a = d;. Вместо этого b ? c : d является выражением само по себе, а присвоение его результата a не повлияет на результат.

2
ответ дан Aasmund Eldhuset 26 August 2018 в 12:08
поделиться

Проблема заключается в том, что:

Integer number = (condition) ? getNumber() : 0;

Заставляет распаковать и переустанавливать результат getNumber (). Это связано с тем, что ложная часть тройки (0) является целым числом, поэтому она пытается преобразовать результат getNumber () в int. В то время как следующее не делает:

Integer number = (condition) ? getNumber() : (Integer) 0;

Это не ошибка, просто то, как Java решила что-то делать.

11
ответ дан CrazyCasta 26 August 2018 в 12:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: