Java异常的分类
Java异常都是java.lang.Throwable类的子类。主要分为Error和Exception
1. Error
Error代表系统级别的错误(属于严重问题),也就是说系统一旦出现问题,sun公司会把这些问题封装成Error对象给出来。
2. Exception
Exception表示异常,分为运行时异常和非运行异常。
2.1 RuntimeException运行时异常
在IDEA写代码,编译的时候,不会出现异常,但是放到JVM运行时,会出现异常。例如:空指针异常、数组下标越界异常、类型转换异常、算术异常。
示例:数组下标越界异常
public class Main {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
// 出现数组越界异常
System.out.println(arr[6]);
//数组越界异常如果不处理,后面的代码不会执行
System.out.println("aaa");
}
}
如果我们想出现异常,程序继续运行,可以通过try catch捕获异常。
public class Main {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
try{
// 出现数组越界异常
System.out.println(arr[6]);
}catch (ArrayIndexOutOfBoundsException e){
// 控制台输出数组越界异常信息
e.printStackTrace();
}
//程序代码继续执行
System.out.println("代码继续执行...");
}
}
2.2 非运行时异常
也叫编译时异常、受检查时异常。如果不处理,IDEA会报错。
2.3 如何处理异常
(1)抛出异常throws
- 在方法上使用throws关键字,可以将方法内部出现的异常抛出去给调用者处理。
(2)捕获异常try catch
- 直接捕获程序出现的异常
3. 自定义异常
3.1 自定义运行时异常
需求:判断一个人的年龄是否在合法区间
- age>0 && age < 100 合法
- age < 0 年龄太小异常
- age > 100 年龄太大异常
自定义异常步骤:
1. 定义一个异常类继承RuntimeException
2. 重写构造器
3. 通过throw new 异常类(xxx)来创建异常对象并抛出。编译阶段不报错,提醒不强烈,运行时才可能出现。
自定义年龄过大异常
package com.gtc.myexception;
public class AgeTooLargeException extends RuntimeException {
// 无参构造器
public AgeTooLargeException() {
}
// 有参构造器(参数传给上级)
public AgeTooLargeException(String message) {
super(message);
}
}
自定义年龄过小异常
package com.gtc.myexception;
public class AgeTooSmallException extends RuntimeException{
public AgeTooSmallException() {
}
public AgeTooSmallException(String message) {
super(message);
}
}
Demo测试
package com.gtc.service;
import com.gtc.myexception.AgeTooLargeException;
import com.gtc.myexception.AgeTooSmallException;
public class AgeService {
public static void main(String[] args) {
try{
saveAge(-1);
System.out.println("执行成功!!!");
}catch (AgeTooLargeException e){
e.printStackTrace();
System.out.println("出现BUG!!!");
}catch (AgeTooSmallException e){
e.printStackTrace();
System.out.println("出现BUG!!!");
}
}
public static void saveAge(int age) {
if (age > 0 && age < 100){
System.out.println("年龄被成功保存:"+age);
}else if (age < 0){
throw new AgeTooSmallException("年龄值不能小于0,你输出的年龄是:"+age);
}else if (age > 100){
throw new AgeTooLargeException("年龄值不能大于100, 你输出的年龄是:"+age);
}
}
}
3.2 自定义编译时(非运行时)异常
自定义编译时异常,继承Exception即可。
出现编译时异常,代码报红,必须处理,否则无法编译。
4. 异常的常见处理方式
5. try catch finally
finally一定会执行,除非try里面的代码发生了JVM错误。