В Java, что происходит, когда объекту не удается быть инстанцированным?

Я происхожу из среды C++, и я делаю постоянно это в Java:

SomeClass sc=new SomeClass();

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

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

9
задан bakkal 6 August 2010 в 06:58
поделиться

6 ответов

В Java Specification Language 3rd Edition ваш вопрос рассмотрен подробно:

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

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

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

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


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

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

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

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

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

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

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

Похожие вопросы

Смотрите также

12
ответ дан 4 December 2019 в 10:02
поделиться

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

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

без выброса NullPointerException.

1
ответ дан 4 December 2019 в 10:02
поделиться

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

1
ответ дан 4 December 2019 в 10:02
поделиться
SomeClass sc=new SomeClass();

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

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

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

1
ответ дан 4 December 2019 в 10:02
поделиться

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

Вы можете найти Предотвращение и восстановление после ошибки Java OutOfMemory.

0
ответ дан 4 December 2019 в 10:02
поделиться

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

6
ответ дан 4 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: