Java异常处理流程,Java高级面试题库

通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用 throws 关键字声明可能会抛出的异常。

注意

  • 非检查异常(Error、RuntimeException 或它们的子类)不可使用 throws 关键字来声明要抛出的异常。

  • 一个方法出现编译时异常,就需要 try-catch/ throws 处理,否则会导致编译错误。

抛出异常


如果你觉得解决不了某些异常问题,且不需要调用者处理,那么你可以抛出异常。

throw关键字作用是在方法内部抛出一个Throwable类型的异常。任何Java代码都可以通过throw语句抛出异常。

捕获异常


程序通常在运行之前不报错,但是运行后可能会出现某些未知的错误,但是还不想直接抛出到上一级,那么就需要通过try…catch…的形式进行异常捕获,之后根据不同的异常情况来进行相应的处理。

如何选择异常类型


可以根据下图来选择是捕获异常,声明异常还是抛出异常

在这里插入图片描述

常见异常处理方式


[](

)直接抛出异常

通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用 throws 关键字声明可能会抛出的异常。


private static void readFile(String filePath) throws IOException {

    File file = new File(filePath);

    String result;

    BufferedReader reader = new BufferedReader(new FileReader(file));

    while((result = reader.readLine())!=null) {

        System.out.println(result);

    }

    reader.close();

} 

[](

)封装异常再抛出

有时我们会从 catch 中抛出一个异常,目的是为了改变异常的类型。多用于在多系统集成时,当某个子系统故障,异常类型可能有多种,可以用统一的异常类型向外暴露,不需暴露太多内部异常细节。


private static void readFile(String filePath) throws MyException {    

    try {

        // code

    } catch (IOException e) {

        MyException ex = new MyException("read file failed.");

        ex.initCause(e);

        throw ex;

    }

} 

[](

)捕获异常

在一个 try-catch 语句块中可以捕获多个异常类型,并对不同类型的异常做出不同的处理


private static void readFile(String filePath) {

    try {

        // code

    } catch (FileNotFoundException e) {

        // handle FileNotFoundException

    } catch (IOException e){

        // handle IOException

    }

} 

同一个 catch 也可以捕获多种类型异常,用 | 隔开


private static void readFile(String filePath) {

    try {

        // code

    } catch (FileNotFoundException | UnknownHostException e) {

        // handle FileNotFoundException or UnknownHostException

    } catch (IOException e){

        // handle IOException

    }

} 

[](

)自定义异常

习惯上,定义一个异常类应包含两个构造函数,一个无参构造函数和一个带有详细描述信息的构造函数(Throwable 的 toString 方法会打印这些详细信息,调试时很有用)


public class MyException extends Exception {

    public MyException(){ }

    public MyException(String msg){

        super(msg);

    }

    // ...

} 

[](

)try-catch-finally

当方法中发生异常,异常处之后的代码不会再执行,如果之前获取了一些本地资源需要释放,则需要在方法正常结束时和 catch 语句中都调用释放本地资源的代码,显得代码比较繁琐,finally 语句可以解决这个问题。


private static void readFile(String filePath) throws MyException {

    File file = new File(filePath);

    String result;

    BufferedReader reader = null;

    try {

        reader = new BufferedReader(new FileReader(file));

        while((result = reader.readLine())!=null) {

            System.out.println(result);

        }

    } catch (IOException e) {

        System.out.println("readFile method catch block.");

        MyException ex = new MyException("read file failed.");

        ex.initCause(e);

        throw ex;

    } finally {

        System.out.println("readFile method finally block.");

        if (null != reader) {

            try {

                reader.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值