Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Документация API Java объясняет почему ( http://java.sun.com/javase/6/docs/api/java/lang/Class.html#newInstance () ):
Примечание, что этот метод распространяет любое исключение, выданное nullary конструктором, включая контролируемую исключительную ситуацию. Использование этого метода эффективно обходит исключение времени компиляции, проверяющее, что это было бы иначе выполнено компилятором.
Constructor.newInstance
метод избегает этой проблемы путем обертывания любого исключения, выданного конструктором в (проверенном)InvocationTargetException
.
, Другими словами, это может победить систему контролируемых исключительных ситуаций.
Еще одна причина:
современные IDE позволяют Вам находить использования класса - помогает во время рефакторинга, если Вы и Ваш IDE знаете, какой код использует класс, который Вы планируете изменить.
, Когда Вы не делаете явного использования конструктора, но используете Class.newInstance () вместо этого, Вы рискуете не находить, что использование во время рефакторинга и этой проблемы не проявится, когда Вы скомпилируете.