【问题标题】:Exception in inner catch in javajava内部catch中的异常
【发布时间】:2018-04-26 18:43:42
【问题描述】:

在下面的代码中,内部catch块内引发了异常,因此理想情况下它应该被外部catch块捕获,并且应该导致正常执行。 但是当我执行时,它没有被外部catch块捕获,仍然正常执行,没有任何堆栈跟踪。

我的疑问是,如果它已经正常执行(没有堆栈跟踪),那么它一定是被外部 catch 捕获(应该打印“10”)

代码:

public class Test2 {


    public static void main(String[] args)  {

        try {
            System.out.println("1");
            System.out.println("2");

            System.out.println("3");
            try {
                System.out.println("4");
                System.out.println("5");

                System.out.println("6");

                }
            catch(NullPointerException e)
            {
                int x=1/0;
            }
            finally
            {
                System.out.println("8");

            }
            System.out.println("9");
        }
        catch(ArithmeticException e)
        {
            System.out.println("10");
        }
        finally
        {
            System.out.println("11");
        }
        System.out.println("12");
    }

}

输出:

1
2
3
4
5
6
8
9
11
12

【问题讨论】:

  • 我没有看到任何抛出NullPointerException的代码

标签: java exception-handling


【解决方案1】:

NullPointerException 只是不会在您的代码中的任何地方抛出。因此,执行永远不会到达被零除的那个 catch 块,因此也不会引发算术异常。

尝试在System.out.println("6");之后添加如下内容:

Object obj = null;
obj.toString();

NullPointerException被抛出。

【讨论】:

  • 为什么不简单地抛出一个 NPE?
  • 我试图模拟一个……现实的场景:大多数野外的 NPE 都是由 VM 抛出的 :) 但是当然,更直接的方法是只做 throw new NullPointerException()
【解决方案2】:

代码中的小改动:

public class Test2 {
    public static void main(String[] args) {
        try {
            System.out.println("1");
            System.out.println("2");
            System.out.println("3");
            try {
                System.out.println("4");
                System.out.println("5");
            System.out.println("6");
            } catch (NullPointerException e) {
                System.out.println("Inner Catch Block");
                int x = 1 / 0;
            } finally {
                System.out.println("8");
            }
            System.out.println("9");
        } catch (ArithmeticException e) {
            System.out.println("10");
        } finally {
            System.out.println("11");
        }
        System.out.println("12");
    }
}

由于内部try块没有发生异常,内部catch块没有执行。请参阅Inner Catch Block 未打印。 finallyblock 已执行,内部 try 块的其余代码已执行。同样,由于外部try块没有发生异常,外部catch块也没有执行。

【讨论】:

    【解决方案3】:

    唯一会引发异常的行是在初始化 x 时。 如果您尝试查看此异常,则必须将其移至 try 块之一。它还会抛出 ArithmeticException not NullPointerException,因此您必须将 catch 块更改为 ArithmeticException 或一般异常。下面的例子。

        try {
            System.out.println("1");
            System.out.println("2");
            System.out.println("3");
            try {
                int x = 1 / 0;
            } catch (ArithmeticException e) {
                System.out.println("4");
                System.out.println("5");
                System.out.println("6");
            } finally {
                System.out.println("8");
            }
            System.out.println("9");
        } catch (ArithmeticException e) {
            System.out.println("10");
        } finally {
            System.out.println("11");
        }
        System.out.println("12");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多