代码之家  ›  专栏  ›  技术社区  ›  shubham daharwal

java中的内部捕获异常

  •  0
  • shubham daharwal  · 技术社区  · 6 年前

    在下面的代码中,异常是在内部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
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   Roman Puchkovskiy    6 年前

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

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

    Object obj = null;
    obj.toString();
    

    制作 空指针异常 被抛出。

        2
  •  0
  •   emon    6 年前

    您的代码几乎没有变化:

    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 未打印。 finally 块被执行,内部try块的其余代码被执行。类似地,由于外部try块中没有发生异常,因此外部catch块也没有执行。

        3
  •  0
  •   Broomes    6 年前

    唯一会引发异常的行是初始化x时。 如果试图查看此异常,则必须将其移动到其中一个try块。它还会引发一个算术异常 一个NullPointerException,因此您必须将catch块更改为arithmetricException或常规异常。下面的示例。

        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");
    }