Почему является Class.newInstance () “злом”?

Другое событие 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));
}

90
задан Community 23 May 2017 в 11:54
поделиться

2 ответа

Документация API Java объясняет почему ( http://java.sun.com/javase/6/docs/api/java/lang/Class.html#newInstance () ):

Примечание, что этот метод распространяет любое исключение, выданное nullary конструктором, включая контролируемую исключительную ситуацию. Использование этого метода эффективно обходит исключение времени компиляции, проверяющее, что это было бы иначе выполнено компилятором. Constructor.newInstance метод избегает этой проблемы путем обертывания любого исключения, выданного конструктором в (проверенном) InvocationTargetException.

, Другими словами, это может победить систему контролируемых исключительных ситуаций.

81
ответ дан Chris Jester-Young 24 November 2019 в 07:07
поделиться

Еще одна причина:

современные IDE позволяют Вам находить использования класса - помогает во время рефакторинга, если Вы и Ваш IDE знаете, какой код использует класс, который Вы планируете изменить.

, Когда Вы не делаете явного использования конструктора, но используете Class.newInstance () вместо этого, Вы рискуете не находить, что использование во время рефакторинга и этой проблемы не проявится, когда Вы скомпилируете.

20
ответ дан alexei.vidmich 24 November 2019 в 07:07
поделиться
Другие вопросы по тегам:

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