-3

如果我将 try/catch 放在 throws 函数中,如果出现异常,哪个会运行?

  1. 它是否在 catch 子句中执行任何操作,抛出异常或两者兼而有之?

  2. 添加更多细节,如果内部范围中的异常是从另一个继承的,反之亦然怎么办?

  3. 当 post 不包含参数时,此功能有什么作用?

例子 :

 public void doPost(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException{
        int number;
    try {
            number = Integer.parseInt(getParameter(req,"number"));
        } catch (Exception e) {
    number = 5;
        }
    }

其中 getParameter 是我的 BaseServlet 类中的一个函数,它扩展了 HttpServlet:

protected String getParameter(HttpServletRequest req, String parameter)
    throws ServletException {
    String value = req.getParameter(parameter);
    if (isEmptyOrNull(value)) 
        throw new ServletException("Parameter " + parameter + " not found");

    return value.trim();
}
4

6 回答 6

1

catch 子句将处理Exceptiontry 块主体中抛出的任何内容,从而有效地使throws声明变得毫无意义。

换句话说,如果调用getParameterthrows a ServletException,number将被设置为 5 并且不会抛出任何异常超出该 try-catch 语句的主体。

于 2012-11-22T20:17:53.477 回答
1

如果您选择同时处理异常(使用 try/catch)和回避异常(使用 throws 子句),编译器会选择处理异常。在您的情况下,它将捕获异常并分配5number.

和一个建议:

在单个 catch 块中处理所有异常是一种不好的做法,即

catch(Exception e)

始终捕获大多数特定异常。

于 2012-11-22T20:19:29.437 回答
0

getParameter()将抛出 ServletException。中的 catch 子句post(..)将处理 try 块主体中抛出的任何异常

它将执行该行:

number = 5;

但我不明白你用数字做什么......

我还将建议您将其重构为:

catch (ServletException e) {
    number = 5;
} 

仅捕获您期望的异常...

于 2012-11-22T20:17:57.093 回答
0

它完全按照那里写的:

  1. getParameter()会抛出ServletException

  2. 此异常将从getParameter()

  3. 里面try/里面catchdoPost()被抓住

  4. catch块将通过调用来处理它number = 5

于 2012-11-22T20:18:10.823 回答
0

您正在讨论所有异常,
所以如果一切正常。number 从 parseInt() 中获取值。

如果这会引发任何异常(通常是 NumberFormatException 或您的 ServeletException),那么您会遇到
异常原因并得到

值 5

于 2012-11-22T20:18:57.617 回答
0

您的 try-catch 块将始终运行,除非您的 try 块引发 Throwable。

于 2012-11-22T20:21:05.403 回答