【问题标题】:Exception Erring Out though handled [duplicate]尽管处理了异常错误[重复]
【发布时间】:2019-05-16 13:18:28
【问题描述】:

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

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 语句来处理它。

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

谁能解释一下。

【问题讨论】:

  • try 块没有抛出异常。

标签: java exception


【解决方案1】:

虽然我已经提供了下面的 catch 语句来处理它。

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

如果您将代码更改为:

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
  • final catch 块将捕获 NullPointerException 并将“异常”打印到控制台。重要的是,catch (NullPointerException e)不会捕获该异常,因为异常不是从与之关联的 try 块中引发的

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

【讨论】:

  • @VarunJain:那么您需要将 catch 块放在 try 块内。我将编辑我的答案以展示它是如何工作的 - 但我绝对确实了解问题本身。我可能不知道你想要达到什么目的,但那是另一回事......(你只是说你试图理解代码,这就是我解释的原因 它。)
  • 真的很抱歉这种语言。这样做不是为了侮辱这里的任何人。
猜你喜欢
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
相关资源
最近更新 更多