异常处理:抓抛模型
捕获
异常处理方式:try-catch-finally , throws
try-catch-finally
使用
* try-catch-finally使用:
* try{
* 可能出现异常的代码
* } catch(异常类型1 变量名1) {
* 处理异常的方式1
* }catch(异常类型2 变量名2) {
* 处理异常的方式2
* }catch(异常类型3 变量名3) {
* 处理异常的方式3
* } finally{
* 一定会执行的代码
* }
说明
* 1.finally 是可选的,里面的代码一定会被执行
* 2.使用try将可能出现异常的代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配
* 3.一旦try中的异常匹配到某一个catch时,就进入catch中进行异常处理,处理完成就跳出当前的try-catch结构,继续执行后面的代码
* 4.catch中的异常类型如果没有字符类关系,则声明顺序没有要求,如果满足字符类关系,要求子类声明在父类的上面,否则报错为不可达代码
* 5.常用异常处理方式:String :getMessage()、printStackTrace()
* 6.在try结构中声明的变量只能在try结构中被调用
* 7.像数据库的连接,输入输出流,网络编程Socket等资源,JVM不能自动回收,需要手动进行资源释放,这些代码就可以放在finally中
* 8.try-catch结构可以嵌套
我们一般只在编译时可能会出现的异常加try-catch结构,运行时异常不用这个结构
try{
int[] array = new int[10];
array[10] = 10;
} catch (ArrayIndexOutOfBoundsException e){
System.out.println("数组越界异常");
} finally {
System.out.println("这里总会执行");
}
throws
使用
* 1.throws + 异常类型 写在方法的声明处,指明此方法执行时,可能会抛出的异常类型,一旦方法体执行出现异常就会将该异常抛出,其它地方调用此方法时
* 仍需要处理此异常
* 2.throws只是将异常抛给了方法的调用者,没有处理掉这个异常
public void method1() throws IOException {
int[] array = new int[10];
array[10] = 10;
}
public void method2(){
try {
method1();
} catch (IOException e) {
e.printStackTrace();
}
}
抛出
程序在运行过程中一旦出现异常,就会生成一个异常类对象,并将此对象抛出,一旦抛出对象,其后的代码就不再执行
* 抛:程序在运行过程中一旦出现异常,就会生成一个异常类对象,并将此对象抛出,一旦抛出对象,其后的代码就不再执行
* 关于异常对象的产生:1.系统自动生成的异常对象
* 2.手动生成的一个异常对象,并抛出(throw)
private int id;
public void setId(int id){
if (id > 0){
this.id = id;
} else {
throw new RuntimeException("输入的数据非法");
}
}
如果选择处理异常的方式
如果父类中被重写的方法没有throws方式处理异常,则子类重写方法也不能使用throws,如果子类需要处理异常就只能使用try-catch了
如何自定义异常类
- 继承于现有的异常结构:RuntimeException、Exception
- 提供全局常量serialVersionUID
- 提供重载的构造器
//自定义一个异常类
class MyException extends RuntimeException{
static final long serialVersionUID = -7034897190745766939L;
public MyException(){
}
public MyException(String msg){
super(msg);
}
}