Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Это называется «имя введенного класса». Правило конкретно исходит от [temp.local]:
Как и обычные (не шаблонные) классы, у шаблонов классов есть имя-инъекции-класс (раздел 9) , Имя injected-class-name может использоваться как имя шаблона или имя . Когда он используется с template-argument-list , в качестве шаблона-аргумента для шаблона template-parameter или в качестве конечного идентификатора в спецификаторе специфицированного типа объявления шаблона класса друга, он относится к самому шаблону класса. В противном случае это эквивалентно имя-шаблона , за которым следуют шаблонные параметры шаблона класса, заключенного в
<>
.В рамках специализации шаблона класса или частичного специализация, когда имя injected-class-name используется как имя типа , оно эквивалентно имени шаблона , за которым следует template-arguments специализации шаблона класса или частичной специализации, заключенной в & lt;>. [Пример:
template<template<class> class T> class A { }; template<class T> class Y; template<> class Y<int> { Y* p; // meaning Y<int> Y<char>* q; // meaning Y<char> A<Y>* a; // meaning A<::Y> class B { template<class> friend class Y; // meaning ::Y }; };
-end example]
blockquote>Это в основном для удобства, так что имя класса внутри класса относится к самому классу, а не к внешнему, которое может иметь одно и то же имя. Для шаблонов классов это потенциально экономит много ввода, если у вас длинный список аргументов шаблона.
template <typename E> class Link { ... };
, да. – Barry 17 June 2015 в 12:21