下面是我试图理解的代码。
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”。
所以我知道问题的解决方案,但我想知道原因。我缺少什么见解?
任何人都可以解释它。
答案 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中异常的工作方式很好,但是在实际代码中并不是一个好主意。 (同样,捕获ArrayIndexOutOfBoundsException
和NullPointerException
在实际代码中很少是个好主意。)