一、异常概述
异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
1、传统处理异常的方式(if else): [1]业务逻辑和处理异常的判断逻辑耦合在一起。[2]代码冗余
2、Java使用异常处理机制为程序提供异常处理的能力。异常处理机制完成后,程序可以继续执行
3、异常的常见方法:printStackTrace() 输出异常的堆栈信息,第一行:表示异常类型和异常描述(可为空),最后一行:包含异常的类、方法、具体代码行号
getMessage() 获取异常的描述
toString() 返回异常的类型和异常描述
4、try-catch:try{} 代码块用于执行可能存在异常的代码,catch{}代码块用于捕获并处理异常。
[1]正常执行,try→try-catch块后的代码段
[2]异常发生,try{} 代码块内某行代码产生异常,jvm创建一个具体异常对象ex,try{} 内不再向下执行,找到catch(Exception e){}捕获并处理异常
在异常捕获过程中需要进行异常类型匹配,若e=ex(多态)
[3]匹配异常类型不匹配,程序直接中断
5、try-catch-finally:try{} 执行可能有异常的代码,catch{}捕获并处理异常,finally{}用于回收资源(关闭文件、关闭数据库、关闭管道)的代码。
finally代码块不管是否出现异常,都必须执行。finally唯一不执行的情况:System.exit(0) jvm正常退出。
try{}内存在return时,try→finally→return; catch{}内存在return时,try→catch→finally→return
6、多重catch,书写原则:[1]异常子类先匹配。[2]异常父类后匹配,用于默认匹配。
二、异常分类
Throwable 类是 Java中所有错误或异常的父类。Throwable有两个子类Error和Exception。
1、Error(错误):仅靠程序本身无法恢复的严重错误。除了尽力使程序安全退出外,其他方面无能为力,例如:jvm崩溃、jvm内存耗尽、动态链接异常。
2、Exception:靠程序本身通过异常处理机制能处理的非正常情况。分为两类:
①运行时异常:运行时异常,不要求程序必须做出处理。RuntimeException是所有运行时异常的父类。
即使没用try-catch或throws处理,仍可以编译和运行。若运行时发生异常,会输出异常的堆栈信息并中止程序执行。
②检测时异常:除运行时异常外的其他异常类都是检测时异常,程序必须处理,否则出现编译错误,无法通过编译。但Java不存在该类。
3、常见的运行时异常:
InputMismatchException:控制台输入不匹配异常 ArithmeticException:算术计算异常。例如:除数为0
ArrayIndexOutOfBoundsException:数组下标越界 NullPointerException:空指针异常
IllegalArgumentException:方法接收到非法参数 ClassCastException:强制类型转换异常
NumberFormatException:数组格式化异常。如把"abc"转成数字 NoSuchElementException:表明枚举中没有更多的元素
ConcurrentModificationException:并发操作异常
4、常见的检查时异常
ClassNotFoundException:无法找到类异常 SQLException:数据库操作异常。
FileNotFoundException:文件未被发现 IOException:IO异常
ParseException:解析异常 TimeoutException:超时异常
InterruptedException:中断异常。
三、声明异常
throws:定义方法时,事先知道方法在调用时会有异常,但不知该如何处理,此时可在该方法上声明异常。表示方法调用时会有异常,请调用者自行处理。
一个方法可以声明多个异常,用,号分割。声明异常和方法重写有关系(“可犯小错”):
[1]如果父类声明了异常(检查时或运行时),子类可以完全遵循父类异常,也可以不声明异常。
[2]如果父类完全没有声明异常,子类可完全遵循父类异常,也可声明RuntimeException,但不能声明Exception。
[3] 如果父类声明了运行时异常,子类可完全遵循父类异常,也可不声明异常。
四、throw
当系统异常满足不了开发需要时,开发者可以自行根据需要自行抛出异常。throw 用于手动抛出异常。
e.g:public void a() throws Exception{if...else {throw new Exception("...");}}
可以自定义异常类。自定义异常类步骤:
[1] 确定异常类型。继承Excepion 或者RuntimeException
[2] 编写自定义异常类,并实现构造方法。
[3] 在方法需要的地方手动声明并抛出异常。
五、throw和throws的区别
1、作用不同:throw用于程序员自行产生并抛出异常;throws用于声明在该方法内抛出了异常。
2、使用的位置不同:throw位于方法体内部,可作为单独语句使用;throws必须跟在方法参数列表之后,不能单独使用。
3、内容不同:throw抛出一个异常对象,且只能是一个;throws后面跟异常类,而且可以有多个。