JAVA - 捕获异常

前言:

       上文中我们提到了 关于 JAVA 的异常处理,由于异常在程序中是不可避免出现的,所以在了解异常之后我们需要通过一些方法把这些异常给捕获到,准确的捕获到异常出现的地方有利于我们提高我们程序的健壮性。 

 什么是Java捕获异常?

         当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获异常。

如何捕获异常?

        在Java中,凡是可能抛出异常的语句,都可以用try.....catch捕获,把可能发生异常的语句放在try{...} 中,然后使用catch 捕获

Java捕获异常的几个关键字:

try用于监听,将要被监听的代码(可能抛出异常的代码)放在try语句中,当try语句块内发生异常的时候,异常就会被抛出
catch 用于捕获异常,catch用来捕获try语句块中发生的异常
finally无论会不会有异常都执行finally

异常捕获的几种方法:

1.Catch语句捕获:

可以使用多个catch语句,每个catch分别捕获对应的Exception异常,当JVM在捕获到异常后,会从上到下匹配catch语句,匹配到某个catch后,执行catch语句块,然后不会再继续匹配,总之: 多个catch语句只有一个会被执行

public static void main(String[] args) {
    try {
        process1();
        process2();
        process3();
    } catch (IOException e) {
        System.out.println(e);
    } catch (NumberFormatException e) {
        System.out.println(e);
    }
}

注:  当存在多个catch的时候,catch的顺序非常重要,子类的异常要写在父类异常前面,如果把父类异常写在子类异常前面,那么子类异常将永远捕获不到

 

2.不使用catch,只使用try....finally结构:

public byte[] getBytes(String charsetName) throws UnsupportedEncodingException{

}

因为这个方法在声明的时候就抛出了可能出现的异常,所以不需要写catch

注意: 调用这种在声明的时候就已经抛出可能出现异常情况的方法,调用方在调用的时候就必须要强制捕获这些异常,否则编译器会出现错误

例子:

public class Main {
    public static void main(String[] args) {
        byte[] bs = toGBK("中文");
        System.out.println(Arrays.toString(bs));
    }

    static byte[] toGBK(String s) {
        try {
            // 用指定编码转换String为byte[]:
            return s.getBytes("GBK");
        } catch (UnsupportedEncodingException e) {
            // 如果系统不支持GBK编码,会捕获到UnsupportedEncodingException:
            System.out.println(e); // 打印异常信息
            return s.getBytes(); // 尝试使用用默认编码
        }
    }
}

如果我们不使用catch(UnsupportedEncodingException e)  来捕获异常,那么就会编译失败。

编译器会报错,错误信息类似:

unreported exception UnsupportedEncodingException; must be caught or declared to be thrown,并且准确地指出需要捕获的语句是return s.getBytes("GBK");。意思是说,像UnsupportedEncodingException这样的Checked Exception,必须被捕获。

 

这是因为我们的 getBytes()方法在声明的时候已经声明了异常。而且我们在toGBK()方法中调用了.getBytes(string)方法,就必须捕获这个异常

如果你不想在调用层里面捕获我们还有第二种方案:

那就是在toGBK后面加上 throws 

public class Main {
    public static void main(String[] args) {
        byte[] bs = toGBK("中文");
        System.out.println(Arrays.toString(bs));
    }

    static byte[] toGBK(String s) throws UnsupportedEncodingException {
        return s.getBytes("GBK");
    }
}

有些同学以为这就可以了?   NONONO  还差一步,那就是在Main函数中,因为toGBK()在Main函数中被调用了,所以必须在main()函数中进行捕获异常:

public class Main {
    public static void main(String[] args) {
        try {
            byte[] bs = toGBK("中文");
            System.out.println(Arrays.toString(bs));
        } catch (UnsupportedEncodingException e) {
            System.out.println(e);
        }
    }

    static byte[] toGBK(String s) throws UnsupportedEncodingException {
        // 用指定编码转换String为byte[]:
        return s.getBytes("GBK");
    }
}

通过这个例子我们可以知道:只要是声明的Checked Exception 不在调用层捕获,也需要在更高层捕获,所有未捕获的异常,也最终必须要main()方法中捕获

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值