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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Все эти ответы и никакой Befunge? Я держал бы пари на изрядное количество, это - самое короткое решение их всех:
1
Не ребячество. Попробуйте его сами: http://www.quirkster.com/iano/js/befunge.html
РЕДАКТИРОВАНИЕ: Я предполагаю, что должен объяснить этого. 1 операнд продвигает 1 на внутренний стек Befunge, и отсутствие чего-либо еще помещает его в цикл по правилам языка.
Используя интерпретатор, если, Вы будете в конечном счете - и я имею в виду в конечном счете - поражает точку, где массив JavaScript, который представляет стек Befunge, становится слишком большим для браузера для перераспределения. Если бы у Вас был простой интерпретатор Befunge с меньшим и ограниченным стеком - как имеет место с большинством языков ниже - то эта программа вызвала бы более значимое переполнение быстрее.
3 байта:
label:
pusha
jmp label
Обновление
Согласно (старая?) Документация Intel (?) , это - также 3 байта:
label:
call label
Java
Немного более короткая версия решения для Java.
class X{public static void main(String[]a){main(a);}}
Вот является другой интересным из Схемы:
((lambda (x) (x x)) (lambda (x) (x x)))
Я выбираю “best answer” после этого сообщения. Но сначала, я хотел бы подтвердить некоторые очень исходные вклады:
, Хотя я люблю вышеупомянутое, проблема, о выполнении гольфа кода, и быть справедливым респондентам, я должен присудить “best answer” самому короткому коду, который является записью Befunge; я не полагаю, что кто-либо будет в состоянии разбить это (хотя Konrad, конечно, попробовал), так поздравляю Patrick!
Наблюдение большого количества stack-overflow-by-recursion решений, я удивлен, что никто не имеет (с текущей записи), поднял Y combinator (см. эссе Dick Gabriel, Почему из Y, для краткой информации). У меня есть рекурсивное решение, которое использует Y combinator, а также f aku (f (x)) подход.:-)
((Y (lambda (f) (lambda (x) (f (f x))))) #f)
Python :
so=lambda:so();so()
, Кроме того:
def so():so()
so()
И если Python оптимизировал последние вызовы...:
o=lambda:map(o,o());o()
C - Это не является самым коротким, но это без рекурсий. Это также не портативно: это отказывает на Солярисе, но некоторый alloca () реализации мог бы возвратить ошибку сюда (или назвать malloc ()). Вызов к printf () необходим.
#include <stdio.h>
#include <alloca.h>
#include <sys/resource.h>
int main(int argc, char *argv[]) {
struct rlimit rl = {0};
getrlimit(RLIMIT_STACK, &rl);
(void) alloca(rl.rlim_cur);
printf("Goodbye, world\n");
return 0;
}
попытайтесь поместить больше чем 4 пирожка на единственный бургер. переполнение стека.
Person JeffAtwood;
Person JoelSpolsky;
JeffAtwood.TalkTo(JoelSpolsky);
Здесь не надеется ни на какую хвостовую рекурсию!
Groovy:
main()
$ отличный stack.groovy:
Caught: java.lang.StackOverflowError
at stack.main(stack.groovy)
at stack.run(stack.groovy:1)
...
Используя пакетный файл Окна, названный "s.bat":
call s
Javascript
, Чтобы обрезать еще несколько символов и вышибить нас из большего количества магазинов программного обеспечения, давайте пойдем с:
eval(i='eval(i)');
Я любил "кучу" ответа Cody, таким образом, вот мой подобный вклад в C++:
template <int i>
class Overflow {
typedef typename Overflow<i + 1>::type type;
};
typedef Overflow<0>::type Kaboom;
Не запись гольфа кода каким-либо образом, но тем не менее, что-либо для meta переполнения стека!:-P
Вот мой вклад C, взвешивающийся в 18 символах:
void o(){o();o();}
Это , партия тяжелее к последнему вызову оптимизирует!:-P
Как насчет следующего в ОСНОВНОМ:
10 GOSUB 10
(у меня нет ОСНОВНОГО интерпретатора, я боюсь, таким образом, это - предположение).
Другой пример PHP:
<?
require(__FILE__);
На английском языке:
recursion = n. See recursion.
Ассемблер Z-80 - в ячейке памяти 0x0000:
rst 00
один байт - 0xC7 - бесконечный цикл продвижения текущего ПК к стеку и переходу для обращения к 0x0000.
TeX:
\def~{~.}~
Результаты в:
! TeX capacity exceeded, sorry [input stack size=5000]. ~->~ . ~->~ . ~->~ . ~->~ . ~->~ . ~->~ . ... <*> \def~{~.}~
ЛАТЕКС:
\end\end
Результаты в:
! TeX capacity exceeded, sorry [input stack size=5000]. \end #1->\csname end#1 \endcsname \@checkend {#1}\expandafter \endgroup \if@e... <*> \end\end
Каждой задаче нужен правильный инструмент. Встретьтесь ТАК Переполнение язык, оптимизированный для создания переполнений стека:
so
C#:
public int Foo { get { return Foo; } }
ответ PIC18, данный TK, приводит к следующим инструкциям (двоичный файл):
overflow
PUSH
0000 0000 0000 0101
CALL overflow
1110 1100 0000 0000
0000 0000 0000 0000
Однако один только ВЫЗОВ выполнит переполнение стека:
CALL $
1110 1100 0000 0000
0000 0000 0000 0000
, Но RCALL (относительный вызов) меньше все еще (не глобальная память, таким образом, никакая потребность в дополнительных 2 байтах):
RCALL $
1101 1000 0000 0000
, Таким образом, самой маленькой на PIC18 является единственная инструкция, 16 битов (два байта). Это взяло бы 2 командных цикла на цикл. В 4 тактах на командный цикл у Вас есть 8 тактов. PIC18 имеет 31 стопку уровня, поэтому после 32-го цикла, он переполнит стека в 256 тактах. На уровне 64 МГц Вы были бы переполнять стека за 4 микро секунды и 2 байта .
Однако серия PIC16F5x использует инструкции на 12 битов:
CALL $
1001 0000 0000
Снова, два командных цикла на цикл, 4 часов на инструкцию так 8 тактов на цикл.
Однако PIC16F5x имеет две стопки уровня, таким образом, на третьем цикле он переполнился бы в 24 инструкциях. На уровне 20 МГц это было бы переполнение за 1,2 микро секунды и 1,5 байта .
Intel 4004 имеет инструкцию по подпрограмме вызова на 8 битов:
CALL $
0101 0000
Для любопытного, которое соответствует ASCII 'P'. С 3 стопками уровня, которые берут 24 такта для в общей сложности [1 123] 32,4 микро секунды и один байт . (Если Вы не разгоняетесь, Ваши 4004 - продвигаются, Вы знаете, что хотите.)
, Который является столь же маленьким как ответ befunge, но очень, намного быстрее, чем код befunge, работающий в текущих интерпретаторах.
Мой лучший ток (в x86 блоке):
push eax
jmp short $-1
, который приводит к 3 байтам объектного кода (50 EB FD
). Для 16-разрядного кода это также возможно:
call $
, который также приводит к 3 байтам (E8 FD FF
).
Nemerle:
Это катастрофические отказы компилятор с StackOverflowException:
def o(){[o()]}
Вы могли также попробовать это в C#.net
throw new StackOverflowException();
Считайте эту строку и сделайте то, что она говорит дважды .
жемчуг в 12 символах:
$_=sub{&$_};&$_
избейте 10 символов (пространство в функции важно):
i(){ i;};i
Скажите, пожалуйста, что означает аббревиатура « GNU ».
Ура, переполнение!
// v___v
let rec f o = f(o);(o)
// ['---']
// -"---"-