【问题标题】:request.getHeader("User-Agent") throws nperequest.getHeader("User-Agent") 抛出 npe
【发布时间】:2012-06-01 18:50:44
【问题描述】:

我想确认request.getHeader("User-Agent")是否可以抛出空指针异常,如果可以,那么在什么情况下会抛出NPE。

<% if (request.getHeader("User-Agent").toLowerCase().indexOf("msie") != -1) { %>

提前致谢

【问题讨论】:

    标签: java jakarta-ee


    【解决方案1】:

    不,

    request.getHeader("User-Agent")
    

    不应抛出NPE,但它可能会返回null,在这种情况下,您的代码将通过NPE

    (我假设 request 是 HTTPServletRequest 或类似的实例)

    【讨论】:

    • 这是我的错误,因为 request.getHeader("User_Agent") 为空,所以我得到空指针异常。即请求标头中缺少用户代理的属性。
    • 是的。因此,您的问题的答案是“否”-我假设您的预期问题的答案是“是”(它可以返回 null)。
    • 如果请求为空怎么办? :)
    【解决方案2】:

    request.getHeader("User-Agent") 可能会返回 null 如果 User-Agent 标头不是由客户端发送的(这不是强制性的)。将您的代码更改为:

    String userAgent = request.getHeader("User-Agent");
    if (userAgent != null && userAgent.toLowerCase().indexOf("msie") != -1)
    

    【讨论】:

      【解决方案3】:

      当然,有可能不发送任何类型的“User-Agent”标头。在这种情况下,您的代码会抛出 NPE - request.getHeader("User-Agent") == null => null 没有 toLowerCase() 方法。

      将您的 if 更改为以下内容: &lt;% if (request.getHeader("User-Agent") != null &amp;&amp; request.getHeader("User-Agent").toLowerCase().indexOf("msie") != -1) { %&gt;

      浏览器决定如何向服务器介绍自己,有大量浏览器插件允许将用户代理更改为您想要的任何文本。另一个例子,你的互联网网关肯定可以从任何通过它的 http 数据包中更改/删除user-agent

      【讨论】:

      • 感谢您的快速回复。您能否建议我们将 Header 用户代理属性设置为 null 的场景?
      • 浏览器决定如何向服务器介绍自己,有 gazylion 浏览器插件允许将用户代理更改为您想要的任何文本。另一个例子,你的互联网网关肯定可以从任何通过它的 http 数据包中更改/删除用户代理。
      • 在 JSP 中你不应该做空检查,而是写:if !empty request.getHeader("User-Agent")
      【解决方案4】:

      大多数浏览器或客户端都会发送User-Agent header,在这种情况下,request.getHeader("User-Agent") 不应为空。

      但是,某些客户端/浏览器可能不会发送User-Agent header,在这种情况下,您的代码可能会引发 NPE。

      你应该处理空的情况。

      【讨论】:

        猜你喜欢
        • 2021-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-16
        • 2013-06-14
        • 2022-01-12
        • 1970-01-01
        相关资源
        最近更新 更多