В Java что происходит, когда объект не может быть создан? - PullRequest
8 голосов
/ 06 августа 2010

Я пришел из c ++ фона и постоянно нахожусь в java:

SomeClass sc=new SomeClass();

if(null!=sc)
{
    sc.doSomething();
}

То, что я хочу знать, это то, что будет в переменной sc, если конструктор потерпит неудачу по какой-то причине (например, может быть, недостаточно памяти). Я могу' Я не могу найти прямой ответ, и меня беспокоит, что я просто зря трачу время, потому что, может быть, если новый оператор потерпит неудачу, программа все равно рухнет?

Ответы [ 6 ]

12 голосов
/ 06 августа 2010

Язык спецификации Java 3-е издание полностью охватывает ваш вопрос:

12.5 Создание экземпляров нового класса

Всякий раз, когда новыйСоздается экземпляр класса, для него выделяется пространство памяти с местом для всех переменных экземпляра, объявленных в типе класса, и всех переменных экземпляра, объявленных в каждом суперклассе типа класса, включая все переменные экземпляра, которые могут быть скрыты.Если для выделения памяти для объекта недостаточно места, то создание экземпляра класса завершается внезапно с OutOfMemoryError.В противном случае все переменные экземпляра в новом объекте, включая объявленные в суперклассах, инициализируются значениями по умолчанию.

Непосредственно перед тем, как в качестве результата возвращается ссылка на вновь созданный объект, указанный конструктор обрабатывается для инициализации нового объекта, используя следующую процедуру: [...]

Поэтому выражение new просто не может вернуть null.Все, что возвращается, если выполнение завершается нормально, всегда будет действительным instanceof независимо от того, какой класс был создан.


Обработка исключений

Вообще говоря, возможные исключения обычно обрабатываются с помощьюtry-catch block:

String someString = askFromUser();
try {
   int num = Integer.parseInt(someString);
   doSomethingWith(num);
} catch (NumberFormatException e) {
   complainAboutIt();
}

В вашем случае, вы можете рассмотреть возможность помещения new SomeClass() в try блок с соответствующим catch (OutOfMemoryError e), но это очень нетипично.Если вы не планируете делать что-то значимое, когда это происходит, в большинстве типичных сценариев лучше не catch любых Error, которые могут возникнуть во время выполнения вашей программы.

Из документации:

Error является подклассом Throwable, который указывает на серьезные проблемы, которые разумное применение не должно * try до catch.Большинство таких ошибок являются ненормальными условиями.

Метод не обязан объявлять в своем предложении throws любые подклассы Error, которые могут быть выброшены во время выполнения метода, но не перехвачены, поскольку эти ошибкиненормальные условия, которые никогда не должны возникать.

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

См. Также

6 голосов
/ 06 августа 2010

Если конструктор потерпел неудачу, то он выдаст исключение или ошибку, и вы не сможете продолжить работу в программе.В частности, если бы не хватило памяти, вы бы получили OutOfMemoryError.

1 голос
/ 06 августа 2010
SomeClass sc=new SomeClass();

if(null!=sc) { sc.doSomething(); }

Ссылка на объект никогда не равна null после создания объекта, поэтому проверка на ноль не требуется, поскольку условие всегда будет истинным.

Если, например, в точке конструктора недостаточно памяти, будет выброшено OutOfMemoryError и конструктор не вернется нормально.

1 голос
/ 06 августа 2010

Проверка if не нужна, и некоторые IDE даже будут жаловаться на то, что она не нужна, поскольку она всегда оценивается как true. Единственная причина, по которой new потерпит неудачу, заключается в том, что конструктор выдал исключение, и в этом случае ваша проверка if будет в любом случае обойдена.

1 голос
/ 06 августа 2010

Да, вы зря тратите время :-). sc гарантированно будет ненулевым после вызова конструктора. Если конструктор потерпел неудачу, будет сгенерировано исключение, и следующий код никогда не будет запущен. Следовательно, в Java безопасно:

SomeClass sc = new SomeClass();
sc.doSomething();

без исключения NullPointerException.

0 голосов
/ 06 августа 2010

Выдается OutOfMemoryError , что обычно приводит к сбою виртуальной машины. (Может быть пойман как Throwable)

Может оказаться полезным Предотвратить и восстановить из Java OutOfMemory Ошибка полезно.

...