Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:
Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference
или даже (чаще) a KeyNotFoundException
при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.
Если код NullReferenceException
задан кодом unsafe
, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero
или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.
(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)
В текущей версии EL 2.2 вы не можете вставлять EL-выражения и String-concatenate EL-переменные таким образом. Используйте <c:set>
, чтобы подготовить динамический ключ, прежде чем использовать его в другом выражении EL, просто вставив выражение EL в строку:
<c:set var="resourceName" value="images:primefaces-ui/#{car.manufacturer}.jpg" />
<p:graphicImage value="#{resource[resourceName]}"/>
Альтернативой является просто использование library
и name
вместо генерации URL-адреса на основе данных с помощью #{resource}
mapping:
<p:graphicImage library="images" name="primefaces-ui/#{car.manufacturer}.jpg" />
Update: с EL 3.0 вы можете использовать оператор +=
для String- объединить EL-переменные, если вы действительно не можете использовать library/name
по какой-либо причине.
<p:graphicImage value="#{resource['images:primefaces-ui/' += car.manufacturer += '.jpg']}"/>