异常处理机制

异常处理机制

捕捉异常

try……catch来捕获错误

try {
    String s = processFile(“C:\\test.txt”);
    // ok:
} catch (FileNotFoundException e) {
    // file not found:
} catch (SecurityException e) {
    // no read permission:
} catch (IOException e) {
    // io error:
} catch (Exception e) {
    // other error:
}

  • 这个过程将一直继续下去,直到异常被处理。这一过程称为捕获(catch)异常。如果一个异常回到 main() 方法,并且 main() 也不处理,则程序运行终止
  • 必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,这种类型的异常称为Checked Exception。 不需要捕获的异常,包括Error及其子类,RuntimeException及其子类。

多个catch和finally

public static void main(String[] args) {
    try {
        process1();
        process2();
        process3();
    } catch (UnsupportedEncodingException e) {
        System.out.println("Bad encoding");
    } catch (IOException e) {
        System.out.println("IO error");
    } finally {
        System.out.println("END");
    }
}

抛出异常

在Java中,throwthrows 关键字都是与异常处理相关的,但它们的用法和目的不同:

throw

  • throw 关键字用于在代码中手动抛出一个异常。它可以用来抛出任何类型的 Throwable 对象,包括 ErrorException 及其子类。
  • throw 后面通常跟一个异常对象,这个对象可以是Java内置的异常类型,也可以是用户自定义的异常类型。
  • throw 可以在任何代码块中使用,包括 trycatchfinally 块之外。

throws

  • throws 关键字用于在方法签名中声明该方法可能会抛出的异常类型。这相当于是一个“提前告知”,告诉调用者这个方法在执行过程中可能会抛出的异常类型。
  • throws 后面跟着的是异常类型的列表,调用者需要处理这些异常,要么通过 try-catch 块捕获它们,要么在调用该方法的其它方法的签名中继续使用 throws 声明。
  • throws 只能用于方法的声明中。

下面是 throwthrows 的使用示例:

public class ExceptionExample {
    
    // 使用 throw 抛出一个异常
    public static void checkValue(int value) throws Exception {
        if (value < 0) {
            throw new Exception("Negative value is not allowed.");
        }
    }

    // 使用 throws 声明方法可能会抛出的异常
    public static void main(String[] args) {
        try {
            checkValue(-1);
        } catch (Exception e) {
            System.out.println("Caught an exception: " + e.getMessage());
        }
    }
}

在这个示例中,checkValue 方法使用 throw 抛出了一个 Exception 对象,因为它检测到一个负值。同时,checkValue 方法的声明中使用了 throws 关键字来声明它可能会抛出 Exception

总结区别:

  • throw 是用来抛出一个异常实例。
  • throws 是用来声明方法可能会抛出的异常类型。

异常的传播

public class Main {
    public static void main(String[] args) {
        try {
            process1();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static void process1() {
        process2();
    }
    
    static void process2() {
        Integer.parseInt(null); // 会抛出NumberFormatException
    }

}
posted @ 2024-08-05 15:39  wen-210162704027  阅读(3)  评论(0编辑  收藏  举报