Java NPE未发生或在Servlet中被捕获

Java NPE未发生或在Servlet中被捕获,java,json,servlets,error-handling,Java,Json,Servlets,Error Handling,我有一个非常基本的Servlet public class DreambearLoginServlet extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { JSONObject ret = new JSONObject();

我有一个非常基本的Servlet

public class DreambearLoginServlet extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        JSONObject ret = new JSONObject();

        try {

            // handle the request
            try {

                String action = req.getParameter("action");

                if (action.equals("login")) {

                    ...

                } else if (action.equals("checklogin")) {

                    ...

                } else {
                    throw new RuntimeException("Action invalid");
                }

            } catch (Exception e) {
                ret.put("error", e.getMessage());
                e.printStackTrace();
            }

            // write response
            resp.setContentType("application/json");
        resp.getWriter().print(ret.toString());
            resp.getWriter().flush();

        } catch (JSONException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }



}

现在,如果我调用它而不指定查询字符串参数
action
,则应在语句
action.equals(“login”)
上抛出
NullPointerException
。这将导致执行catch代码,JSON输出为
{“error”:“无论NPE说什么”}
。奇怪的是,JSON输出只是
{}
。这怎么可能呢?

你是对的,如果NPE发生,它将被你的catch子句捕获。 所以你是对的,这不可能

  • 你确定这是get请求吗
  • 你确定你的代码没有在其他地方停止吗
  • 动作是否可以设置为空
  • NullPointerException中的消息可能是空的吗
  • e.getMessage()
    对于
    NullPointerException
    和JSONObject.put()文档来说是
    null

    将键/值对放入 JSONObject。如果该值为null,则 钥匙将从系统中取出 JSONObject(如果存在)


    因此,正如预期的那样,没有向JSON对象添加任何内容。

    您看到的结果表明1)在执行相关代码之前,在其他地方出现了NPE,或者2)此处显示的代码实际上不是正在执行的代码(即,可能您正在测试过时的版本)。你确定两者都没有发生吗?你有一个stacktrace指向NPE生成的确切位置吗?是的,我看不到任何NPE的证据。在第二个try语句之前也不应该有任何异常,因为有JSON输出(写在第一个try块中),它只是空的。这确实是问题所在。JSON小组做出了多么奇怪的API设计决定;JSON支持带有“null”值的键,不是吗?无论如何,谢谢。