目录
概念:
基本概念:
Java语言中,将程序执行中发生的不正常情况称为异常。(开发过程中的语法错误和逻辑错误不是异常)
异常事件可以分为两大类:
1:Error(错误):Java虚拟机无法解决的严重问题。如,JVM系统内部错误,资源耗尽等严重情况。Error是严重错误,程序会崩溃。
2:Exception:因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。如,空指针访问,分母为0等。Exception分为两大类:运行时异常和编译时异常。
异常体系图:
部分:
异常体系知识点:
1:异常分为两大类:运行时异常,和编译时异常。
2:运行时异常,编译器不要求强制处置的异常(编译器检测不出)。一般是指编程时的逻辑错误,是程序员应该避免出现的异常。如java.lang.RuntimeException
类及其子类都是运行时异常。
3:对于运行时异常,可以不作处理,因为这类异常很普遍,若全做处理可能会对程序的可读性和运行效率产生影响。
4:编译时异常,是编译器要求必须处置的异常。
常见运行时异常:
1:NullPointerException
空指针异常
2:ArithmeticException
数学运算异常
3:ArrayIndexOutBoundsException
数组下标越界异常
4:ClassCastException
类型转换异常
5:NumberFormatException
数字格式不正确异常
public class Test2 {
public static void main(String[] args) {
//1:NullPointerException空指针异常
String name=null;
System.out.println(name.length());
//2:ArithmeticException数学运算异常
int a=1,n=0;
System.out.println(a/n);
//3:ArrayIndexOutBoundsException数组下标越界异常
int[] b={1,2,3,4};
System.out.println(b[4]);
//4:ClassCastException类型转换异常
A c1=new B();//向上转型 B-->A
B c2=(B)c1;//向下转型 A-->B
C c3=(C)c1;//抛出异常 B-->C
//5:NumberFormatException数字格式不正确异常
String str="1234";
int d=Integer.parseInt(str);//正确
String str2="song";
int e=Integer.parseInt(str2);//抛出异常
}
}
class A{}
class B extends A{}
class C extends A{}
常见编译异常:
1:SQLException
SQL语句异常,操作数据库时
2:IOException
IO流异常,操作文件时
3:FileNotFoundException
操作不存在文件
4:ClassNotFoundException
类不存在异常
5:EOFException
操作文件,到文件末尾,发生异常
6:IIIegalArguementException
参数异常
异常处理机制:
1:try-catch-finally:程序员在代码中捕获异常,自行处理。
try{
//代码区,可能发生异常
}catch(Exception e){
//1:当异常发生时
//2:系统将异常封装成Exception对象e传递给catch
//3:得到异常后,程序员自己处理
//4:如果没有发生异常,catch不执行
}finally{
//1:不官有没有异常发生都会执行
//2:通常用来释放资源
}
总结:
①:如果没有出现异常,则执行try中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句。
②:如果出现异常,则try块中剩下的语句不再执行。将执行catch块中语句,如果有finally,最后还要执行finally里的语句。
2:throws:将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是虚拟机JVM
每个程序,mian
方法都会有默认的throws Exception
,如果程序员没有显式处理异常,默认就是throws
。
使用细节:
1:对于编译异常,程序中必须处理,可以用try-catch或者throws。运行时异常有默认抛出异常,编译异常必须显式抛出异常。
2:对于运行时异常,程序中如果没有处理,默认就是throws的方式处理。
3:子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的一致,要么为父类抛出的异常的子类型。
4:在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws。
自定义异常;
基本概念:
当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。
步骤:
1:定义类:自定义异常类名,继承Exception或者RuntimeException
。
2:如果继承Exception是属于编译异常。
3:如果继承RuntimeException
,属于运行异常,一般来说,继承RuntimeException
。
public class Test4 {
public static void main(String[] args) {
int age=8;
if (age>=18&&age<=120){
System.out.println("OK");
}else{
throw new AgeException("NO success age!");
}
}
}
//自定义异常
class AgeException extends RuntimeException{
public AgeException(String msg){
super(msg);
}
}
throw和throws:
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |