一、异常
1、概念: 程序在“编译”或“执行”时可能出现的问题。(语法错误不算异常)
2、常见的异常
- 数组索引越界
- 空指针
- 日期格式化
- …
3、作用: 触发异常后,如果没有提前处理,JVM将终止,提高程序的健壮性和安全性。
4、异常体系
- Error: 系统级别问题、JVM退出等,代码无法处理。
- Exception: 程序本身的问题
- RuntimeException及其子类(运行时异常): 运行时异常,编译阶段不报错。(例如空指针异常、数组越界异常)
- 非RuntimeException(编译时异常): 编译时错误,编译期必须处理,否则程序无法编译。(例如日期格式化异常)
5、运行时异常
(1)特点: 编译不报错,运行才报错。
(2)常见运行时异常
- 数组索引越界异常:ArrayIndexOutOfBoundsException
- 空指针异常:NullPointerException
- 数字操作异常:ArithmeticException
- 类型转换异常:ClassCastException
- 数字转换异常:NumberFormatException
6、编译时异常
(1)特点: 编译时报错。
(2)常见运行时异常
- 日期解析异常:ParseException
7、异常的执行流程
- 默认会出现异常的代码自动创建一个异常对象。
- 异常从方法中出现的点抛出给调用者,调用者最终抛出给JVM。
- JVM接收异常后,先在控制台输出异常信息。
- 直接从当前执行的异常点干掉当前程序。
8、异常的处理机制
(1)编译时异常的处理机制
三种处理方式
- 出现异常直接抛出给调用者,调用者也继续抛出异常。
- 捕获异常并自行处理异常。
- 出现异常直接抛出给调用者,调用者捕获并处理异常。
(a)处理方式1——throws
- 作用方式: 用于方法内,将方法内部产生的异常抛出给调用者。
- 使用格式:
/*抛出异常的方式1*/
方法 throws 异常1,异常2,...{}
/*抛出异常的方式2*/
方法 throws Exception{} //因为Exception是异 常的总类
(b)处理方式2——try…catch…
作用方式: 监听捕捉异常,用在方法内部,恶意将方法内部出现的异常直接捕获并处理。
使用格式:
/*处理方式1*/
try{
//受监视的代码块
}catch(异常类型1 变量){
//处理代码
}catch(异常类型2 变量){
//处理代码
}...
/*处理方式2*/
try{
//受监视的代码块
}catch(Exception e){
//处理代码
}...
(c)处理方式3——前两者结合
作用方式: 方法直接昂异常通过throws抛出给调用者,调用者说道异常后直接捕获异常并处理。
使用方式:
public static void main(String[] args){
try{
getInteger();
}catch(Exception e){
//处理代码
}...
}
public static void getInteger() throws Exception{
return 3 / 0;
}
(2)编译时异常的处理机制
使用方式: 建议在方法调用时直接使用方法b即可。
9、自定义异常
(1)自定义异常的分类
- 自定义编译时异常
- 自定义运行时异常
自定义异常使用流程
- 定义一个异常类继承RuntimeException类。
- 重写构造器
- 出现异常处使用throw new 抛出自定义异常
(2)构建示例
/*异常类继承Exception*/
class MyException extends Exception{
/*重写构造器*/
public MyException(){}
public MyException(String message){
super(message);
}
}
(3)使用示例
public class Main(){
public static void main(String[] atgs){
setAge(300); //编辑器会直接提示这是个可能出现异常的地方。
}
}
public static void setAge(int age){
if(age > 200 || age < 0){
throw new MyException("你输入的年龄有问题");
}
}