处理异常的机制

异常

1.开发中的语法错误和逻辑错误不是异常

2.对于运行时的异常,可以不做处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响

 执行中的异常可分为两大类:
 (1)Error(错误):java虚拟机无法解决的严重问题,如:JVM系统内部错误,资源耗尽等严重情况,比如:StackOverflowError(栈溢出)和OOM(out of memory) , Error是严重错误,程序会崩溃
 (2)Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理,例如空指针访问,试图读取不存在的文件,网络连接中断等等。。。。
  Exception分为两大类: 运行时异常(程序运行时发生的异常)
                     编译时异常(编程时,编译器检查出的异常)

 虚线:实现  实线:继承

常见的运行时异常

 1.NullPointerException空指针异常
 2.ArithmeticException数字运算异常
 3.ArrayIndexOutOfBoundsException数组下标越界异常
 4.ClassCastException类型转换异常
 5.NumberFormatException数字格式不正确异常
 //1.NullPointerException空指针异常
 ​
 public class Test  {
     public static void main(String[] args) {
         String name = null;
         //空指针异常
         System.out.println(name.length());
     }
 }
 ​
 //2.ArithmeticException数字运算异常
   
 public class Test  {
     public static void main(String[] args) {
         int num1 = 10;
         int num2 = 0;
         //数字运算异常
         int res = num1 / num2 ;
     }
 }
 //3.ArrayIndexOutOfBoundsException数组下标越界异常
 public class Test  {
     public static void main(String[] args) {
         int[] arr = {12 , 33 , 66 , 99};
         for (int i = 0; i <= arr.length; i++) {
             System.out.print(arr[i] + " ");
         }
     }
 }
 //4.ClassCastException类型转换异常
 public class Test  {
     public static void main(String[] args) {
         A b = new B(); //向上转型
         B b1 = (B)b;   //向下转型
         //类型转换异常
         C b2 = (C)b;
     }
 }
 class A{ }
 class B extends A{ }
 class C extends A{}
 //5.NumberFormatException数字格式不正确异常
 public class Test  {
     public static void main(String[] args) {
         String name = "张三";
         //数字格式不正确异常
         int num = Integer.parseInt(name);
     }
 }

常见的编译异常

SQLException操作数据库时,查询表可能发生的异常
IOException操作文件时,发生异常
FileNotFoundException操作一个不存在文件时,发生异常
ClassNotFoundException加载类,而该类不存在时,发生异常
EOFException操作文件,到文件末尾,发生异常
ILLegalArguementException参数异常

try-catch异常处理

1.try - catch - finally
    程序员在代码中捕获发生的异常,自行处理
     try {
            int num;   //代码、可能有异常
        } catch (Exception e) {
            e.printStackTrace();
            //捕获到异常,当异常发生时,系统将异常封装成Exception  				对象 e 传递给catch
            //得到异常对象后,程序员,自己处理
            //没有异常发生不执行catch
        }finally {
            //不管是否有异常发生,始终要执行finally
            //finally通常将释放资源的代码放在这里
        }
2.throws
    将发生的异常抛出,交给调用者来处理,最顶级的处理者就是JVM
    

细节

1.如果异常发生了,则异常后面的代码不会执行,直接进入到catch块

2.如果异常没有发生,则顺序执行try不会进入到catch

3.如果希望不管是否发生异常,都执行某段代码块(比如关闭连接 ,释放资源等)执行try - catch - finally

4.可以有多个catch语句,捕获多个不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,,如果发生异常只会匹配一个catch

5.可以进行 try-catch 配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉、退出。应用场景:不管是否发生异常,都必须执行某个业务逻辑

总结

1.先执行try,再执行catch,再执行finally,最后执行return(return返回的数值如果在finally前面,需要先将数值保存到temp中)

throws异常处理(抛出异常)

1.子类重写父类方法时,对抛出的异常规定:子类重写方法抛出的异常要么与父类抛出的一致,要么为父类抛出异常类型的子类型

2.try-catch 与抛出异常(throws)二选一

3.抛出编译异常谁调用谁处理,抛出运行异常不要求程序员显示处理,有默认的处理机制

`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值