【问题标题】:Exception Handling Java异常处理 Java
【发布时间】:2013-09-07 15:05:15
【问题描述】:
class chain_exceptions{
   public static void main(String args[]){
      try
      {
         f1();
      }
      catch(IndexOutOfBoundsException e)
      {
         System.out.println("A");
         throw new NullPointerException(); //Line 0
      }
      catch(NullPointerException e) //Line 1
      {
         System.out.println("B");
         return;
      }
      catch (Exception e)
      {
         System.out.println("C");
      }
      finally
      {
         System.out.println("D");
      }
      System.out.println("E");
   }

   static void f1(){
      System.out.println("Start...");
      throw new IndexOutOfBoundsException( "parameter" );
   }
}

我希望第 1 行捕获从第 0 行抛出的 NullPointerException,但它没有发生。

但是为什么会这样呢?

当定义了另一个catch块时,为什么Line1的NPE处理程序不能捕捉它?

是不是因为“抛出”直接进入了main()方法?

【问题讨论】:

标签: java


【解决方案1】:

Catch{ . . . } 块与 try{ . . . } 块相关联。 catch 块只能捕获从 try 块抛出的异常。第一个 catch 块之后的其他 catch 块与 try 块无关,因此当您抛出异常时,它们不会被捕获。或者main() 不会捕获异常。

每个 catch 块的一种 this 会做你想做的事情。

try{
  try
  {
     f1();
  }
  catch(IndexOutOfBoundsException e)
  {
     System.out.println("A");
     throw new NullPointerException(); //Line 0
  }
}
catch(NullPointerException e) //Line 1
{
     System.out.println("B");
     return;
}

【讨论】:

  • 大声笑,是的。我认为 OP 只是想知道什么可以解决他的问题。
【解决方案2】:

您不能在另一个 catch 块中出现 catch 异常,因为您可能需要在第一个 catch 块中执行类似的操作

System.out.println("A");
try{
     throw new NullPointerException(); //Line 0
}    
catch(NullPointerException e) //Line 1
{      
     System.out.println("B");
     return;
}

【讨论】:

    【解决方案3】:

    你的预期不正确:

    catch 块与 try 块相关联。因此,一旦在 try 内引发异常,它就会离开该范围。现在您在try 的范围之外,这意味着您不再在任何try/catch 块中。这里抛出的任何异常(当你重新throw 时)都不会被任何东西捕获,是的,从main 中冒出。

    【讨论】:

      【解决方案4】:

      从 java 7 开始,您可以使用下面的代码或其他选项是嵌套 try catch 语句,java 中没有其他选项

      try { 
       ...
      } catch( indexoutofboundsexception| nullpointerexception ex ) { 
        logger.log(ex);
        throw ex;
      }
      

      【讨论】:

        【解决方案5】:

        不,它没有被捕获的原因是它不在链接到 catch 块的 try 块中。如果您也想捕获该异常,则必须将 throw 包装在一个新的 try/catch 组中。你为什么要这样做,对我来说是个谜。

        顺便说一句,你还可以做什么:

        catch (IndexOutOfBoundsException|NullPointerException e)
        

        这也将允许您对多种类型的异常使用相同的 catch 块。

        【讨论】:

          【解决方案6】:

          第二个catch 没有从第一个catch 块中捕获异常。您必须添加另一个 try-catch 第一个 catch 块(或围绕您已经拥有的整个 try-catch)才能按预期运行。 p>

          【讨论】:

            【解决方案7】:

            简短回答:是的,throw 将直接将异常抛出到 main 方法。

            一般来说,一旦catch 块被执行,它的行为就像else if,也就是说,它不会考虑其他替代方案。

            【讨论】:

              【解决方案8】:

              因为f1() 抛出IndexOutOfBoundsException

              try
                    {
                       f1(); //throws IndexOutOfBoundsException
                    }
                    catch(IndexOutOfBoundsException e) //gets caught here immediately and does not check other catch blocks
                    {
                       System.out.println("A");
                       throw new NullPointerException(); //Line 0
                    }
              

              【讨论】:

                【解决方案9】:

                您的catch 子句仅捕获f1() 抛出的异常。它们不会调用同一 try-catch-finally 构造的其他 catch 子句中引发的异常。

                【讨论】:

                  【解决方案10】:

                  catch 语句仅捕获从 try { ... } 块抛出的异常。

                  NullPointerException 是从 catch { ... } 块而不是 try { ... } 块抛出的。

                  要捕获catch 块引发的异常,您需要将另一个 try 块放入其中。在外面,包裹原来的try...catch 也可以。

                  【讨论】:

                    【解决方案11】:

                    catch 块仅用于 try 块。它们不会从其他 catch 块中捕获异常。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-06-03
                      • 2020-12-09
                      • 1970-01-01
                      相关资源
                      最近更新 更多