NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Удостоверьтесь, что деструкторы определяются как виртуальный :
class GoodClass {
public:
GoodClass();
virtual ~GoodClass()
};
class BadClass {
public:
BadClass();
~BadClass()
};
Вид функционирует в объявлениях класса и определениях по имени. Это помогает определить местоположение их в .cpp файле. Кроме того, это освобождает Ваш ум, потому что Вы не должны думать о том, куда поместить Вашу новую функцию.
Я думаю, что кодирующий стандартный документ не является решением этой проблемы. Решение состоит в том, чтобы заставить Вашу работу изучать/заботиться о человеческой стороне кодирования - "кодируют для людей сначала и компьютеров в последний раз".
, Очевидно, не возможно просто уволить тех, которые не заботятся - но стандартный документ не собирается помогать им очень, также.
Лучшие стандарты - те, которые являются маленькими и плотно сфокусированные на том, что действительно имеет значение для создания качественного кода. Они не пытаются преподавать кодирование, они не пытаются пробиться кодирования. Они обычно придерживаются функций непротиворечивости и субъективных обзоров (например, если остальная часть Вашей команды думает, что часть кода читаема, соответствует правилам непротиворечивости и прокомментирована, то ее всегда попытка быть хорошим кодом)
Так, чтобы повторно подчеркнуть: непротиворечивость - соглашение о присвоении имен, пробельное управление, комментируя блоки, структуру каталогов. Ничто иное действительно вопросы
Редактирование для Dustin: большая проблема со стандартами идет с исключениями. Если у Вас есть стандарт, в котором говорится "1 оператор на строку", Вы не можете записать следующий искусственный пример:
SetColText(1,"col1"); SetColWidth(1, 10);
SetColText(2,"col1"); SetColWidth(2, 10);
...
SetColText(9,"col1"); SetColWidth(9, 10);
, Но я сказал бы, что это было более читаемым, и поэтому менее подверженным ошибкам что разделение их. (Я уверен, что можно придумать лучшие примеры).
Это - моя точка - говорящие люди, как написать код, и как отформатировать, это к строгим правилам всегда собирается упасть способами и местами, которые Вы не ожидали. Так намного лучше для доверия кодерам, чтобы сделать его правильно после осуществления нескольких правил. Если у них будет несколько правил следовать, то они напишут хороший, дисциплинированный код, таким образом, Вам не будет нужна остальная часть дрянных правил.
Вы видите некоторые стандарты, которые продолжаются для страниц и страниц. (Philips C# каждый - 48 fecking страниц долго!)
Так, учитывая, что у Вас есть команда качественных кодеров, что необходимо сделать, чтобы помочь работать с их кодом? ответ всегда является непротиворечивостью того, 'куда' они помещают код, не, как они пишут это. например, у Вас всегда есть мусорное ведро, и obj каталог в Вашем проекте является хорошим стандартом. Можно забрать любой проект и знать, где вещи.. в отличие от кого-то создающего все его двоичные файлы в его c:/mybin каталоге, потому что его более легкое для него.
Я предлагаю просто требовать, чтобы разработчики считали набор инструкций, и эффективный C++ и более эффективные книги C++ Meyers.
, Если Вы хотите легкий вес, Вы оказываетесь перед необходимостью полагаться на здравый смысл и общий идеал.
обзоры Кода помогают осуществить это также.
Для хранения этого легким я избежал бы полиции документа и кода. Похвалите хороший код публично.
РЕДАКТИРОВАНИЕ - я запустил с комментария здесь, но помещу его в ответ для простоты просмотра:
обзоры, сделанные правильно, сделают чудеса - но Вы не можете позволить сообщать об иерархиях в обзор, и никакая статистика с именами людей не может быть на результатах обзора.
Удостоверяются, что сохранили документ маленьким и убедились привести ПРИЧИНЫ для "правила" / инструкция. Без этого затем Вы один просто требовательное слепое повиновение. С объяснением и причинами Вы обучаете так, чтобы на самом деле регистрация/запись "правила" стала ненужной. (поскольку понятие будет усвоено)
Никакие вкладки (позволяет лучшее использование внешних/других инструментов), и фиксированные пробелы, вставленные для вкладок.
, Если необходимо использовать целый тип, выбрать один и сохранить его. Это избежит проблем, связанных со смешиванием коротких, международных, долго, и т.д. типы.
// BAD
int i ;
long j ;
short k ;
// GOOD (if you choose the "int" as integer)
int i ;
int j ;
int k ;
то же идет для реальных типов: Выберите один (например, дважды) и не используйте другого.
И т.д.
Примечание: существует все еще проблема со знаком/неподписанных, которых нельзя всегда избегать, и факт использование STL его собственные целые типы (т.е. станд.:: вектор:: size_type), но весь остающийся код не должен, смешиваясь.
Примечание 2: Вы могли использовать определение типа для "выбирания" предпочтенного типа для целых чисел со знаком и вещественных чисел. Это включило бы недорогое изменение в случае необходимости.
, Как это ясно упрощает более безопасный код, который минимизирует риск загадочных ошибок, который увеличивает пригодность для обслуживания и т.д.?
Некоторые ошибки создаются путем сравнения неподписанного типа с типами со знаком, таинственной потерей точности или целым числом под/переполнять.
Компиляторы обычно отправляют предупреждения во время компиляции, но затем, обычно ответ должен "выбросить" предупреждение, которое может помочь скрыть ошибку.
постамент сделал полезный комментарий, я скопирую вставку здесь:
записавший много кода, который должен взаимодействовать с вещами на аппаратном уровне, я не могу свидетельствовать в пользу этой инструкции. Для этого уровня работы я предпочитаю, чтобы целочисленные типы были абстрагированы к именам, которые включают точность (т.е., int16, uint16, int32, uint32, и т.д.) †“постамент 18 августа в 20:50
, постамент является правильным, конечно. Иногда необходимо иметь дело с int16, uint8 и другие "точно определенные" типы.
Это не делает недействительным сообщение выше, только завершает его.
источник ошибки смешивает различные типы (преобразовывающий неподписанный символ в интервал, например), таким образом, этого вида смешивания нужно избежать. Следующие правила таким образом применяются:
Ниже пример кода, который повредился бы:
void * doAllocate(uint32 i)
{
// try to allocate an array of "i" integers and returns it
}
void doSomething()
{
uint32 i0 = 225 ;
int8 i1 = 225 ; // Oops...
doAllocate(i0) ; // This will try to allocate 255 integers
doAllocate(i1) ; // This will TRY TO allocate 4294967265
// integers, NOT 225
}