- 运行异常并不一要求显示处理,因为有默认处理机制throws
- 编译异常要求必须显示处理,使用try-catch或throws
try-catch
快捷键:Ctrl + Alt + t
类别
Error(错误):java虚拟机无法解决的严重问题。如JVM系统内部错误、资源耗尽等严重情况,栈溢出,程序崩溃
Exception(异常):其他因编程或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。如空指针访问,试图读取不存在的文件等
- Exception类别:运行时异常和编译时异常
常见运行时异常
- NullPointerException:空指针异常
- ArithmeticException:数学运算异常
- ArrayIndexOutOfBoundsException:数组下标越界异常
- ClassCastException:类型转换异常
- NumberFormatException:数字格式不正确异常
常见编译时异常
- SQLException:操作数据库时,查询表可能发生异常
- IOExceptin:操作文件时,发生的异常
- FileNotFoundException:当操作一个不存在的文件时,发生异常
- ClassNotFoundException:加载类,而该类不存在时,异常
- EOFException:操作文件,到文件末尾,发生异常
- IllegalArguementException:参数异常
try-catch-finally
- try代码块如果有多个异常,可以使用多个catch分别捕获不同的异常,相应处理
- 条件:要求子类异常写在前面,父类异常写在后面
- try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉
try {
代码(可能有异常)
}catch(Exception e) {
// 捕获到异常
// 当异常发生时,系统将异常封装成Exception对象e,传递给catch
// 得到异常对象后,自行处理
}finally {
// 不管try代码块是否有异常发生,始终要执行finally代码块
// 通常将释放资源的代码放在此处
}
细节
执行顺序
- 如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句
- 如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还需要执行finally里面的语句!
throws
将异常抛回调用它的地方,若一直使用throws,最终会抛回给 JVM
如果是运行异常不用try-catch默认使用throws
- 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理而由该方法的调用者负责处理
- 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以说方法中产生的异常类型,也可以是它的父类
package com.xiaolu.exception_;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* @author 林小鹿
* @version 1.0
*/
public class Throws01 {
public static void main(String[] args) {
}
// 也可以用Exception替代
public void f1() throws FileNotFoundException,NullPointerException {
// 创建一个文件流对象
// 使用throws,抛出异常,让调用f2方法的调用者(方法)处理
// throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
// throws 关键字后面也可以是 异常列表 ,即可以抛出多个异常
// 编译异常
FileInputStream fis = new FileInputStream("d://aa.txt");
}
}
- 使用throws,抛出异常,让调用f2方法的调用者(方法)处理
- throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
- throws 关键字后面也可以是 异常列表 ,即可以抛出多个异常
- 如果是编译异常则必须处理
自定义异常
当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设置异常类,用于描述改错误信息
步骤
- 定义类:自定义异常类名,继承Exception或RuntimeException
- 如果继承Exception,属于编译异常
- 如果继承RuntimeException,属于运行异常,一般是继承RuntimeException,因为可以使用默认的处理机制
代码
package com.xiaolu.exception_;
/**
* @author 林小鹿
* @version 1.0
*/
public class CustomException_ {
public static void main(String[] args) {
// 要求范围在 18 - 120 之间,否则抛出一个自定义异常
int age = 800;
if (!(age >= 18 && age <= 120)) {
throw new AgeException("年龄需要在18~120之间");
}
System.out.println("你的年龄范围正确");
}
}
// 自定义异常
// 一般是继承RuntimeException,因为可以使用默认的处理机制
class AgeException extends RuntimeException {
public AgeException(String message) {
super(message);
}
}
throw和throws的区别
throws:处理异常的一种方式,放于方法声明处,后面跟异常类型
throw:手动生成异常对象的关键字,放于方法体中,后面跟异常对象
本文含有隐藏内容,请 开通VIP 后查看