Java异常处理
导读
在日常的生活中,生活不是如我们所想的一帆风顺,也会遇到各种事情而不顺心,如汽车开到半截没油了、
想玩电脑停电等等,这些例子有很多,但我们都不会驻留此处,人生本身就可以说是一个程序,都是为了
得到结果而努力,同样程序运行也会出现非正常的现象,有除数为0、文件不存在,文件不能打开、网络
连接中断,内存不够用等,这些非正常现象被称为运行错误,根据错误性质可以将运行错误分为两类:
致命性错误***和***非致命性的异常。
致命性错误
例如:程序进入了死循环或者递归无法结束或内存溢出,这些是运行错误是致命性的(专业术语:“错误”)。
解决的方法:只能在编程阶段解决,运行这个程序本身无法解决,只能依靠其他程序干预,否则一直会处于
非正常状态。
非致命性异常
如运算时除数为0,或操作超出数据范围,或打开一个文件时发现文件并不存在,或欲装入的类文件丢失,
或网络连接中断等,这现象称为非致命性异常(简述:异常)。
**解决方法:**通过在源程序中,加入异常处理代码,当程序运行中出现异常时,有异常处理代码调整程序运行方向
加入异常处理代码,当程序运行中出现异常时,由异常处理代码调整程序运行方向,使程序仍可继续运行直至
正常结束。
异常是可以检测和处理的,所以产生了相应的异常处理机制。
目前大多数面向对象语言都提供异常处理机制,而错误处理一般由系统承担,语言本身不提供错误处理机制。
概念
Java中的异常处理是以面向对象为基础的一种运行态错误处理机制,通过对异常信息的封装实现对用户非法操作、参数设置异常、硬件系统异常,运行时网络状态更换等在运行态中可能出现的异常信息的处理机制。
异常处理的类层次
Java通过错误类(Error)和异常类(Exception)来处理错误和异常,他们都是Throwable类的子类,Throwable
类的继承体系
错误类(Error):java虚拟机无法解决的严重问题。如:jvm系统内部错误、资源耗尽等严重情况。
异常类(Exception):其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性代码进行处理。
例如空指针访问,试图读取不存在的文件,网络连接中断,Exception分为两大类:运行时异常[]和编译时异常[].
**注意:**对于运行时异常,可以不作处理。因为这类很普通,全处理会对程序的可读性和运行效率产生影响。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ISvXhIxr-1631688511943)(images\异常处理层次.jpg)]
常见的运行时异常
-
NullPointerException 空指针异常 2.ArithmeticException 数学运算异常
3.ArrayIndexOutOfBoundException 数组下标越界异常
4.ClassCastException 类型转换异常 5.NumberFormatException 数字格式不正确异常[]
练习
try {
Cat cat = new Cat();
cat = null;
System.out.println(cat.name);
}catch (Exception d){
System.out.println("异常问题:"+d.fillInStackTrace());
}//空指针异常
try {
String friends[] = {"tom","jack","malin"};
for (int i = 0;i<4;i++){
System.out.println(friends[i]);
}
}catch (Exception a){
System.out.println("输出异常原因"+a.fillInStackTrace());
//数组溢出
}
try {
int y;
LianXi3 a = new LianXi3();
y = 3/a.x;
}catch (Exception f){
System.out.println("输出异常原因"+f.fillInStackTrace());
}
System.out.println("program ends ok");
//算数异常
异常处理方法
基本介绍
异常处理就是当异常发生时,对异常处理的方式
异常处理的方式
1.try-catch - finally
程序员在代码中捕获发生的异常,自行处理
2.throws
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是jvm
多个catch块
一个catch只能处理一类异常,当try块中的语句组可能抛出多种异常时,就需要有多个
catch块来分别处理各种异常。
try{
int a= args.length;
System.out.println("a="+a);
int b= 42/a; int c[] ={1}; c[42] = 99;
}catch(ArithmeticException e){
System.out.println("div by 0:"+e);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("array index oob:"+e);
}
一个异常对象能否被一个catch块接收主要看该异常对象与catch块中声明的异常类的匹配情况,
当他们满足下面条件中的任一条时,异常对象被将被接受
异常对象是catch块中声明的异常类的实例;
异常对象是catch块中声明的异常类的子类的实例;
异常对象实现了catch块中声明的异常类接口。
当使用多个catch块时,需注意catch子句排列顺序—先特殊到一般,也就是子类在父类前面。如果在父类后面,子类将永远不会到达。
try语句嵌套
一个try语句可以在另一个try块内部----try语句的嵌套。
每次进入try语句,异常的前后关系都会被压入堆栈。如果一个内部的try语句不包含特殊异常的catch处理程序,堆栈将弹出,下一个try语句的catch处理程序将检查是否与之匹配。
这个过程将继续知道catch语句匹配成功,或者是直到所有的嵌套try语句被检查耗尽。
如果没有catch语句匹配,Java的运行时系统将处理这个异常。
finally语句块
某些情况下,不管异常是否发生,都需要处理某些语句,那么放到finally语块中。finally语句所包含的代码在任何
情况下都会被执行。
一个try语句至少有一个catch语句或finally语句与之匹配,但匹配的catch可以多个,而finally只有一个,并且
finally不是必须有的。
自定义异常
自定义异常的步骤
1.定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException
2.如果继承Exception,属于编译正常
3.如果继承RuntimeException,属于运行异常(一般来说,继承RuntimeException)
throw和throws的区别
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |
public static void main(String[] args) throws IOException {
//声明路径地址
String filepath = "D:\\FFOutput\\1.txt";
//声明条件
int read =0;
//创建导入路径地址的字节输入流的实例化
FileInputStream fileInputStream = new FileInputStream(filepath);
//创建一个死循环直到输出所有的字节
while ((read = fileInputStream.read()) != -1){
System.out.print((char) read);
}
//关闭输入流
fileInputStream.close();
}
= new FileInputStream(filepath);
//创建一个死循环直到输出所有的字节
while ((read = fileInputStream.read()) != -1){
System.out.print((char) read);
}
//关闭输入流
fileInputStream.close();
}