Java NPE未发生或在Servlet中被捕获
我有一个非常基本的ServletJava 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();
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”值的键,不是吗?无论如何,谢谢。