【问题标题】:Throwing exceptions as well as catching exceptions?抛出异常和捕获异常?
【发布时间】:2013-06-24 05:53:01
【问题描述】:

我想知道 Java 如何处理以下场景

public static void main(String[] args) throws IndexOutOfBoundsException, CoordinateException, MissionException, SQLException, ParserConfigurationException {
    try {
        doSomething();
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

在上面的代码中,我声明主函数抛出许多不同的异常,但在函数内部,我捕获的是通用异常。我想知道java如何在内部接受这个?即,假设 doSomething() 抛出 IndexOutOfBounds 异常,e.printStackTrace() 会在最后一个 catch (Exception e) {...} 块中被调用吗?

我知道如果函数的 throws 区域中没有声明的异常被抛出,try/catch 会处理它,但是声明中提到的异常呢?

【问题讨论】:

    标签: java exception exception-handling throw


    【解决方案1】:

    在您的情况下,如果在 doSomething() 中抛出或生成任何异常,由于您正在捕获的 Exception e,它将被捕获在 try-catch 块中。

    Exception 是所有异常的。所有的异常都继承自这个类。

    【讨论】:

    • 事情是,有时我希望它在 try/catch 中得到处理,然后被抛出。在这种情况下,我应该在异常结束时使用throw e; 吗?
    • 是的,不要忘记您可以创建自己的异常并将它们扔到 catch 块中。这就是所谓的链式异常docs.oracle.com/javase/tutorial/essential/exceptions/…
    【解决方案2】:

    catch 块比方法级别的 throw 声明具有更高的优先级。如果有东西通过那个 catch 块,它会被方法抛出(但事实并非如此,因为你提到的所有异常确实都继承自 Exception)。

    如果您需要由 catch 块处理但进一步转发的异常,则必须重新抛出它,例如

    throw e;
    

    【讨论】:

      【解决方案3】:

      说 doSomething() 抛出一个 IndexOutOfBounds 异常,会 e.printStackTrace() 在最后一次捕获中被调用(异常 e){...} 屏蔽?

      是的,e.printStackTrace() 将被调用。因为您已经捕获了Exception,它比(直接或间接超类)IndexOutOfBoundException 或您在 throws 子句中放入的任何其他异常更广泛。但是,如果您在 throws 子句中捕获了一些比 IndexOutOfBoundException 更窄的异常和其他异常,并且遇到任何这些异常,则会触发 throws 子句。

      【讨论】:

        【解决方案4】:

        假设你有这个代码:

           try{
                doSomething();
            }catch(Exception ex){
                System.out.println("Exception:");
                ex.printStackTrace();
            }catch(IndexOutOfBoundsException ex){
                 System.out.println("IndexOutOfBoundsException :");
                ex.printStackTrace();
            }
        

        你会得到一个编译错误说

        异常IndexOutIfBounds已经被捕获

        这是因为每个 exceptions 都继承自 Exception 类,所以 catch 块捕获的第一件事就是异常,因为 IndexOutOfBounds 是一个异常,因此不需要捕获它两次一个用于第一个,一个用于第二个。
        在一种情况下,当您没有在 throws 之后或在 try-catch 中声明异常类时,抛出将发挥作用。

        【讨论】:

          【解决方案5】:

          声明中提到的异常是允许调用堆栈更上层的方法来处理它。在您的情况下,如果您的 main 方法抛出它们,这些异常将由运行时处理。

          来源http://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html

          【讨论】:

            猜你喜欢
            • 2016-02-17
            • 2018-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-02
            • 2011-06-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多