【问题标题】:try/catch in throws function在 throws 函数中尝试/捕获
【发布时间】:2012-11-11 06:00:18
【问题描述】:

如果我将 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();
}

【问题讨论】:

  • 你是什么意思,“哪个运行”?你觉得哪个?你就不能试试吗?
  • 我听不懂你的最后两个问题。
  • 感谢所有 cmets。有几个人在几分钟内准确地回答了我想知道的问题。

标签: java exception exception-handling try-catch throws


【解决方案1】:

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

它将执行该行:

number = 5;

但我看不出你用数字做什么...

我还建议您将其重构为:

catch (ServletException e) {
    number = 5;
} 

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

【讨论】:

    【解决方案2】:

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

    还有一个建议:

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

    catch(Exception e)
    

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

    【讨论】:

    • 你的意思可能是 - 最后一行的 catch specific 异常。
    • @RohitJain 是的,这正是我的意思,我将对其进行编辑以更正术语:P
    • 这是一个绝妙的答案。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      值 5

      【讨论】:

        【解决方案5】:

        它完全按照那里写的:

        1. getParameter() 会抛出ServletException

        2. 这个异常将从getParameter()转义

        3. try/catch 内部 doPost() 会被抓到

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

        【讨论】:

          【解决方案6】:

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

          换句话说,如果对getParameter 的调用抛出ServletExceptionnumber 将被设置为5,并且在该try-catch 语句的主体之外不会抛出任何异常。

          【讨论】:

          • 你的意思是它运行内部 catch 子句并忽略外部抛出?
          • 是的。在 try-catch 语句中捕获的任何内容都不会“重新抛出”到外部 throws 声明中。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-19
          • 1970-01-01
          • 2015-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-12
          相关资源
          最近更新 更多