Я происхожу из среды C++, и я делаю постоянно это в Java:
SomeClass sc=new SomeClass();
if(null!=sc)
{
sc.doSomething();
}
То, что я хочу знать, - то, что будет в переменном кв/см, если конструктор перестанет работать по некоторым причинам (как, возможно, недостаточно памяти). Я могу' t находить прямой ответ, и я волнуюсь, что просто трачу впустую свое время, потому что, возможно, если новые сбои оператора были бы программа просто отказать так или иначе?
В 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
, которые могут быть выброшены во время выполнения метода, но не пойманы, поскольку эти ошибки являются аномальными условиями, которые никогда не должны возникать.
Да вы зря теряете время :-). sc гарантированно будет отличным от NULL после вызова конструктора. Если конструктор завершился неудачно, возникнет исключение, и следующий код никогда не будет запущен. Следовательно, в Java безопасно следующее:
SomeClass sc = new SomeClass();
sc.doSomething();
без выброса NullPointerException.
Это ], если проверка
не требуется, а некоторые IDE даже будут жаловаться, что в ней нет необходимости, поскольку она всегда принимает значение истина
. Единственная причина, по которой new
не сработает, - это если конструктор сгенерировал исключение, и в этом случае ваша проверка if
все равно будет пропущена.
SomeClass sc=new SomeClass();
if(null!=sc) { sc.doSomething(); }
Ссылка на объект никогда не является null
после создания объекта, поэтому проверка null не нужна, поскольку условие всегда будет истинным.
Если, например, в точке конструктора недостаточно памяти, будет выброшено OutOfMemoryError
, и конструктор не вернется нормально.
Создается OutOfMemoryError, который обычно приводит к сбою виртуальной машины. (Может быть пойман как Бросаемый)
Вы можете найти Предотвращение и восстановление после ошибки Java OutOfMemory.
Если конструктор завершится неудачно, он вызовет исключение или ошибку, и вы не сможете продвинуться дальше в программе. В частности, при нехватке памяти вы получите OutOfMemoryError
.