异常以及异常处理

异常概述

异常:异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。简单来说就是程序出现了不正常的情况。

异常本质就是Java当中对可能出现的问题进行描述的一种对象体现。

常见异常:

除数不能为0异常(ArithmeticException)

空指针异常(NullPointException)

数组越界异常(ArrayIndexOutOfBoundsException)

类型转换异常(ClassCastException)

异常分类

Error:称为错误,由Java虚拟机生成并抛出,程序对其不做处理。

Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示的声明或捕获。

RuntimeException:运行时期异常,又称为非受检异常,RuntimeException及其所有子类都是运行时期异常。

编译时期异常:不是继承自RuntimeException的Exception的子类都称为编译时期异常。

严重错误: 在程序执行的整个阶段,都可发生错误,错误是无法解决的,可以避免,例如: StackOverflow

遇到异常,是如何处理的呢?

处理异常的目的: 并不是为了修复程序的错误,而是就算程序出现了错误,也能够让程序继续执行

jvm默认是如何处理异常的?

以下段编码为例:

public static void main(String[] args) {

int a = 1;

int b = 0;

System.out.println(a / b);

}

public static void show() {

show();

}

Exception in thread "main" java.lang.ArithmeticException: / by zero

at com.kookv.kookv0425.main(kookv0425.java:8)

1.打印错误信息

a.异常名称 java.lang.ArithmeticException

b.异常的消息 / by zero

c.异常所发生的方法位置 at com.kookv.kookv0425.main

d.异常所在Java文件中 kookv0425.java

e.异常发生行号 8

2.终止程序

System.exit(0);

当JVM处理异常的方式不能够满足我们开发的需求,就需要我们自己处理异常。

我们自己如何来处理异常呢?

方式一: try...catch..finally

方式二: throws

处理异常方式一格式:

try{

//程序可能出现问题的代码

}catch(异常类 异常名){

//异常处理的代码

} finally{

//释放资源

}

注意:

1.try块区的代码越少越好。

2.try块中一旦发生异常,那么后面所有的代码都不会被执行。

3.多个catch块只会执行一个。

4.Exception接受异常必须放在异常的最后面,满足先子类后父类。

异常的执行流程:

1.程序执行到错误行,系统会创建一个异常对象,并且抛给我们:

ArithmeticException exp = new ArithmeticException("/by zero");

throw exp;

2.程序进入catch块进行逐个匹配

匹配成功,程序执行catch块代码

ArithmeticException ae = exp;

Exception e = exp;

匹配失败,交给jvm处理

处理异常的标准方式:

1.能够显示处理的尽量显示处理,提高程序的可读性。

2.但是一定要在异常处理的最后加上 父类Exception处理。

Throwable类

1.Throwable是所有异常和错误的父类。

2.只有作为Throwable或者它的子类对象才能够由Java虚拟机抛出,或者可以由Java throw语句抛出

3.只有这个类或其子类可以是catch子句中的参数类型

4.异常的本质就是对错误信息的一种对象体现

throws关键字概述

在定义一个方法的时候可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,而交给方法的调用者进行处理。

throws使用格式

[修饰符] 返回值类型 方法名(参数列表) [throws 异常类1,异常类2....]{

}

注意:

1.在main方法中,不能throws抛出。因为main方法是虚拟机调用,虚拟机处理异常的结果是将程序终止,不满足我们对处理异常的本质需求。

2.当一个方法抛出的是编译时异常,调用者必须处理。

3.throws可以同时声明多个异常。

4.当一个父类方法抛出一个异常,重写方法不能够被扩大。

5.throws表示异常出现的一种可能性。

6.多个平级异常的处理方式:使用“,”隔开多个异常。

throw和throws的区别

有了throws关键字为什么需要throw? -- 异常出现的情况做相应的处理,throws只是一种异常的声明

抛出异常对象: throw 异常对象;

throws和throw的区别:

1.throws出现方法的声明上,throw出现在方法体内。

2.throws表示异常出现的一种可能性,throw表示方法一定出现了异常。

3.throws可以声明很多个异常,throw只能够抛出一个异常对象。

4.throws声明的是异常类,throw抛出的是异常对象。

finally修饰的代码块一定会被执行,除非在执行到finally之前程序异常退出或者调用了系统退出的方法。

finally用于释放资源,在IO流操作和数据库操作中会见到。

finally相关的面试题

简述final,finally和finalize的区别。

finally碰到return

finally一定会执行

执行顺序?

在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。

在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果。

因此,即使finally中对变量x进行了改变,但是不会影响返回结果。它应该使用栈保存返回值。

为什么需要自定义异常?

1.系统提供的异常不能满足我们的所有需求。

2.我们认为的异常并不是和别人认为的异常一样,本质就是一种错误异常。

自定义分数异常: 自定义一个异常,要求考试成绩必须在0-100之间,如果不在这个范围内,抛出异常。

自定义异常的步骤

1.自定义异常必须是Throwable的子类,但又因为错误不能够处理,所以我们一般继承Exception或者RuntimeExecption

2.书写构造方法

a.无参构造方法

b.带message消息的有参数构造方法

转载于:https://juejin.im/post/5cc19911f265da039b0872ee

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值