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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Forth:
: a 1 recurse ; a
Внутренняя часть gforth
интерпретатор:
: a 1 recurse ; a
*the terminal*:1: Return stack overflow
: a 1 recurse ; a
^
Backtrace:
На Power Mac G4 при Открыть подсказке Firmware, это просто подвешивает машину.:)
В Lua:
function f()return 1+f()end f()
необходимо сделать что-то к результату рекурсивного вызова, или иначе оптимизация последнего вызова позволит ему циклично выполняться навсегда. Слабый для гольфа кода, но хороший иметь!
я предполагаю, что и долгие ключевые слова означают, что Lua не будет выигрывать гольф кода в ближайшее время.
Java (смущение):
public class SO
{
private void killme()
{
killme();
}
public static void main(String[] args)
{
new SO().killme();
}
}
РЕДАКТИРОВАНИЕ , Конечно, это может быть значительно сокращено:
class SO
{
public static void main(String[] a)
{
main(null);
}
}
как локальная переменная в функции C:
int x[100000000000];
GWBASIC производится...
OK
10 i=0
20 print i;
30 i=i+1
40 gosub 20
run
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
22 23 24 25 26 27 28 29 30 31 32 33
Out of memory in 30
Ok
Не много глубины стека там:-)
c# снова:
class Foo { public Foo() {new Foo(); } }
/* In C/C++ (second attempt) */
int main(){
int a = main() + 1;
return a;
}
a{return a*a;};
Компиляция с:
gcc -D"a=main()" so.c
Расширяется до:
main() {
return main()*main();
}
Если нет язык, где пустая программа вызывает переполнение стека, следующее должно быть самым коротким.
Befunge:
:
Дубликаты главное значение стека много раз.
редактирование: Patrick лучше. Заполнение стека с 1 с лучше, чем заполнение стека с 0s, так как интерпретатор мог оптимизировать продвижение 0s на пустой стек как нет.
Ну, никто еще не упомянул Coldfusion, таким образом...
<cfinclude template="#ListLast(CGI.SCRIPT_NAME, "/\")#">
, Что oughta делают это.
В Пробеле я думаю:
Это, вероятно, не обнаружится.: /
Люди F#
продолжают спрашивать, "Для чего F# полезный?"
let rec f n =
f (n)
производительность оптимизировала версию (перестанет работать быстрее:))
let rec f n =
f (f(n))
CIL/MSIL :
loop: ldc.i4.0
br loop
Объектный код:
16 2B FD
Если Вы полагаете, что кадр вызова процесс и стек, чтобы быть Вашей машиной Unix, Вы могли полагать, что fork-бомба была параллель программа для создания условия переполнения стека. Попробуйте это число удара с 13 символами. Никакое сохранение в файл не необходимо.
:(){ :|:& };:
В Irssi (на терминальном основанный клиент IRC, не "действительно" язык программирования), $L означает текущую командную строку. Таким образом, можно вызвать переполнение стека ("предел рекурсии максимума хита") с:
/eval $L
Примечание C#
class _{static void Main(){Main();}}
, что мой - компилируемая программа, не только единственная функция. Я также удалил избыточный пробел.
Для таланта, я сделал имя класса столь небольшим, как я мог.
Ruby, короче, чем другие до сих пор:
def a;a;end;a
(13 символов)
пакетная программа, названная call.cmd;
call.cmd
****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=1240, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******
вызова В Схеме это заставит интерпретатор исчерпывать память:
(define (x)
((x)))
(x)
C #
class Program
{
class StackOverflowExceptionOverflow : System.Exception
{
public StackOverflowExceptionOverflow()
{
throw new StackOverflowExceptionOverflow();
}
}
static void Main(string[] args)
{
throw new StackOverflowExceptionOverflow();
}
}
Я понимаю, что это не самый короткий (и даже код в гольф, он не приблизился к тому, чтобы быть рядом с коротким), но я просто не мог удержаться отбрасывать исключение, что при броске бросает колокол. способен расторгнуть себе время выполнения ^^
{/}loop
При запуске в GhostScript, выбрасывает это исключение:
GS>{/}loop
Error: /stackoverflow in --execute--
Operand stack:
--nostringval--
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- %loop_continue 1753 2 3 %oparray_pop --nostringval-- --nostringval-- false 1 %stopped_push .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- %loop_continue
Dictionary stack:
--dict:1150/1684(ro)(G)-- --dict:0/20(G)-- --dict:70/200(L)--
Current allocation mode is local
Last OS error: 11
Current file position is 8
Вот рекурсивная версия без использования переменных (51 chars):
[{/[aload 8 1 roll]cvx exec}aload 8 1 roll]cvx exec
Java:
class X{static{new X();}{new X();}}
Фактически вызывает переполнение стека при инициализации X-класса. Перед вызовом main () JVM должна загрузить класс, и когда это произойдет, она запускает любые анонимные статические блоки кода:
static {
new X();
}
Который, как вы можете видеть, создает экземпляр X с использованием конструктора по умолчанию. JVM будет вызывать анонимные блоки кода еще до конструктора:
{
new X();
}
Это рекурсивная часть.
Java: 35 символов
Думаю, уже поздно, но я все же опубликую свою идею:
class A{{new A();}static{new A();}}
Использование возможностей статического инициализатора и инициализатора экземпляра.
Вот вывод на моем компьютере (обратите внимание, что он показал два сообщения об ошибках):
Exception in thread "main" java.lang.StackOverflowError
at A.<init>(A.java:1)
......
at A.<init>(A.java:1)
Could not find the main class: A. Program will exit.
См. также: http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/java/javaOO/initial.html
template<int n>struct f{f<n+1>a;};f<0>::a;
вывод:
$ g++ test.cpp;
test.cpp:1: error: template instantiation depth exceeds maximum of 500 (use -ftemplate-depth-NN to increase the maximum) instantiating ‘struct f<500>’
test.cpp:1: instantiated from ‘f<499>’
test.cpp:1: instantiated from ‘f<498>’
......
Даже если компилятор прошел шаблон, будет следующая ошибка: отсутствует main
.