【发布时间】:2012-06-01 18:50:44
【问题描述】:
我想确认request.getHeader("User-Agent")是否可以抛出空指针异常,如果可以,那么在什么情况下会抛出NPE。
<% if (request.getHeader("User-Agent").toLowerCase().indexOf("msie") != -1) { %>
提前致谢
【问题讨论】:
标签: java jakarta-ee
我想确认request.getHeader("User-Agent")是否可以抛出空指针异常,如果可以,那么在什么情况下会抛出NPE。
<% if (request.getHeader("User-Agent").toLowerCase().indexOf("msie") != -1) { %>
提前致谢
【问题讨论】:
标签: java jakarta-ee
不,
request.getHeader("User-Agent")
不应抛出NPE,但它可能会返回null,在这种情况下,您的代码将通过NPE。
(我假设 request 是 HTTPServletRequest 或类似的实例)
【讨论】:
request.getHeader("User-Agent") 可能会返回 null 如果 User-Agent 标头不是由客户端发送的(这不是强制性的)。将您的代码更改为:
String userAgent = request.getHeader("User-Agent");
if (userAgent != null && userAgent.toLowerCase().indexOf("msie") != -1)
【讨论】:
当然,有可能不发送任何类型的“User-Agent”标头。在这种情况下,您的代码会抛出 NPE - request.getHeader("User-Agent") == null => null 没有 toLowerCase() 方法。
将您的 if 更改为以下内容:
<% if (request.getHeader("User-Agent") != null && request.getHeader("User-Agent").toLowerCase().indexOf("msie") != -1) { %>
浏览器决定如何向服务器介绍自己,有大量浏览器插件允许将用户代理更改为您想要的任何文本。另一个例子,你的互联网网关肯定可以从任何通过它的 http 数据包中更改/删除user-agent。
【讨论】:
if !empty request.getHeader("User-Agent")
大多数浏览器或客户端都会发送User-Agent header,在这种情况下,request.getHeader("User-Agent") 不应为空。
但是,某些客户端/浏览器可能不会发送User-Agent header,在这种情况下,您的代码可能会引发 NPE。
你应该处理空的情况。
【讨论】: