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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Параметр к функции КОЛИЧЕСТВА является выражением, которое должно быть оценено для каждой строки. Функция КОЛИЧЕСТВА возвращает количество строк, для которых выражение оценивает к ненулевому значению. (* специальное выражение, которое не оценено, оно просто возвращает количество строк.)
существует два дополнительных модификатора для выражения: ВСЕ и ОТЛИЧНЫЙ. Они определяют, удалены ли дубликаты. Так как ВСЕ - значение по умолчанию, Ваш пример совпадает с количеством (ВЕСЬ 1), что означает, что дубликаты сохраняются.
, Так как выражение "1" оценивает к непустому указателю для каждой строки, и так как Вы не удаляете дубликаты, КОЛИЧЕСТВО (1) должно всегда возвращать то же число как КОЛИЧЕСТВО (*).
Вот ссылка , который поможет ответить на Ваши вопросы. Короче говоря:
количество (*) является корректным способом записать его, и количество (1) ОПТИМИЗИРОВАНО, ЧТОБЫ БЫТЬ количеством (*) внутренне - с тех пор
, a) считают строки, где 1 не является пустым, менее эффективно, чем
, b) считают строки
Различие между количеством (*) и количеством (1) в оракуле?
количество (*) означает, что будет считать все записи т.е. каждую ячейку, НО
количество (1) означает, что добавит один псевдо столбец со значением 1 и количество возвратов всех записей
Это подобно различию между
SELECT * FROM table_name and SELECT 1 FROM table_name.
, Если Вы сделаете
SELECT 1 FROM table_name
, то оно даст Вам номер 1 для каждой строки в таблице. Так да count(*)
и count(1)
обеспечит те же результаты, как будет count(8)
или count(column_name)
Нет никакого различия.
COUNT(1)
в основном просто считает постоянную величину 1 столбцом для каждой строки. Как другие пользователи здесь сказали, это совпадает с COUNT(0)
или COUNT(42)
. Любой не - NULL
значение будет достаточен.
http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
оптимизатор Oracle действительно, по-видимому, использовал для имения ошибок в нем, которые заставили количество быть затронутым, которым столбцом Вы выбрали и было ли это в индексе, таким образом, соглашение КОЛИЧЕСТВА (1) возникло.
SELECT COUNT(1) from <table name>
должен сделать ту же самую вещь как
SELECT COUNT(*) from <table name>
, возможно, было или все еще быть некоторыми причинами, почему она работала бы лучше, чем SELECT COUNT(*)
на некоторой базе данных, но я буду полагать что ошибка в DB.
SELECT COUNT(col_name) from <table name>
однако имеет различное значение, поскольку оно считает только строки с ненулевым значением для данного столбца.
в оракуле я полагаю, что они имеют точно то же значение
В зависимости от того, кто Вы спрашиваете, некоторые люди сообщают что выполнение select count(1) from random_table;
выполнения быстрее, чем select count(*) from random_table
. Другие утверждают, что они - точно то же.
Этот ссылка заявления, что разность оборотов между этими 2 происходит из-за ПОЛНОГО СКАНИРОВАНИЯ ТАБЛИЦЫ по сравнению с ПОЛНЫМ СКАНИРОВАНИЕМ FAST.