处理异常异常

时间:2019-05-16 13:18:29

标签: java exception

下面是我试图理解的代码。

public static void main(String[] args)
{
    try
    {
        System.out.println(args[0]);
    }
    catch (ArrayIndexOutOfBoundsException e)
    {
        System.out.println("ArrayIndexOutOfBoundsException");
        throw new NullPointerException();
    }
    catch (NullPointerException e)
    {
        System.out.println("NullPointerException");
        throw new Exception();
    }
    catch (Exception e)
    {
        System.out.println("Exception");
    }
}

除了我抛出 new Exception(); 之外,一切都很好。因此,当我这样做时,尽管我在下面提供了catch语句来处理它,但发生了一个错误,说“未处理的异常类型Exception”。

所以我知道问题的解决方案,但我想知道原因。我缺少什么见解?

任何人都可以解释它。

1 个答案:

答案 0 :(得分:3)

  

尽管我在下面提供了catch语句来处理它。

catch块仅处理相应的try块中的异常。您的throw new Exception();语句位于catch块中-同样,您当前正在从NullPointerException块中抛出catch,而不会被其下方的挡块挡住。编译器知道catch (Exception e)块不会处理在catch (NullPointerException e)块中引发的异常,因此它给您一个编译时错误,就像您有throw语句而没有任何完全try / catch

如果您将代码更改为:

try
{
    System.out.println(args[0]);
    throw new Exception();
}
catch (ArrayIndexOutOfBoundsException e)
{
    System.out.println("ArrayIndexOutOfBoundsException");
}
catch (NullPointerException e)
{
    System.out.println("NullPointerException");
}
catch (Exception e)
{
    System.out.println("Exception");
}

...那么它应该可以编译并且可以了。

如果要处理从catch块引发的异常,则需要嵌套的try块。例如:

try
{
    try
    {
        System.out.println(args[0]);
    }
    catch (ArrayIndexOutOfBoundsException e)
    {
        System.out.println("ArrayIndexOutOfBoundsException");
        throw new NullPointerException();
    }
    catch (NullPointerException e)
    {
        System.out.println("NullPointerException");
        throw new Exception();
    }
}
catch (Exception e)
{
    System.out.println("Exception");
}

现在,请考虑如果在没有命令行参数的情况下运行此命令会发生什么:

  • 内部try块将抛出ArrayIndexOutOfBoundsException
  • 第一个catch块将捕获异常,将消息打印到控制台,然后抛出NullPointerException
  • 最终 catch块将捕获NullPointerException并仅在控制台上打印“ Exception”。重要的是,catch (NullPointerException e)块将捕获该异常,因为该异常不是从与之关联的try块中抛出的

请注意,这样嵌套try / catch块相对很少。尝试理解Java中异常的工作方式很好,但是在实际代码中并不是一个好主意。 (同样,捕获ArrayIndexOutOfBoundsExceptionNullPointerException在实际代码中很少是个好主意。)