异常的概念
java语言中,将程序执行过程中发生的不正常情况称为“ 异常 ”,(开发过程中的语法错误和逻辑错误不是异常)
执行过程中发生的异常事件可以分为两大类:
1.Error(错误):java虚拟机无法解决的严重问题,如:JVM系统内部错误,资源耗尽等严重情况,比如:StackOverFlowError(栈溢出)和OOM(out of memory),error是严重错误,程序会崩溃。
2.Exception:其他因编程错误或者偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。可以分为两类:<1>运行时异常 <2>编译时异常
异常体系图
1.运行时异常,编译器检查不出来,一般是指编程时的逻辑错误,是程序员应该避免出现的异常,java.long.RuntimeException类及它的子类都是运行时异常。
2.对于运行时异常,可以不做处理,因为这种异常很普遍,完全处理可能会对程序的可读性和运行效率产生影响。
3.编译时异常,是编译器要求必须处理的异常。
常见的异常
-
NullPointerException 空指针异常
-
ArithmeticException 数学运算异常
-
ArrayIndexOutOfBoundsException 数组下标越界异常
-
ClassCastException 类型转换异常
当试图将对象强制转换为不是实例的子类时,抛出该异常。 -
NumberFormatException 数字格式不正确异常[]
当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常 => 使用异常我们 可以确保输入是满足条件数字.
异常处理
try-catch-finally
try{
//代码可能会有异常
}catch(Exception e){
//当异常发生时,将异常封装成Exception对象e,程序员自行处理
//如果没有发生异常,catch块不会被执行
}finally{
//不管代码块是否有异常,始终要执行finally
//通常放释放资源的代码
}
使用细节:
1.如果异常发生了,那么异常发生后面的代码不会执行,直接进入catch块,但是try-catch-finally结构外的代码还会执行。
2.如果代码块中可能有多个异常,可以使用多个catch语句分别进行捕获,但是要求子类异常在前,父类异常在后,如果发生异常,只会匹配一个catch。
3.可以进行try-finally的使用,这种用法相当于没有捕获异常,因此程序会直接退出。应用场景:就是直接执行一段代码,不管是否发生异常,都必须执行某个业务逻辑。
throws
每个方法都有两种处理异常的方式,选择其中一个,当没有指出时,表示采用throws方法。
使用细节:
1.如果一个方法中的语句执行时可能出现某种异常,但是并不能确定如何处理这种异常,则此方法应显示的声明抛出异常,交给调用者处理。
2.在方法中使用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
public void f1() throws Exception{
int n1 =10;
int n2 = 0;
int n3 = n1/n2;
}
3.子类重写父类的方法时,对抛出异常的规定:要么抛出和父类相同的异常类型,要么抛出父类异常类型的子类型。
自定义异常
如果继承的是Exception,那么它是编译异常,如果继承的是RuntimeException,那么就是运行异常。
class Untitled {
public static void main(String[] args) {
int age = 200;
if(!(age>1&&age<=120)){
throw new AgeException("年龄有误!!");
}
System.out.println("你的年龄范围正确");
}
}
class AgeException extends RuntimeException{
public AgeException(String message){
super(message);
}
}