04异常throws & try...catch

  Exception:异常   需要通过throws和try...catch去处理

a.运行时期异常:RuntimeException以及它的子类都属于运行时期异常
    表现形式为:代码编写的时候没有问题,但是一运行就报错                    
b.编译时期异常:Exception以及子类(除了RuntimeException之外)
    表现形式为:代码编写的时候没有语法错误,但是调用了某个方法,而这个方法底层抛出了一                个编译时期异常,导致我们的代码一用就爆红了

异常处理方式一_throws

 在方法的参数后面-> throws 异常

public class Demo04Exception {
    public static void main(String[] args)throws FileNotFoundException {
        String s = "abc.txt1";
        insert(s);
    }

    private static void insert(String s)throws FileNotFoundException{
        if (!s.endsWith("txt")){
            //故意造异常
            throw new FileNotFoundException("文件找不到了");
        }
        System.out.println("添加功能");
    }
}

处理异常,并不是将有异常的代码变成没有异常了,而是将编译时期异常出现的红线给消除掉

异常处理方式一_throws多个异常

 throws 异常1,异常2...

 如果有多个异常,并且多个异常之间有子父类继承关系,那么我们可以直接抛父类异常

无脑往上throws,最终还是给jvm了,jvm会终止程序的,所以无脑往上throws,会因为一个功能出现异常,导致其他功能全使用不了了,不负责任

异常处理方式二_try...catch

try{
      可能出现异常的代码
  }catch(异常 对象名){
      处理异常的代码 -> 打印异常信息 -> 将来都是将异常信息放到日志文件中
  }

如果try中有异常,马上catch,我们要catch到这个异常;如果没有catch到这个异常,相当于没有写try...catch编译时期异常的红线还会飘着

public class Demo07Exception {
    public static void main(String[] args) {
        String s = "abc.txt1";
        try {
            insert(s);
        }catch (FileNotFoundException ex){
            ex.printStackTrace();//将详细的异常信息打印到控制台上
        }
    }

    private static void insert(String s) throws FileNotFoundException {
        if (!s.endsWith("txt")) {
            //故意造异常
            throw new FileNotFoundException("文件找不到了");
        }
        System.out.println("添加功能");
    }
}

异常处理方式二_多个catch

如果catch的多个异常之间有子父类继承关系,我们可以直接catch父类异常

 public static void main(String[] args) {
        String s = "abc.txt1";
        try {
            //int[] arr = null;
            //System.out.println(arr.length);//NullPointerException

            insert(s);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        delete();
        update();
        select();
    }

    private static void select() {
        System.out.println("查询功能");
    }

    private static void update() {
        System.out.println("修改功能");
    }

    private static void delete() {
        System.out.println("删除功能");
    }

    private static void insert(String s) throws FileNotFoundException {
        if (!s.endsWith("txt")){
            //故意造异常
            throw new FileNotFoundException("文件找不到了");
        }
        System.out.println("添加功能");
    }

使用try...catch进行异常的处理,即使发生异常,也不影响后续代码的执行,(而不是像throws那样直接终止程序),保证了系统的运行.throws方式处理的异常在控制台只会显示一个,因为出一个异常上抛到JVM程序就结束了.

1.如果处理异常之后,还想让后续的代码正常执行,我们使用try...catch
2.如果方法之间是递进关系(调用),我们可以先throws,但是到了最后需要用try...catch做一个统一的异常处理

抛异常时注意的事项

1.父类中的方法抛异常了,子类重写之后,要不要抛?  可抛可不抛
2.父类中的方法没有抛异常,子类重写之后,要不要抛? 不要抛

finally关键字

try{
      可能出现异常的代码
  }catch(异常 对象名){
      处理异常的代码 -> 打印异常信息 -> 将来都是将异常信息放到日志文件中
  }finally{
     不管你有没有catch到异常,都一定会执行的代码块  
  }        

finally的使用场景:

针对于GC清理不掉的对象,我们只能自己手动清理,那么这些对象只要是new出来了后续是否使用了,或者使用的过程中是否有异常了,不管异常是否捕获到了,最后我们都应该手动清理

所以手动清理对象的代码应该放到finally里面--> finally的使用场景

打印异常信息的三个方法

String toString():异常类型以及异常信息
  Stirng getMessage():异常信息
  void printStackTrace() :打印异常信息是最全的 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值