概念:java语言中,将程序执行中发生的不正常情况称为异常(开发过程中的语法错误和逻辑错误不是异常)
异常事件可分为两类:
(1)Error:Java虚拟机无法解决的严重问题;Error是严重错误,程序会崩溃
(2)Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理;Exception分为两大类:运行时异常[程序运行时,发生的异常]和编译时异常[编程时,编译器查出的异常]
常用异常体系图
异常处理的方式 :
一、try---catch异常处理
概念:try块用于包含可能出错的代码,catch块用于处理try块中发生的异常,根据需要在程序中可以有多个try--catch块
语法:try{ 可疑代码块 }catch(异常){ 对异常处理 }
public class Study {
public static void main(String[] args) {
int n1=10;
int n2=0;
try{
int res=n1/n2;
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
注意事项:
(1)如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块
(2)如果异常没有发生,则顺序执行try的代码块,不会进入到catch块
(3)如果希望不管是否发生异常,都执行某段代码,则使用finally
(4)可以有多个catch块,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如:Exception在后,NullPointerException在前,如果发生异常,只会匹配一个catch
public class Study {
public static void main(String[] args) {
try {
Person person = new Person();
person=null;
System.out.println(person.getName());
int n1=10;
int n2=0;
int res=n1/n2;
} catch (NullPointerException e) {
System.out.println("nullpointerException");
}catch (ArithmeticException e){
System.out.println("arith");
}catch (Exception e){
System.out.println(e.getMessage());
}
}
}
class Person{
private String name;
public String getName() {
return name;
}
}
(5)可以进行try---finally配合使用,这种用法相当于没有捕获异常,因此程序会直接退出;应用场景:执行一段代码,不管是否发生异常,都必须执行某个业务逻辑
二、throws异常处理
概念:(1)如果一个方法中的语句执行时,可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法不对这些异常进行处理,而由该方法的调用者负责处理(2)在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
注意事项:
(1)子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出异常类型的子类
public class Study {
public static void main(String[] args) {
f1();
}
public static void f1(){
try {
f2();
} catch (Exception e) {
System.out.println("f2()");
}
}
public static void f2() throws ArithmeticException{
int n1=1;
int n2=0;
int res=n1/n2;
}
}
三、自定义异常处理
(1)定义:自定义异常类名 extends Exception或RuntimeException
(2)如果继承Exception,属于编译异常
(3)如果继承RuntimeException,属于运行异常
public class Study {
public static void main(String[] args) {
int age=10;
if(!(age>=18&&age<=120)){
throw new AgeException("年龄需要在18-20之间");
}
System.out.println("true");
}
}
class AgeException extends RuntimeException{
public AgeException(String message) {
super(message);
}
}
throw和throws的区别
意义 | 位置 | 后面跟的东西 | |
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |