异常:【程序在执行过程中】,出现的非正常情况,最终导致JVM的非正常停止
异常并不是语法错误,语法错误编译不通过,不会产生字节码文件,程序根本不能运行
Java处理异常的方式是中断处理,异常本身是一个类,产生异常就是创建一个异常对象并抛出
Throwable 类是 Java 语言中所有错误 Error 和异常 Exception 的超类
只有此类或其子类之一,才能通过 Java 虚拟机或者 Java throw 语句抛出,才可以是 catch 子句中的参数类型
一、编译时异常(Checked Exceptions 已检查异常)
在编译时(写代码时)必须显式处理,通常是可以预见的,并且与特定的环境或资源访问有关
IO操作可能抛出IOException
,网络操作可能抛出SocketException
,JDBC操作可能抛出SQLException
等
- 在方法签名中使用
throws
关键字声明抛出 - 在方法体内使用
try-catch
块捕获并处理
二、运行时异常(Unchecked Exceptions 未检查异常,Runtime Exceptions)
运行时异常是RuntimeException
类及其子类的实例
在运行时才会被检测到,编译器不要求必须处理,通常由于程序员的编程错误导致
空指针异常NullPointerException
、数组越界异常ArrayIndexOutOfBoundsException
等
不强制要求在方法签名中声明,可以选择捕获处理,也可以选择不处理,由JVM在运行时抛出
最佳实践仍然建议对可能出现的运行时异常进行适当的处理,以提高程序的健壮性和用户体验
三、错误(Error)
Java虚拟机(JVM)中严重的问题,通常与JVM本身、系统资源或其他底层问题有关
错误是不可恢复的,不应该通过代码来捕获处理,意味着程序无法从中恢复并继续执行
常见的错误类型有OutOfMemoryError
(内存溢出错误)、StackOverflowError
(栈溢出错误)等
public class A {
public static void main(String[] args) {
A a = new A();
}
/**
* 错误
* java.lang.OutOfMemoryError 内存溢出错误
* java.lang.StackOverflowError 栈溢出错误
*/
public A() {
// java.lang.OutOfMemoryError
// int[] arr = new int[Integer.MAX_VALUE];
// java.lang.StackOverflowError
// new A(); // 构造方法中不能创建本类对象,导致无限递归
}
/**
* 编译时异常
* java.text.ParseException 解析异常
*/
static void method1() /*throws ParseException*/ {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse("1999-09-01");
} catch (ParseException e) {
// 打印异常信息
e.printStackTrace();
}
System.out.println("后续代码..."); // 继续执行
}
/**
* 运行时异常
* java.lang.ArrayIndexOutOfBoundsException 数组索引越界异常
*/
static void method2() {
int[] arr = {1, 2};
try {
System.out.println(arr[2]);
} catch (Exception e) {
// 打印异常信息
System.out.println(e);
}
System.out.println("后续代码..."); // 继续执行
}
}