异常概述
1.异常的介绍
- 异常就是在程序运行的过程中所发生的不正常的事件,它会中断指令的正常执行。、
- 常见原因
- 输入错误、设备错误、代码错误、磁盘空间不足……
- 最主要的还是代码错误
2.异常的结构层次
Java提供异常类来表示程序运行中发生的异常,其中throwable
为基类,其下分为Error
和Exception
两类
Error
类- 运行系统中的内部错误以及资源耗尽错误
- 唯一的解决办法就是让程序尽早终止
Exception
类- 运行时异常
(RuntimeException)
- 在 Java 虚拟机正常运行期间抛出的异常,由程序错误导致。
- Java编译器允许程序中不对这类异常做出处理。
- 错误的类型转换、数组下标越界、访问空指针等
- 运行时异常
3.异常的后果
- 会造成:丢失用户数据、程序崩溃……
- 应当做到向用户通告错误,保存所有的操作结果,允许用户以适当的形式退出程序
常见的异常
1.未检查异常
编译器不要求强制处置的异常,虽然你有可能出现错误,但是不会在编译的时候检查
-
空引用异常
NullPointerException
Student stu = null;//stu没有进行初始哈,编译错误 if(null != stu) stu.setName("张三");//可通过判断是否为空跳过
-
算术异常
ArithmeticException
int a = 10, b = 0; int c = a / b;//除数不可为0
-
数组下标越界异常
ArrayIndexOutOfBoundsException
int[] nums = {1, 2, 3}; System.out.println(nums[3]);//访问无效数组下标
-
字符串下标越界异常
StringIndexOutOfBoundsException
String str = "abc"; System.out.println(str.charAt(3));//访问无效字符串位置下标
-
类型转换异常
ClassCastException
Object obj = "abc";//向上转型,基类类型的引用不能直接调用 String str1 = (String)obj; System.out.println(str1.charAt(0)); //判断能否进行转型 if(obj instanceof Student){ Student stu1 = (Student)obj; }
2.检查异常
检查异常也叫受检异常,程序在编译阶段,编译器要求必须去处理的
- 除了
RuntimeException
与其子类,以及错误Error
,其他的都是检查异常 - 如:IO异常、SQL异常
处理异常的机制
1.捕获异常
-
若当前方法有能力处理异常,就捕获并处理它
-
应用
try—catch—finally
语句块try{ Class.forName("net.Student");//主动加载一个类 }catch (ClassNotFoundException e){//捕获的异常类型(空格)标识符(类似方法的形参) //处理异常的代码 System.out.println("发生了异常"); e.printStackTrace();//打印异常的堆栈信息 }finally{//不论是否发生异常,均会执行 System.out.println("finallly语句块"); //资源的回收操作 }
-
捕获的异常和真实发生的异常类型匹配执行(异常类型的基类也可)
-
捕获是基类类型,真实发生的是子类类型,也可以匹配执行
-
子类类型放在上边,基类类型放在下边
-
catch
与finally
不能同时省略,无catch
时finally
必须紧跟try
2.抛出异常
-
调用异常的方法来处理这些异常,叫抛出异常
-
声明异常使用
throws
关键字,表示该方法可能要抛出异常public static int getLength(int[] nums)throws NullPointerException{ if(null == nums){ NullPointerException e = new NullPointerException(); throw e;//抛出异常的动作,当前语句执行时表示真的放生了异常 }else{ return nums.length; } }