2 回答

TA貢獻1963條經驗 獲得超6個贊
要么做一個沒有輸出的轉發:
try {
CakeDAO dao = new CakeDAO();
String strID = request.getParameter("id");
int id = Integer.parseInt(strID);
request.setAttribute("cake", dao.getCakeById(id));
request.getRequestDispatcher("/WEB-INF/detail.jsp").forward(request, response);
} catch (Exception ex) {
request.getRequestDispatcher("/WEB-INF/error.jsp").forward(request, response);
}
或者做:
try {
CakeDAO dao = new CakeDAO();
String strID = request.getParameter("id");
int id = Integer.parseInt(strID);
PrintWriter out = response.getWriter();
out.println("Cake: " + dao.getCakeById(id)); // Hereafter an exception would err.
// NEVER forward: ... .forward(request, response);
} catch (Exception ex) {
request.getRequestDispatcher("/WEB-INF/error.jsp").forward(request, response);
}
Try-with-resources 會自動關閉,并且不需要。在轉發時甚至會引發錯誤。
更重要的是,沒有得到作家,你是更好的。在實際寫入輸出之后(緩沖 I/O!),轉發是錯誤的,因此 catch 中的轉發是臟的。

TA貢獻1807條經驗 獲得超9個贊
如此處所述(在規范中沒有很快找到它),在進入 catch 塊之前,try-with-resources 構造將嘗試關閉在 try 塊中打開的資源- 即您的out, 因此response, 已經當您嘗試在catch塊中重定向時關閉。我建議通過以下方式處理可能的異常:
try (PrintWriter out = response.getWriter()) {
try {
CakeDAO dao = new CakeDAO();
String strID = request.getParameter("id");
int id = Integer.parseInt(strID);
request.setAttribute("cake", dao.getCakeById(id));
request.getRequestDispatcher("/WEB-INF/detail.jsp").forward(request, response);
}catch (Exception ex) {
request.getRequestDispatcher("/WEB-INF/error.jsp").forward(request, response);
}
}
實際上,我在您的代碼中沒有看到任何使用out,所以整個 try-with-resources 塊只是多余的。
添加回答
舉報