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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Причина, по которой вы не получаете точное значение a
, состоит в том, что R хранит его как double вместо целого. Поскольку a
очень велика, существует некоторое округление, когда вы назначаете a
.
Обычно для хранения вещей в виде целых чисел вы должны использовать L
в конце чисел; что-то вроде:
a <- 12L
class(a)
# [1] "integer"
Однако ваш номер слишком велик для стандартного целого числа в R, и вы вынуждены использовать двойное представление:
a <- 123456789123456789123456789L
# Warning message:
# non-integer value 123456789123456789123456789L qualified with L; using numeric value
class(a)
# [1] "numeric"
Вам понадобится многократная точность, чтобы точно хранить целое число, такое большое. Одним из вариантов был бы пакет gmp
:
library(gmp)
a<-as.bigz("123456789123456789123456789")
a
# Big Integer ('bigz') :
# [1] 123456789123456789123456789
Другие варианты арифметики с несколькими точками доступны в подзаголовке «Многоточечная арифметическая и символьная математика» в задаче CRAN для численной математики вид .
prod(as.bigz(c(2, 3, 7, 43, 1807, 3263443)))
– josliber♦ 3 September 2015 в 06:58