Другое событие 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));
}
Мое эмпирическое правило:
указатели Использования, если Вы хотите сделать адресную арифметику с указателями с ними (например, постепенное увеличение адреса указателя для продвижения через массив) или если когда-нибудь необходимо передавать Нулевого указателя.
ссылки Использования иначе.
Я действительно думаю, что Вы извлечете выгоду из установления следующих инструкций по кодированию вызова функции:
Как во всех других местах, всегда быть const
- корректен.
const
спецификатор. Только передают значение указателем, если значение 0/АННУЛИРОВАТЬ является допустимым входом в текущем контексте.
Объяснение 1: Как [1 128] вызывающая сторона , Вы видите, что независимо от того, что Вы передаете в , должен быть в применимом состоянии.
Объяснение 2: Как [1 129] названный , Вы знаете, что то независимо от того, что прибывает в , в применимом состоянии. Следовательно, никакая ПУСТАЯ проверка или обработка ошибок не должны быть сделаны для того значения.
Объяснение 3: Объяснения 1 и 2 будут , компилятор осуществил . Всегда фиксируйте ошибки во время компиляции, если Вы можете.
, Если аргумент функции является-значением, то передайте его ссылкой.
Выбирают "pass by value" по "передаче ссылкой константы", только если значение является POD ( Простой Datastructure) или достаточно маленький (мудрый памятью) или другими способами, достаточно дешевыми (мудрый временем) для копирования.
Это в конечном счете заканчивает тем, что было субъективно. Обсуждение к настоящему времени полезно, но я не думаю, что существует корректный или решающий ответ на это. Много будет зависеть от инструкций по стилю и Ваших потребностей в то время.
, В то время как существуют некоторые различные возможности (действительно ли что-то может быть ПУСТЫМ) с указателем, самым большим практическим различием для выходного параметра является просто синтаксис. Руководство по стилю C++ Google ( https://google.github.io/styleguide/cppguide.html#Reference_Arguments), например, передает под мандат только указатели для выходных параметров и позволяет только ссылки, которые являются константой. Обоснование является одной из удобочитаемости: что-то с синтаксисом значения не должно иметь указателя семантическое значение. Я не предполагаю, что это обязательно правильно или неправильно, но я думаю, что точка здесь - то, что это - вопрос стиля, не правильности.
Необходимо передать указатель, если Вы собираетесь изменить значение переменной. Даже при том, что технически передача ссылки или указателя является тем же, передавание указателя в Вашем варианте использования более читаемо, поскольку это "рекламирует" то, что значение будет изменено функцией.
Если у Вас есть параметр, где Вы, возможно, должны указать на отсутствие значения, это - обычная практика, чтобы сделать параметр значением указателя и передать в ПУСТОМ УКАЗАТЕЛЕ.
А лучшее решение в большинстве случаев (с точки зрения безопасности) состоит в том, чтобы использовать повышение:: дополнительный . Это позволяет Вам передавать в дополнительных значениях ссылкой и также как возвращаемое значение.
// Sample method using optional as input parameter
void PrintOptional(const boost::optional<std::string>& optional_str)
{
if (optional_str)
{
cout << *optional_str << std::endl;
}
else
{
cout << "(no string)" << std::endl;
}
}
// Sample method using optional as return value
boost::optional<int> ReturnOptional(bool return_nothing)
{
if (return_nothing)
{
return boost::optional<int>();
}
return boost::optional<int>(42);
}
Ссылка является неявным указателем. В основном можно изменить значение контрольные точки на, но Вы не можете изменить ссылку для указания на что-то еще. Так мои 2 цента то, что, если Вы только хотите измениться, значение параметра передает его как ссылку, но если необходимо изменить параметр для указания на различную объектную передачу на него с помощью указателя.
Считайте C# ключевым словом. Компилятор требует, чтобы вызывающая сторона метода подала заявку ключевое слово любому args, даже при том, что это уже знает, ли они. Это предназначается для улучшения удобочитаемости. Хотя с современными IDE я склонен думать, что это - задание для синтаксиса (или семантический) выделение.
Передача ссылкой константы, если нет причина, Вы хотите измениться/сохранить содержание, в котором Вы являетесь передающими.
Это будет наиболее эффективным методом в большинстве случаев.
Удостоверяются, что Вы используете константу на каждом параметре, который Вы не хотите изменять, поскольку это не только защищает Вас от выполнения чего-то глупого в функции, это дает хороший признак другим пользователям, что функция делает к переданному в значениях. Это включает создание константы указателя, когда Вы только хотите изменить то, на что указывают...