Другое событие 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));
}
Как со всеми вопросами о производительности, ответ будет зависеть от Вашей конкретной конфигурации (в особенности процессор XSLT, который Вы используете), и вид обработки этого, Вы делаете.
<xsl:apply-templates>
берет последовательность узлов и проходит их один за другим. Для каждого это определяет местоположение шаблона с самым высоким приоритетом, который соответствует узлу и вызывает его. Так <xsl:apply-templates>
похож <xsl:for-each>
с <xsl:choose>
внутренняя часть, но более модульный.
Напротив, <xsl:call-template>
вызывает шаблон по имени. Нет никакого изменения в узле контекста (никакой <xsl:for-each>
) и никакой выбор относительно который шаблон использовать.
Так с точно теми же обстоятельствами, Вы могли бы предположить, что <xsl:call-template>
будет быстрее, потому что это делает меньше работы. Но если Вы находитесь в ситуации, где или <xsl:apply-templates>
или <xsl:call-template>
мог использоваться, Вы, вероятно, собираетесь быть выполнением <xsl:for-each>
и <xsl:choose>
сами, в XSLT, а не процессоре, делающем ее для Вас, негласно. Таким образом в конце мое предположение это, что это будет, вероятно, балансировать. Но поскольку я говорю, что это во многом зависит от вида оптимизации, Ваш процессор поместил в место и точно какую обработку Вы делаете. Измерьте его и посмотрите.
Мои эмпирические правила о том, когда использовать соответствие шаблонам и когда использовать именованные шаблоны:
<xsl:apply-templates>
и соответствие шаблонам, если Вы обрабатываете отдельные узлы для создания результата; используйте режимы, если конкретный узел должен быть обработан несколькими различными способами (такой как в оглавлении по сравнению с телом документа) <xsl:call-template>
и именованный шаблон при обработке чего-то другого, чем отдельный узел, такой как строки или числа или наборы узлов <xsl:function>
при возврате атомарного значения или существующего узла применять-шаблон и шаблон вызова не выполняют ту же задачу, сравнение производительности не действительно релевантно здесь. шаблон вызова берет шаблонное имя в качестве параметра, тогда как применять-шаблон берет выражение XPath. Применять-шаблон поэтому намного более мощен, так как Вы действительно не знаете, какой шаблон будет выполняться. Вы получите проблемы производительности при использовании сложных выражений XPath. Избегайте "//" в Ваших выражениях XPath, так как каждый узел Вашего входного документа будет оценен.
Это может зависеть от xml синтаксического анализатора, который Вы используете. Я ни за что не могу говорить кроме синтаксического анализатора.NET 2003 года, где я сделал некоторые неофициальные тесты производительности на нажатие по сравнению с получением по запросу код XSLT. Это подобно тому, что Вы спрашиваете: применять-шаблон = нажатие и шаблон вызова = получение по запросу. Я был убежден, что нажатие будет быстрее, но это не имело место. Это было о даже.
Жаль у меня нет точных тестов теперь. Я рекомендую испытать его с Вашим предпочтительным синтаксическим анализатором и вижу, существует ли какое-либо существенное различие. Моя ставка не будет.