【JAVA学习之路 | 提高篇】异常的处理(throws)与手动抛出异常(throw)

1.格式

除方法的声明外,可以使用"throws 异常对象"来处理编译类型异常.

如public void test () throws 异常类型1,异常类型二...{

    //编译时可能产生的异常.

}

2.是否真正处理了异常

(1). 从编译是否能通过的角度来看,看作为给出了要是出现了异常的解决方法,此时编译通过.

(2). 从另个角度来看,该方案只是将异常上抛给了调用者,调用者仍然需要考虑如何解决异常,故该方案并没有实际解决问题.

3.(联动)方法的重写

在方法的重写中,要求子类重写的方法throws的异常类型可以是父类被重写方法的异常类型相同,也可以是其子类.

举例 : IOException是FileNotFoundExcetion的父类.

class abstract Father throws IOException {

    public abstract void method() {

        //抛出IOException的代码,此处省略

}

}

class Son throws FileNotFountException {

    public void method() {

        //抛出FileNotFoundException异常的代码,此处省略.

}

}

父类的引用指向子类的对象,此时编译类型是Person,编译时期p.method()抛出的是IOException异常对象,故catch括号内捕获的是IOException异常对象.但运行阶段调用的是子类的method(),故抛出的是FileNotFoundException异常对象.如果catch语句内为IOException异常对象,相当于IOException e =new FileNotFoundException() ;此时再次体现多态性.如果catch语句中是IOException异常类的父类(如Exception),则违反了多态性.

Father p =new Son();

try{

    p.method();

} catch (IOException e){

    System.out.println(e.printStackException);

}

4.throw手动抛出异常对象

java中异常对象的生成方式有两种 : 

(1). 一种是JVM自动生成.程序运行过程中,JVM检查代码出了问题,针对该代码,在后台自动创建一个对应异常类型的类的异常对象.

(2). 另一种是使用throw手动抛出 : throw new 异常类型(实参列表).

5.使用场景

在实际开发中,如果出现不满足具体场景的代码问题,可以手动throw抛出指定类型的异常.

//test03抛出的异常抛给主函数,此时主函数必须对异常进行捕获
public static void main(String[] args) {
    try {
        test03();
    } catch (Exception e) {
        e.printStackException;
    }
}


//test01抛出的异常对象抛给了调用者test03
public void test03() throws Exception {
    test01();
}
public void test01() throws Exception {
        //手动抛出异常对象
        throw new Exception();
    }
    //可以try-catch-finally捕获,也可以将异常抛给调用者,
    //调用者要么再抛给调用者,要么try-catch-finally捕获异常
    public void test02() {
        try {
            throw new Exception();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值