一、异常概述
Java将程序运行过程中所发生的不正常严重错误称为异常,但并不是所有的错误都称为异常。而对异常的处理称为异常处理。
一旦程序在运行的过程中出现了异常,且异常没有被处理,那么正在运行的异常极有可能被中断。
为了区分异常与错误,可以参考下面的博客:
https://blog.youkuaiyun.com/u011046058/article/details/47129657
二、异常分类
1、Exception异常分为RuntimeException (运行时异常)和CheckedException(检查时异常)。
2、RuntimeException是程序运行时抛出的异常。这种异常在不进行处理,Java源文件也能编译通过。RuntimeException异常类及其子类都是运行时异常。
示例:
3、CheckedException,又称非运行时异常。这种异常必须在编程时进行处理,否则就不能编译。Exception异常类及其子类(RuntimeException异常类及其子类)都是检查时异常。
示例:
三、异常处理
Java异常处理的方式有两种:一种是try catch和finally关键字捕获异常;另一种是throw和throws抛出异常。
1、捕获异常
语法结构:
该结构中try语句块是必须的,catch和finally语句块至少出现一个即可。
示例:
多重catch
finally关键字
finally 关键字用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码总会被执行。
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
finally 代码块出现在 catch 代码块最后,语法如下:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
实例
ExcepTest.java 文件代码:
public class ExcepTest{
public static void main(String args[]){
int a[] = new int[2];
try{
System.out.println("Access element three :" + a[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Exception thrown :" + e);
}
finally{
a[0] = 6;
System.out.println("First element value: " +a[0]);
System.out.println("The finally statement is executed");
}
}
}
以上实例编译运行结果如下:
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed
thrown :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed
2、throw和throws抛出异常
如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。如果throw抛出的是运行时异常则不必使用throws关键字来声明。
下面方法的声明抛出一个 RemoteException 异常:
import java.io.*;
public class className{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}
一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。
例如,下面的方法声明抛出 RemoteException 和 InsufficientFundsException:
import java.io.*;
public class className{
public void withdraw(double amount) throws RemoteException, InsufficientFundsException
{
// Method implementation
}
//Remainder of class definition
}
四、自定义异常类
自定义的异常类应该包含两个构造器,一个是默认的构造器,另一个是带有详细描述信息的的构造器,便于代码的调试。定义异常类应注意以下几点:
- 所有异常都必须是 Throwable 的子类。
- 如果希望写一个检查性异常类,则需要继承 Exception 类。
- 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
示例:
使用异常类: