2013-10-01 5 views
-1

Я новичок в Java, и я пытаюсь привести некоторые примеры, чтобы понять, как это работает.Java: создание объекта вызывает ошибку времени выполнения

У меня возникли проблемы с пониманием причины отказа следующего кода. Я знаю строку, которая вызывает ошибку, но я не могу сказать почему. Я сделал два класса, Class1 и Main, чей код записывается в двух отдельных файлах .java:

public class Class1 
{ 
    int var; 
    public void method1() 
    { 
     System.out.println(var); 
    } 
    Class1 obj1 = new Class1(); // this is the line that causes the error 
} 

и

public class Main 
{ 
    public static void main (String[] args) 
    { 
     Class1 obj = new Class1(); 
     obj.method1(); 
    } 
} 

Это компилируется нормально, но когда я запускаю java Main он просто печатает сотни раз ошибка

at Class1.<init>(Class1.java:8) 

Я попытался запустить java Main | more (я использую Unix Bash), но труба становится как-то игнорировать d, и я не вижу первую строку сообщения об ошибке. Также не выполняется перенаправление вывода на текстовый файл java Main > log.txt. Если я удалю эту строку, т. Е. Если я не создаю объект Class1obj1 в классе класса Class1, все будет работать нормально. Может ли кто-нибудь объяснить мне, что случилось с этой линией?

Спасибо

+0

Спасибо всем за ваши ответы, я получил его сейчас. – AndreasT

+0

Есть ли причина для того, чтобы вопрос был опущен? – AndreasT

ответ

1

Проблема в том, что вы создаете объект Class1 в бесконечном цикле.

Когда вы создаете объект Class1 в основном методе, он инициализирует все переменные, определенные вами в классе Class1. Но так как вы также создаете новый объект Class1 внутри тела Class1, он продолжает создавать объект Class1, и в какой-то момент он вызовет ошибку переполнения стека.

1

это незаконно, чтобы сделать Class1 obj1 = new Class1(); на уровне класса того же класса

вы не должны создавать объект на уровне класса тех же class.its позволило создать ссылку, как Class1 obj1; на уровне класса того же класса

3

Я думаю, что у вас есть рекурсивная инициализация Object.

Class1 obj = new Class1(); - инструкция экземпляра, поэтому она вызывается в каждом экземпляре, рекурсивно, инициирована из вашего метода main.

Это приведет к ошибке StackOverflowError.

StackOverflowError - это способ JVM, рассказывающий вам, что вы переполняете стек стек, а самый простой способ его запускать - это бесконечный метод или рекурсия конструктора, например, в вашем случае.

1

Это фактически бесконечный цикл, в котором вы создаете новый экземпляр класса внутри каждого нового экземпляра класса, в конце концов у Java заканчивается память или стек и генерируется исключение.

1

Вы код в конечном счете бросить:

java.lang.StackOverflowError 

Из безусловных рекурсивных попыток инициализации.

Для завершения строительства класса он должен выполнить эту инициализацию:

Class1 obj1 = new Class1(); 

Что в свою очередь будет пытаться построить Class1 снова и на этот жизнерадостный цикл будет продолжаться до тех пор, пока JVM отказаться от java.lang.StackOverflowError.

Смежные вопросы