Java 异常处理是 Java 程序设计中的重要部分之一。程序中出现异常时,如果不加以处理,程序将会异常终止。Java 异常处理提供了一种结构化的方式,让程序员能够更加优雅的处理程序异常情况,从而使程序更加健壮。
异常的概念
Java 异常指程序在执行过程中出现的不正常情况。 Java 平台自带的类库提供了很多有用的异常类,程序员也可以自己定义异常类。异常类是 Java 类,继承自 Throwable 类。Java 异常分类:
- 受检异常:在编译时必须被捕获或声明抛出,即在方法中使用 try-catch 块或声明 throws 关键字。常见的受检异常包括:IOException、SQLException等。
- 非受检异常:也称为运行时异常(RuntimeException),在程序运行时才被检查到。不要求必须显式的捕获或声明抛出。常见的运行时异常包括:NullPointerException、IndexOutOfBoundsException等。
异常处理
Java 异常处理机制引入了 5 个关键字:try、catch、throw、throws 和 finally。
try-catch 语句
try-catch 语句用于处理可能抛出异常的语句,它是最基本的异常处理机制。try 块中的代码称为受保护的代码,用于捕获可能抛出异常的代码。如果发生异常,try 块内的代码立即停止执行,并跳转到 catch 块中。catch 块后面必须跟一个异常类型或其父类型的参数,用于捕获对应类型的异常。
try{
//受保护的代码
}catch(ExceptionType e){
//发现异常后执行的代码
//系统自动生成异常类型对象,e代表异常内容
}
finally 语句
finally 块中的语句总是会被执行,无论 try 语句块中是否发生异常。finally 块通常包含完成清理工作的代码,如关闭文件、释放资源等。
try{
//受保护的代码
}catch(ExceptionType e){
//发现异常后执行的代码
//系统自动生成异常类型对象,e代表异常内容
}finally{
//用于完成清理工作的代码
}
throw 语句
throw 语句用于在代码中显式地抛出一个异常。它的语法如下:
throw throwableInstance;
throwableInstance
是一个异常类型的实例。
throws 语句
当方法内抛出异常时,调用该方法的方法就会捕获或抛出该异常。如果方法可能抛出异常,则必须要声明这些异常。Java 中,throws 关键字用于声明方法可能抛出的异常列表。
public void method() throws ExceptionType1, ExceptionType2 {
//方法体
}
自定义异常
在 Java 中,也可以自定义异常,使用关键字 extends 继承 Exception 类或其子类实现自己的异常类。
public class MyException extends Exception {
private int id;
public MyException(String message, int id) {
super(message); //调用父类构造方法,初始化异常消息
this.id = id;
}
public int getId() {
return id;
}
}
异常的处理原则
- 必须对捕获的异常进行处理。
- 不要过多使用 try-catch 块,应尽可能在程序设计中避免出现异常情况。
- 不要把所有的异常打成一类异常处理,应该对不同异常具体分析,有针对性地进行处理。
Java 常见异常
NullPointerException
空指针异常,常出现在使用了没有初始化的对象,或者对 null 调用方法时抛出。
Object obj = null;
obj.toString(); // 抛出 NullPointerException 异常
IndexOutOfBoundsException
数组越界异常,常出现在访问数组中不存在元素时抛出。
int[] arr = new int[5];
System.out.println(arr[5]); // 抛出 IndexOutOfBoundsException 异常
NumberFormatException
数字格式异常,常出现在试图把一个字符串转化为数字时失败抛出。
String str = "abc";
int num = Integer.parseInt(str); // 抛出 NumberFormatException 异常
ClassNotFoundException
找不到类异常,常出现在类不存在时抛出。
Class clazz = Class.forName("com.example.MyClass"); // 抛出 ClassNotFoundException 异常
IOException
I/O 异常,常出现在读或写文件时发生错误。
FileOutputStream fos = new FileOutputStream("file.txt");
fos.write("Hello World".getBytes());
fos.close();
SQLException
SQL 异常,常出现在连接到数据库或执行 SQL 语句时出现错误。
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "password");
PreparedStatement ps = conn.prepareStatement("SELECT * FROM user WHERE id = ?");
ps.setString(1, "123");
ResultSet rs = ps.executeQuery();
OutOfMemoryError
内存溢出错误,常出现在 Java 应用程序尝试使用太多内存时。
List<String> list = new ArrayList<>();
while(true){
list.add("out of memory");
}
这些异常经常在 Java 开发中出现,我们应该尽可能地避免它们的出现。在出现异常时,应该根据具体情况进行相应的处理,以避免程序崩溃。
总结
Java 异常处理是一项很重要的编程技能,它可以帮助我们规避程序运行过程中的一些不可预知情况。在实际编程中,应根据不同的需求、不同的情况,选择合适的异常处理方式。
微信公众号搜索:小虎哥的技术博客,关注公众号,看更丰富的系统文章!