Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. =: = тесты, если два контейнера (переменные или объекты массивов или хешей) искажаются, т.е. если Вы изменяетесь, делает другое изменение также?
my $x;
my @a = 1, 2, 3;
# $x =:= @a[0] is false
$x := @a[0];
# now $x == 1, and $x =:= @a[0] is true
$x = 4;
# now @a is 4, 2, 3
Что касается других: === тестирует, если две ссылки указывают на тот же объект, и тесты eqv, если две вещи структурно эквивалентны. Так [1, 2, 3] === [1, 2, 3]
будет ложь (не тот же массив), но [1, 2, 3] eqv [1, 2, 3]
будет верно (та же структура).
leg
сравнивает строки как Perl 5 cmp
, в то время как Perl 6 cmp
более умен и сравнит числа как <=>
и строки как leg
.
13 leg 4 # -1, because 1 is smaller than 4, and leg converts to string
13 cmp 4 # +1, because both are numbers, so use numeric comparison.
Наконец ~~
"умное соответствие", оно отвечает на вопрос, "делает $x
соответствие $y
". Если $y
тип, это - проверка типа. Если $y
regex, это - соответствие regex - и так далее.
Делает сводку в [1 112] Резюме 3: семантика Сравнения делает то, что Вы хотите, или Вы уже читали это? Документы дизайна связываются с тестовыми файлами, где те функции используются, таким образом, Вы видите примеры их использования и их текущего тестового состояния.
Perl 6 операторы сравнения намного больше подходят для динамического языка и всех вещей, продолжающихся. Вместо того, чтобы просто сравнить строки или числа (или превратить вещи в строки или числа), теперь можно протестировать вещи точно с оператором, который делает то, что Вы хотите. Можно протестировать значение, контейнер, тип, и так далее.
В одном из комментариев, Вы спрашиваете [приблизительно 110] и cmp
. В былые времена Perl 5, cmp
был там для сортировки и возвращает одно из трех волшебных значений (-1,0,1), и это делало это со строковой семантикой всегда. В Perl 6, cmp
возвраты один из трех типов Order
объекты, таким образом, Вы не должны помнить что-1, 0, или 1 средство. Кроме того, новое cmp
не вызывает строковую семантику, таким образом, это может быть более умно, когда направленные числа (в отличие от Perl 5, который отсортировал бы как 1, 10, 11, 2, 20, 21...).
leg
( эс l , чем, квалификация e , greater, чем) cmp
со строковой семантикой. Это определяется как Perl 6 ~$a cmp ~$b
, где ~
новая "строка contextualizer", который вызывает строковую семантику. С [1 110], Вы всегда делаете сравнение строк, точно так же, как старый Perl 5 cmp
.
, Если у Вас все еще есть вопросы на других операторах, давайте разломаем их, на разделяют вопросы.:)