代码之家  ›  专栏  ›  技术社区  ›  SMUsamaShah

异常类是已检查的还是未检查的异常[[副本]

  •  -1
  • SMUsamaShah  · 技术社区  · 6 年前

    Java docs 假设 Throwable ,除 RuntimeException Error ,是 选中的 java.lang.Exception 类的直接子类 java.lang.Throwable

    未检查的异常类是运行时异常类和错误类。

    捕捉未在try块中抛出的已检查异常只会为的子类提供编译错误 Exception ,不适用于 例外情况

    这是不是意味着 未检查

    public class CheckedExceptionTest {
        public static void good(){ System.out.println("I am good"); }
    
        public static void main(String []args){
            try {
                good();
            } catch (java.io.IOException e) { 
                // Compile error
                // exception IOException is never thrown in body of corresponding try statement
            }
        }
    }
    

    public class CheckedExceptionTest {
        public static void good(){ System.out.println("I am good"); }
    
        public static void main(String []args){
            try {
                good();
            } catch (java.lang.Exception e) { 
                // No compile error
            }
        }
    }
    
    1 回复  |  直到 4 年前
        1
  •  3
  •   Thomas    6 年前

    任何检查过的异常都必须声明或捕获,因此编译器知道某些代码可以抛出哪些检查过的异常。

    MySpecialException 那你就只能 为了抓住这个,如果它能宣布 throws Exception 那你就得抓住 Exception

    但是,使用泛型 抛出异常 catch(Exception e) 很少是个好主意,因此无论如何,您应该使用更具体的异常。

    另一方面,由于编译器知道哪些选中的异常可以在try块中抛出,因此它可以告诉您有关 从未 将被执行。不过,对于未检查的异常,情况并非如此。

    catch(IOException) catch(Exception) IOException 总是 例外情况 能够 也意味着 RuntimeException catch(异常) 如果有的话,我也会抓住的。

    根据使用位置的不同,其处理方式也有所不同:

    • 抛出异常 throw new Exception(...) 告诉编译器 选中的 必须处理异常
    • catch(异常) 告诉编译器 任何 异常,即检查 unchecked应该被处理,因为unchecked部分编译器不能抱怨。

    抛出异常 不同于,例如。 throws IOException 出于同样的原因:

    • 抛出异常 然后它将处理该方法,就好像它只抛出选中的异常一样(即,您必须捕获它们),但是由于 包含 运行期异常