一、异常概念
在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。
二、异常体系
Throwable体系:
- Error:严重错误Error,无法通过处理的错误,只能事先避免;
- Exception:表示异常,异常产生后程序员可以通过代码纠正,使程序继续运行,是必须处理的;
Throwable中的常用方法:
- public void printStackTrace():打印异常的详细信息。 包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
- public String getMessage():获取发生异常的原因。提示给用户的时候,就提示错误原因。
- public String toString():获取异常的类型和异常描述信息(不用)。
三、异常处理
Java异常处理关键字:try、catch、finally、throw、throws
3.1 抛出异常Throw
作用:可以使用throw关键字在指定的方法中抛出指定的异常;
使用格式: throw new xxxException("异常产生的原因");
注意事项:
- throw 关键字必须写在方法的内部;
- throw关键字后边new的对象必须是Exception或者Exception的子类对象;
- throw关键字抛出指定的异常对象,我们就必须处理这个异常对象;但throw关键字后边创建的是RuntimeException或者是RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序);throw关键字后边创建的是编译异常对象(写代码的时候报错),我们就必须处理这个异常,要么throws,要么try...catch;
3.2 声明异常throws
throws关键字:异常处理的第一种方式交给别人处理。
作用:当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象,可以使用throws关键字处理异常对象,会把异常对对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM中断处理;
使用格式: 在方法声明时使用
修饰符 返回值类型 方法名(参数列表) throws AAAException,BBBException ... {
throw new AAAException("产生原因");
throw new BBBException("产生原因");
......
}
注意事项:
- throws关键字必须写在方法声明处;
- throws关键字后边声明的异常必须是Exception或者是Exception子类;
- 方法内部如果抛出了多个异常对象,那么throws后边必须声明多个异常;如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可;
- 调用了一个声明抛出异常的方法,我们就必须的处理声明的异常;要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM;要么try ....catch 自己处理异常;
package seventh;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ThrowsDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String args[]) throws FileNotFoundException,IOException
{
readFile("d:\\a.txt");
}
/**
* @param fileName
* @throws IOException
*/
public static void readFile(String fileName) throws FileNotFoundException,IOException
{
if(!fileName.equals("c:\\a.txt")) {
throw new FileNotFoundException("传递的文件路径不是c:\\a.txt");
}
if(!fileName.endsWith(".txt")) {
throw new IOException("文件的后缀名不是.txt");
}
System.out.println("文件路径没有问题");
}
}
3.3 捕获异常try..catch
try...catch:异常处理的第二种方式,自己处理异常;
使用格式:
try {
可能产生的异常的代码;
}catch(定义一个异常的变量,用来接收try中抛出的异常对象){
异常的处理逻辑,异常对象之后再,怎么处理异常对象;一般在工作中,会把异常信息记录到一个日志中;
}
...
catch(异常类名 变量名) {
}
注意事项:
- try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象;
- 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try...catch之后的代码,如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑;执行完try中的代码,继续执行try...catch之后的代码;
package seventh;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* @author gengpengshuai
*
*/
public class TryCatchDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String args[])
{
try {
readFile("d:\\a.txt");
}catch (IOException e) {
System.out.println("catch - 传递的文件后缀不是.txt");
}
}
/**
* @param fileName
* @throws IOException
*/
public static void readFile(String fileName) throws IOException
{
if(!fileName.equals("c:\\a.txt")) {
throw new FileNotFoundException("传递的文件路径不是c:\\a.txt");
}
if(!fileName.endsWith(".txt")) {
throw new IOException("文件的后缀名不是.txt");
}
System.out.println("文件路径没有问题");
}
}
3.4 finally代码块
有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
什么时候代码必须最终执行?当我们在try语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等),我们都得在使用完之后,最终关闭打开的资源。
finally的预发:try...catch...finally:自身需要处理异常,最终还得关闭资源。
package seventh;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* @author gengpengshuai
*
*/
public class TryCatchDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String args[])
{
try {
readFile("d:\\a.txt");
}catch (IOException e) {
//System.out.println("catch - 传递的文件后缀不是.txt");
e.printStackTrace();
}finally {
System.out.println("资源释放");
}
}
/**
* @param fileName
* @throws IOException
*/
public static void readFile(String fileName) throws IOException
{
if(!fileName.equals("c:\\a.txt")) {
throw new FileNotFoundException("传递的文件路径不是c:\\a.txt");
}
if(!fileName.endsWith(".txt")) {
throw new IOException("文件的后缀名不是.txt");
}
System.out.println("文件路径没有问题");
}
}