Другое событие 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));
}
В PHP 5 вещи, покрытые E_STRICT
, не покрыты E_ALL
, так для получения большей части информации, необходимо объединить их:
error_reporting(E_ALL | E_STRICT);
В PHP 5.4, E_STRICT
будет включен в E_ALL
, таким образом, можно использовать всего E_ALL
.
можно также использовать
error_reporting(-1);
, который будет всегда включать весь ошибки. Который более семантически корректен как:
error_reporting(~0);
Используйте следующее в php.ini:
error_reporting = E_ALL | E_STRICT
Также необходимо установить Xdebug, он может выделить ошибки в ослеплении ярких цветов и распечатать полезную подробную информацию.
Никогда не позволяют никакой ошибке или уведомлению в Вашем коде, даже если это безопасно.
По-моему, чем выше Вы устанавливаете уровень сообщения об ошибке в этапе разработки, тем лучше.
В продуктивной среде, Вы хотите немного (но незначительно) уменьшенный набор, но Вы хотите их, зарегистрировался где-нибудь, что они не могут быть замечены пользователем (я предпочитаю syslog
).
http://php.net/error_reporting
E_ALL | E_STRICT
для разработки с PHP прежде 5.2.0.
5.2 представляет E_RECOVERABLE_ERROR
, и 5.3 представляет E_DEPRECATED
и E_USER_DEPRECATED
. Вы, вероятно, захотите включить тех при выполнении одной из тех версий.
, Если Вы хотели использовать магические числа, Вы могли бы просто установить эти error_reporting
, значение к некоторому довольно высокому значению 2^n-1
- говорит, 16777215
, и который действительно просто включил бы все биты между 1..n
. Но я не думаю с помощью магических чисел, хорошая идея...
, По-моему, PHP допустил ошибку немного при наличии E_ALL
не действительно быть всеми. Но по-видимому это будет фиксированным в PHP 6...
В более новых версиях PHP E_ALL включает больше классов ошибок. Начиная с PHP 5.3 E_ALL включает все кроме E_STRICT. В PHP 6 это будет alledgedly включать даже это. Это - хорошая подсказка: лучше видеть больше сообщений об ошибках, а не меньше.
то, Что включено в E_ALL, документируется в , PHP предопределил константы страница в руководстве онлайн.
Лично, я думаю, что все так очень при использовании E_STRICT. Не имеет значения это, конечно, не причинит Вам боль, тем более, что это может препятствовать тому, чтобы Вы писали сценарии, которые имеют маленький шанс получения прерванного будущие версии PHP. С другой стороны, в некоторых случаях строгие сообщения могут быть слишком шумными, возможно, особенно, если Вы спешите. Я предлагаю, чтобы Вы включили его по умолчанию и выключили его, когда это становится раздражающим.
В зависимости от Ваших планов долговременной поддержки относительно этого кода, отлаживающего с E_STRICT
, включил, может помочь Вашему коду продолжить работать в далеком будущем, но это - вероятно, излишество для ежедневного использования. Существует две важных вещи [приблизительно 111] для учета:
E_STRICT
ошибки сгенерированы во время компиляции, не время выполнения. При увеличении ошибочного уровня до E_ALL
в коде (а не через [1 110] php.ini ), Вы никогда не можете видеть E_STRICT
ошибки так или иначе. E_STRICT
содержится в E_ALL
под PHP 6, но не под PHP 5. Если Вы обновите свой сервер до PHP6 и иметь E_ALL
настроенный, как описано в № 1 выше, Вы начнете видеть E_STRICT
ошибки, не требуя никаких дополнительных изменений с Вашей стороны. ini_set ("display_errors", "2"); ERROR_REPORTING (E_ALL);
Не строго говоря error_reporting, я настоятельно рекомендовал бы использовать любой IDE, который автоматически показывает ошибки анализа и общие незначительные сбои (например, присвоение в условии).
Studio зенда для Eclipse включили эту функцию по умолчанию, и так как я начал использовать его, это помогало мне много при фиксации ошибок, прежде чем они произойдут.
Например, у меня была эта часть кода, где я кэшировал некоторые данные в $GLOBALS
переменная, но я непреднамеренно записал $_GLOBALS
вместо этого. Данные никогда не кэшировались, и я, никогда не буду не знал, не сказал ли Пехлеви мне: "Эй, это $_GLOBALS
штука появляется только однажды, который мог бы быть ошибкой".