Другое событие 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));
}
В JavaScript можно закодировать одинарные кавычки "\x27" и двойные кавычки как "\x22". Поэтому с этим методом Вы можете, как только Вы в (дважды или единственные) кавычки строкового литерала JavaScript, используйте \x27 \x22 безнаказанно без страха перед любыми встроенными кавычками, "вспыхивающими" Вашей строки.
\xXX для символов < 127, и \uXXXX для Unicode, так вооруженный этим знанием, можно создать устойчивое функция JSEncode для всех символов, которые являются вне обычного белого списка.
, Например,
<a href="#" onclick="SelectSurveyItem('<% JSEncode(itemid) %>', '<% JSEncode(itemname) %>'); return false;">Select</a>
Любой хороший достойный механизм шаблонной обработки будет иметь "кавычки Escape" функцией. Наш (также собственной разработки, где я работаю) также имеет функцию для выхода из кавычек для JavaScript. В обоих случаях переменная шаблона тогда просто добавляется с _esc или _js_esc, в зависимости от которого Вы хотите. Вы никогда не должны производить пользовательский контент к браузеру, которого не оставили, по моему скромному мнению.
Ответы здесь, что Вы не можете выйти из кавычек с помощью JavaScript и что необходимо запустить с завершенных строк.
Поэтому. Нет никакого способа способности JavaScript обработать строку 'Marge, сказал, что "я посмотрю, который был" Peter', и Вам нужны Ваши данные быть убранными прежде, чем предложить его сценарию?
Во-первых, это было бы более просто, если бы onclick обработчик был установлен этот путь:
<a id="someLinkId"href="#">Select</a>
<script type="text/javascript">
document.getElementById("someLinkId").onClick =
function() {
SelectSurveyItem('<%itemid%>', '<%itemname%>'); return false;
};
</script>
Тогда itemid и itemname нужно оставить для JavaScript (то есть, "
становится \"
, и т.д.).
при использовании Java на стороне сервера Вы могли бы смотреть на класс StringEscapeUtils от общего Ленга Джакарты. Иначе не должно занимать слишком много времени писать Ваш собственный 'escapeJavascript' метод.
Используйте библиотека Microsoft Anti-XSS , который включает JavaScript, кодируют.
Другое интересное решение могло бы состоять в том, чтобы сделать это:
<a href="#" itemid="<%itemid%>" itemname="<%itemname%>" onclick="SelectSurveyItem(this.itemid, this.itemname); return false;">Select</a>
Тогда можно использовать стандартное кодирование HTML на обоих переменные, не имея необходимость волноваться о дополнительной сложности заключения в кавычки JavaScript.
Да, это делает , создают HTML, который строго недопустим. Однако это допустимая техника, и все современные браузеры поддерживают его.
, Если бы это был мой, я, вероятно, пошел бы со своим первым предложением и удостоверился бы, что значения закодированы HTML , и вышли из одинарных кавычек.
Если это войдет в HTML-атрибут, Вам будет нужно к обоим HTML - кодируют (как минимум: >
к >
<
к <
и "
к "
) это, и одинарные кавычки Escape (с обратной косой чертой), таким образом, они не вмешиваются в Ваше заключение в кавычки JavaScript.
Лучший способ сделать это с Вашей системой шаблонной обработки (расширяющий его, при необходимости), но Вы могли просто сделать несколько функций выхода/кодирования и обернуть их обоих вокруг любых данных, это идет туда.
И да, это совершенно допустимо (корректный, даже) к Escape HTML все содержание Ваших HTML-атрибутов, даже если они содержат JavaScript.
Попытка избегает использования строковых литералов в Вашем HTML и использует JavaScript для привязки событий JavaScript.
кроме того, избегайте 'href =#', если Вы действительно не знаете то, что Вы делаете. Это повреждает такое удобство использования для навязчивого middleclickers (новичок вкладки).
<a id="tehbutton" href="somewhereToGoWithoutWorkingJavascript.com">Select</a>
предпочтительная библиотека My JavaScript просто, оказывается, jQuery:
<script type="text/javascript">//<!-- <![CDATA[
jQuery(function($){
$("#tehbutton").click(function(){
SelectSurveyItem('<%itemid%>', '<%itemname%>');
return false;
});
});
//]]>--></script>
, Если Вы, оказывается, представляете список ссылок как этот, можно хотеть сделать это:
<a id="link_1" href="foo">Bar</a>
<a id="link_2" href="foo2">Baz</a>
<script type="text/javascript">
jQuery(function($){
var l = [[1,'Bar'],[2,'Baz']];
$(l).each(function(k,v){
$("#link_" + v[0] ).click(function(){
SelectSurveyItem(v[0],v[1]);
return false;
});
});
});
</script>
Используйте скрытые промежутки, один каждый для каждого из параметров <%itemid%>
и <%itemname%>
и запишите их значения в них.
, Например, промежуток для <%itemid%>
был бы похож <span id='itemid' style='display:none'><%itemid%></span>
и в функции JavaScript SelectSurveyItem
для выбора аргументов от этих промежутков innerHTML
.
Объявите отдельные функции в < head> разделите и вызовите тех в своем onClick методе. Если у Вас есть партии, Вы могли бы использовать схему именования, которая нумерует их, или передайте целое число в в Вашем onClicks и имейте большой оператор переключения в функции.