Java 编译器何时要求我捕获异常?

Java 编译器何时要求我捕获异常?,java,Java,在函数f()中,我指定将抛出“MyException”异常,实际上我正在抛出一些与MyException无关的其他异常,但编译器仍然没有抱怨。为什么?ClassCastException扩展,这意味着它是扩展的,因此编译器不需要您处理它 从运行时异常的Javadoc中: 方法不需要在其throws子句中声明任何 RuntimeException的子类 可能在执行过程中抛出 使用该方法,但未捕获 ClassCastException扩展,这意味着它是扩展的,因此编译器不需要您处理它 从运行时异常的

在函数f()中,我指定将抛出“MyException”异常,实际上我正在抛出一些与MyException无关的其他异常,但编译器仍然没有抱怨。为什么?

ClassCastException扩展,这意味着它是扩展的,因此编译器不需要您处理它

运行时异常的Javadoc中:

方法不需要在其throws子句中声明任何 RuntimeException的子类 可能在执行过程中抛出 使用该方法,但未捕获


ClassCastException
扩展,这意味着它是扩展的,因此编译器不需要您处理它

运行时异常的Javadoc中:

方法不需要在其throws子句中声明任何 RuntimeException的子类 可能在执行过程中抛出 使用该方法,但未捕获


ide的答案是正确的-只有
java.lang.Exception
或子类(直接或间接)的异常被“检查”,而
java.lang.RuntimeException
或子类的异常不被检查。只需要声明从方法中抛出的已检查异常(包括那些声明由您调用的方法抛出的异常,您没有捕获这些异常)。这意味着不属于
Exception
s(混淆,呃?)的异常,例如
Error
的子类,也不需要声明。(您也可以直接将
Throwable
子类化,但通常不应该这样做。)

根据Java语言规范:

Java编程语言的编译器在编译时检查程序是否包含检查异常的处理程序,方法或构造函数的执行会导致哪些检查异常。对于每个可能产生的检查异常,方法(§8.4.6)或构造函数(§8.8.5)的throws子句必须提及该异常的类或该异常类的一个超类。编译时检查异常处理程序的存在是为了减少未正确处理的异常数量

未检查的异常类是类RuntimeException及其子类,以及类Error及其子类。所有其他异常类都是选中的异常类。JavaAPI定义了许多异常类,包括已检查和未检查的异常类。额外的异常类,无论是选中的还是未选中的,都可以由程序员声明。有关异常类层次结构以及Java API和Java虚拟机定义的一些异常类的说明,请参见§11.5

在throws子句中命名的已检查异常类是方法或构造函数的实现者和用户之间的契约的一部分。重写方法的throws子句不能指定此方法将导致抛出任何被重写方法不允许其throws子句抛出的已检查异常。当涉及接口时,单个重写声明可以重写多个方法声明。在这种情况下,覆盖声明必须有一个与所有覆盖声明兼容的throws子句(§9.4)


ide的答案是正确的-只有
java.lang.Exception
或子类(直接或间接)的异常被“检查”,而
java.lang.RuntimeException
或子类的异常不被检查。只需要声明从方法中抛出的已检查异常(包括那些声明由您调用的方法抛出的异常,您没有捕获这些异常)。这意味着不属于
Exception
s(混淆,呃?)的异常,例如
Error
的子类,也不需要声明。(您也可以直接将
Throwable
子类化,但通常不应该这样做。)

根据Java语言规范:

Java编程语言的编译器在编译时检查程序是否包含检查异常的处理程序,方法或构造函数的执行会导致哪些检查异常。对于每个可能产生的检查异常,方法(§8.4.6)或构造函数(§8.8.5)的throws子句必须提及该异常的类或该异常类的一个超类。编译时检查异常处理程序的存在是为了减少未正确处理的异常数量

未检查的异常类是类RuntimeException及其子类,以及类Error及其子类。所有其他异常类都是选中的异常类。JavaAPI定义了许多异常类,包括已检查和未检查的异常类。额外的异常类,无论是选中的还是未选中的,都可以由程序员声明。有关异常类层次结构以及Java API和Java虚拟机定义的一些异常类的说明,请参见§11.5

在throws子句中命名的已检查异常类是方法或构造函数的实现者和用户之间的契约的一部分。重写方法的throws子句不能指定此方法将导致抛出任何被重写方法不允许其throws子句抛出的已检查异常。当涉及接口时,单个重写声明可以重写多个方法声明。在这种情况下,覆盖声明必须有一个与所有覆盖声明兼容的throws子句(§9.4)


什么是RuntimeException好主意,我添加了来自Javadoc的链接/摘录。什么是RuntimeException好主意,我添加了来自Javadoc的链接/摘录。不要忘记错误及其子类。th
class MyException extends Exception {
    MyException() {}
    MyException(String msg) { super(msg);}
}
public class NewException {

    static void f() throws MyException {
        System.out.println("throwing exception from f()");
        throw new ClassCastException();
    }
    static void g() throws MyException {
        System.out.println("throwing exception from g()");
        throw new MyException("parametrized ");
    }
    public static void main(String ...strings ) {
        try { 
            f();
        }
        catch(MyException e) {
            e.printStackTrace(System.out);
        }
        try {
            g();
        }
        catch(MyException e) {
            e.printStackTrace(System.out);
        }
    }
}