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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
в жемчуге:
`$0`
На самом деле, это будет работать с любой оболочкой, которая поддерживает синтаксис команды одинарной левой кавычки и хранит его собственное имя в $0
Я пытался сделать это в Erlang:
c(N)->c(N+1)+c(N-1).
c(0).
двойной вызов себя заставляет использование памяти повыситься O(n^2)
, а не O(n)
.
Однако интерпретатору Erlang, кажется, не удается отказать.
JavaScript:
function i(){ i(); }
i();
<час> C++ Используя указатель функции:
int main(){
int (*f)() = &main;
f();
}
C#, сделанный в 20 символах (exclusing пробел):
int s(){
return s();
}
int main(){
int a = 20;
return main();
}
C++ :
int overflow(int n)
{
return overflow(1);
}
Другой в JavaScript:
(function() { arguments.callee() })()
В ответ на Y combinator комментарий, я мог бы также через в Y-combinator в ЛЫЖНОМ исчислении:
S (K (S I I)) (S (S (K S) K) (K (S I I)))
нет никаких ЛЫЖНЫХ интерпретаторов, о которых я знаю, но я однажды записал графический приблизительно за час в actionscript. Я был бы готов отправить, если существует интерес (хотя я никогда не добирался, расположение, работающее очень эффективно)
, читает все об этом здесь: http://en.wikipedia.org/wiki/SKI_combinator_calculus
В Haskell
fix (1+)
Это пытается найти точку фиксации (1 +) функция (λ n → n + 1
). Реализация фиксации
fix f = (let x = f(x) in x)
, Таким образом
fix (1+)
становится
(1+) ((1+) ((1+) ...))
Примечание что
fix (+1)
просто циклы.
Переполнение CMD в одной строке
echo @call b.cmd > b.cmd & b
У меня есть список их в , Бесконечный цикл на E2 - видит просто тех обозначенных как "Переполнение стека" в заголовке.
я думаю самое короткое, там
[dx]dx
в dc. Может быть более короткое решение в Ложь .
РЕДАКТИРОВАНИЕ: По-видимому, это не работает... По крайней мере, на GNU dc. Возможно, это было на версии BSD.
Ложь:
[1] [1] #
(Ложь является языком стека: # является некоторое время циклом, который берет 2 закрытия, условное выражение и тело. Тело является тем, которое вызывает переполнение).
Короткое решение в K& R C, мог быть скомпилирован:
main(){main()}
14 байтов
Vb6
Public Property Let x(ByVal y As Long)
x = y
End Property
Private Sub Class_Initialize()
x = 0
End Sub
Java (завершают содержание X.java):
class X {
public static void main(String[] args) {
main(null);
}}
Рассмотрение всего синтаксического сахара, я задаюсь вопросом, может ли немного короче быть сделан в Java. Кто-либо?
РЕДАКТИРОВАНИЕ: ой, я отсутствовал уже существует почти идентичное отправленное решение.
РЕДАКТИРОВАНИЕ 2: я сказал бы, что этот - (мудрый символ) самое короткое
class X{public static void main(String[]a){main(null);}}
РЕДАКТИРОВАНИЕ 3: Благодаря Anders для указания на пустой указатель не оптимальный аргумент, таким образом, это короче, чтобы сделать:
class X{public static void main(String[]a){main(a);}}
Вот другой ответ Ruby, эти лямбды использования:
(a=lambda{a.call}).call
не будет самым коротким, но я должен был попробовать что-то... Строка C#
[] f = новая строка [0]; Основной (f);
бит короче
static void Main(){Main();}
$f PowerShell
= {& $f}; & $f
"Сценарий перестал работать должный назвать переполнение глубины. Глубина вызова достигла 1001, и максимум 1000".
TCL:
proc a {} a
у меня нет tclsh интерпретатора, который может сделать хвостовую рекурсию, но это могло бы одурачить такую вещь:
proc a {} "a;a"
В ассемблере (x86 процессоры, режим на 16 или 32 бита):
call $
, который генерирует:
в режиме на 32 бита: 0xe8; 0xfb; 0xff; 0xff; 0xff
в режиме на 16 битов: 0xe8; 0xfd; 0xff
в C/C++:
int main( ) {
return main( );
}
so.c в 15 символов :
main(){main();}
Результат:
antti@blah:~$ gcc so.c -o so
antti@blah:~$ ./so
Segmentation fault (core dumped)
Редактирование : Хорошо, это дает предупреждения с - Стена и не вызывает переполнение стека с-O2. Но это работает!
Решение для сценария оболочки в 10 символов включая новые строки:
ну, технически не переполнение стека, но логически так, если Вы рассматриваете порождение нового процесса как построение нового стекового фрейма.
#!sh
./so
Результат:
antti@blah:~$ ./so
[disconnected]
Возгласы.Примечание: не пробуют это дома
JavaSript:
Huppies отвечают на одну строку:
(function i(){ i(); })()
То же количество символов, но никакая новая строка:)
Уже был жемчуг один, но это - пара символов короче (9 по сравнению с 12) - и это не рекурсивно вызывает:)
с//* _ = 0/e
Завершите программу Дельфи.
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;
begin
raise EStackOverflow.Create('Stack Overflow');
end.
Лучшее решение lua:
function c()c()end;
Вставьте это в SciTE или интерактивную командную строку, а затем назови это. Бум!
GNU make:
Создайте файл с именем «Makefile» со следующим содержимым:
a:
make
Затем запустите make:
$ make
Обратите внимание, что для смещения слова «make» необходимо использовать символ табуляции. Этот файл состоит из 9 символов, включая 2 символа конца строки и 1 символ табуляции.
Я полагаю, вы могли бы сделать то же самое с bash, но это, вероятно, слишком просто, чтобы быть интересным:
Создайте имя файла «b» и отметьте его как исполняемый (chmod + xb):
b ## ties the winning entry with only one character (does not require end-of-line)
Теперь запустите файл with
$ ( PATH=$PATH:. ; b )
Трудно сказать, приводит ли этот подход технически к переполнению стека, но он создает стек, который будет расти до тех пор, пока на машине не закончатся ресурсы. Самое интересное в том, чтобы сделать это с помощью GNU make, это то, что вы можете наблюдать, как он выводит информацию о статусе по мере сборки и уничтожения стека (при условии, что вы нажали ^ C в какой-то момент до того, как произойдет сбой).