Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常MyExc3从未在相应try语句的主体中抛出_Java_Exception - Fatal编程技术网

Java 异常MyExc3从未在相应try语句的主体中抛出

Java 异常MyExc3从未在相应try语句的主体中抛出,java,exception,Java,Exception,我已经看到了一个类似的问题,但我还没有找到解决方案,因为在我的例子中,放入try子句的函数实际上抛出了一个异常 class MyExc1 extends Exception { } class MyExc2 extends MyExc1 { } class MyExc3 extends MyExc2 { } public class A1 { public static void main(String [] argv) { try {

我已经看到了一个类似的问题,但我还没有找到解决方案,因为在我的例子中,放入try子句的函数实际上抛出了一个异常

    class MyExc1 extends Exception { }
    class MyExc2 extends MyExc1 { }
    class MyExc3 extends MyExc2 { }

    public class A1 {
     public static void main(String [] argv) {
     try {
      m();
     } catch( MyExc3 k ) {
         System.out.print(1);
     } catch( Exception u ) {
     } finally {
        throw( new Exception() );
      }
    }

    static void m() {
      try {
       System.out.print(2);
       throw( new MyExc3() );
    }catch( MyExc3 z ) {
    System.out.print(3);
    }catch( Exception d ) {
       System.out.print(4);
    }finally {
       System.out.print(5);
     }
    }
   }
在我的try块中,psv main调用方法
m()打印2并引发名为MyExc3的异常。然后,这个异常应该由
catch(MyExcp3 z)
处理,它应该打印3,依此类推。但代码实际上并不编译:

异常MyExc3从未在相应try语句的主体中抛出


这是为什么?

您缺少方法签名上的
抛出部分

首先,您的代码(如现在所示)无法编译,因为您的
main()
可以抛出
Exception
,但不会声明它。当您修复该问题时,编译器会告诉您,
m()
不会抛出类MyExc3的已检查异常

因此:将
抛出异常
添加到
公共静态void main(…)
,对于
m()


这就是检查异常的要点:当您的方法使用
时,抛出一些checkedExceptionInstance
。。。然后,必须在该方法中捕获该异常,或者该方法必须通过
抛出specificexceptiontype
宣布它抛出了已检查的异常

您缺少方法签名上的
抛出
部分

首先,您的代码(如现在所示)无法编译,因为您的
main()
可以抛出
Exception
,但不会声明它。当您修复该问题时,编译器会告诉您,
m()
不会抛出类MyExc3的已检查异常

因此:将
抛出异常
添加到
公共静态void main(…)
,对于
m()


这就是检查异常的要点:当您的方法使用
时,抛出一些checkedExceptionInstance
。。。然后,必须在该方法中捕获该异常,或者该方法必须通过
抛出specificexceptiontype
宣布它抛出了已检查的异常

finally总是在运行try-and-catch之后运行(如果发生异常)。所以,在这种情况下,并没有什么可以处理从finally块抛出的异常。您可以通过添加以下内容来解决此问题:

public static void main(String [] argv) throws Exception {
    try {
        m();
    } catch( MyExc3 k ) {
        System.out.print(1);
    } catch( Exception u ) {
    } finally {
        throw( new Exception() );
    }
}
public static void main(String [] argv) {
    try {
        m();
    } catch( MyExc3 k ) {
        System.out.print(1);
    } catch( Exception u ) {
    } finally {
        try {
            throw( new Exception() );
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
或者通过这样做:

public static void main(String [] argv) throws Exception {
    try {
        m();
    } catch( MyExc3 k ) {
        System.out.print(1);
    } catch( Exception u ) {
    } finally {
        throw( new Exception() );
    }
}
public static void main(String [] argv) {
    try {
        m();
    } catch( MyExc3 k ) {
        System.out.print(1);
    } catch( Exception u ) {
    } finally {
        try {
            throw( new Exception() );
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
但仍然会出现编译错误。这是因为您在main中捕获了一个MyExc3异常,它不会被抛出main()。您在m()中引发了MyExc3异常。但是在m()中也发现了异常。因此,main()中没有出现MyExc3异常。为此,要引发MyExc3异常,您需要添加以下内容:

 static void m() throws MyExc3 {

finally总是在运行try和catch之后运行(如果发生异常)。所以,在这种情况下,并没有什么可以处理从finally块抛出的异常。您可以通过添加以下内容来解决此问题:

public static void main(String [] argv) throws Exception {
    try {
        m();
    } catch( MyExc3 k ) {
        System.out.print(1);
    } catch( Exception u ) {
    } finally {
        throw( new Exception() );
    }
}
public static void main(String [] argv) {
    try {
        m();
    } catch( MyExc3 k ) {
        System.out.print(1);
    } catch( Exception u ) {
    } finally {
        try {
            throw( new Exception() );
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
或者通过这样做:

public static void main(String [] argv) throws Exception {
    try {
        m();
    } catch( MyExc3 k ) {
        System.out.print(1);
    } catch( Exception u ) {
    } finally {
        throw( new Exception() );
    }
}
public static void main(String [] argv) {
    try {
        m();
    } catch( MyExc3 k ) {
        System.out.print(1);
    } catch( Exception u ) {
    } finally {
        try {
            throw( new Exception() );
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
但仍然会出现编译错误。这是因为您在main中捕获了一个MyExc3异常,它不会被抛出main()。您在m()中引发了MyExc3异常。但是在m()中也发现了异常。因此,main()中没有出现MyExc3异常。为此,要引发MyExc3异常,您需要添加以下内容:

 static void m() throws MyExc3 {

MyExc3是已检查的还是未检查的异常?我要猜猜看,编译器正在抱怨,因为pax main永远不会得到那个例外。我很欣赏这种快速回归。欢迎加入投票级别;-)MyExc3是已检查的还是未检查的异常?我要猜猜看,编译器正在抱怨,因为pax main永远不会得到那个例外。我很欣赏这种快速回归。欢迎加入投票级别;-)