异常处理
异常分为两种:
1、error—错误 : 是指程序无法处理的错误,表示应用程序运行时出现的重大错误。例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误。
2、Exception — 异常 :异常可分为运行时异常跟编译异常
1)运行时异常:即RuntimeException及其之类的异常。这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。常见的RUNtimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。
2)编译异常:RuntimeException以外的异常。这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。
3、java处理异常的机制:抛出异常以及捕获异常 ,一个方法所能捕捉的异常,一定是Java代码在某处所抛出的异常。简单地说,异常总是先被抛出,后被捕捉的。
Java 内置异常类
非检查性异常:
检查性异常:
异常方法(Throwable 类的主要方法)
捕获异常
当前方法知道如何处理该异常时,使用 try 和 catch 关键字可以捕获异常,然后在对应的catch块中修复该异常。
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
多重捕获
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
使用finally回收资源
finally 关键字用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。例如数据库连接、网络连接和磁盘文件,这些资源必须显式回收。
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
抛出异常
使用throws关键字
当前方法不知道如何处理某种异常,可以在定义该方法的时候声明抛出。
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
public void withdraw(double amount) throws RemoteException,
InsufficientFundsException
{
// Method implementation
}
使用throw关键字
如果需要在程序中自行抛出异常,要使用throw语句,throw语句可单独使用,但抛出的不是异常类,而是一个异常实例
thorw ExceptionInstance;
if(age < 0){
throw new Exception("年龄不能为负数!");
}
catch(Exception e){
输出("年龄不能为负数!");
}
当Java运行时接收到开发者自行抛出的异常,同样会中止当前的执行流,调到对应的catch块。
自定义异常
- 所有异常都必须是 Throwable 的子类。
- 如果希望写一个检查性异常类,则需要继承 Exception 类。
- 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。