异常的定义
运行期出现的错误
异常的继承图
Object 类的直接子类Throwable描述了所有被虚拟机抛出的非正常状况。一般情况下很少用Throwable,而是使用它的两个子类Error、Exception。
Error类特指应用程序在运行期间发生的严重错误。如:虚拟机内存用尽、堆栈溢出等等。一般情况下这种错误都是灾难性的,所以没有必要使用异常处理机制处理Error。
Exception类有几十个子类,描述了不同类型的异常,其中:
以RuntimeException为代表的一些类,称为非检查性异常(unchecked Exception),
以IOException为代表的一些类为检查性异常(checked Exception)。所谓的检查和非检查是指编译器在编译时是否检查。如果代码中存在检查性异常,必须进行异常处理,否则编译时不能通过;而非检查性异常编译时不进行检查,到运行时才会显现。
异常类型
检查性异常(checked exception)
若系统运行时可能产生该类异常,则必须写出相应的处理代码,否则无法通过编译
非RuntimeException异常
非检查性异常(unchecked exception)
若系统运行时可能产生该类异常,则不必在程序中声明对该类异常的处理,就可以编译执行
RuntimeException:运行时异常
注意:我们主要学习检查性异常的处理
非检查性异常
RuntimeException 运行期异常
ArithmeticException 运算错误
IllegalArgumentException 参数错误
ArrayIndexOutOfBoundsException 数组越界
NullPointerException 空指针
检查性异常
IOException 输入输出错误,是下面检查性异常的父类
ClassNotFoundException 类不存在
FileNotFoundException 文件不存在
EOFException 文件结束异常
IllegalAccessException 对类的访问被拒绝
NoSuchMethodException 没有这个方法
InterruptedException 多线程异常,线程中断
异常的处理两种方式
第一种 try{有可能会出现异常的代码...}catch{一旦捕获着了,如何处理..}
@Test
public void test() {
//检查性异常( 编译期异常)
try {
FileInputStream file = new FileInputStream("E:/java16/javase/test1.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
第二种 throws ***Exception 向上层抛弃,也就是抛给调用方法的人
通常:如果是数据库级别的,我们要处理,如果是其他异常,底层向上抛,上层处理
@Test
public void test() throws FileNotFoundException {
//检查性异常( 编译期异常)
FileInputStream file = new FileInputStream("E:/java16/javase/test1.txt");
}
注意:捕获时,子类的异常放在里层,父类的异常放在外层,即从小往大捕获
@Test
public void test06() {
try {
FileInputStream file = new FileInputStream("E:/java16/javase/test1.txt");
file.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Catch多个异常的写法
1、向上抛
@Test
public void test06() throws IOException {
//打开文件
FileInputStream file;
try {
file = new FileInputStream("E:/java16/javase/test1.txt");
file.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
2、分别处理
@Test
public void test06() {
//打开文件
FileInputStream file;
try {
file = new FileInputStream("E:/java16/javase/test1.txt");
file.close();
} catch (FileNotFoundException e) {
System.out.println("文件不存在");
e.printStackTrace();
} catch (IOException e) {
System.out.println("文件读取失败");
e.printStackTrace();
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
合并处理(jdk1.7之后)Exception3.java
@Test
public void test06() {
FileInputStream file;
try {
//打开文件
file = new FileInputStream("E:/java16/javase/test1.txt");
//可以执行其他操作
//关闭文件
file.close();
} catch (FileNotFoundException | IOException e) {
System.out.println("出错了");
e.printStackTrace();
}
}
finally块Exception4.java
try---finally
try--catch--finally
@Test
public void test06() {
//try{}finally{}
//try{}catch{}finally{}
FileInputStream file = null;
try {
// 打开文件
file = new FileInputStream("E:/java11/demo.txt");
int i=1/0;
// 可以执行其他操作
} catch (FileNotFoundException e) {
System.out.println("文件不存在");
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{//无论如何都会被执行,经常用来作为后续清理工作,关闭流,关闭数据连接。清理内存中的某些东西。
// 关闭文件
try {
file.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.exit(0) finally代码块中的内容不被执行
@Test
public void test06() {
//try{}finally{}
//try{}catch{}finally{}
FileInputStream file = null;
try {
// 打开文件
file = new FileInputStream("E:/java11/demo.txt");
int i=1/0;
// 可以执行其他操作
} catch (FileNotFoundException e) {
System.out.println("文件不存在");
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (Exception e) {
//特例 ,系统退出, 这个时候finally执行不到了。
//System.exit(0);
// TODO Auto-generated catch block
e.printStackTrace();
}finally{//无论如何都会被执行,经常用来作为后续清理工作,关闭流,关闭数据连接。清理内存中的某些东西。
// 关闭文件
try {
file.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
自定义异常 AppException BusinessException DbException
/**
* 自定义异常,继承Exception
* @author Administrator
*
*/
public class AppException extends Exception{
private static final long serialVersionUID = -3772114394224548773L;
private String code;
/**
*
* @param code 999-未知异常 0-成功 100-用户名错误 101-密码错误
* @param message
*/
public AppException(String code,String message) {
super(message);
this.code=code;
}
public String getCode() {
return code;
}
}
public class BusinessException extends Exception {
private static final long serialVersionUID = 6815756811652789347L;
private String code;
public BusinessException(String code,String message) {
super(message);
this.code=code;
}
public String getCode() {
return code;
}
}
public class DbException extends Exception {
private static final long serialVersionUID = -6395430404968261254L;
private String code;
public DbException(String code,String message) {
super(message);
this.code=code;
}
public String getCode() {
return code;
}
}
throw 抛出自定义异常CatchMultiException.java
底层向上抛:
public static void test(int a) throws AppException, BusinessException, DbException
{
if (a == 0) {
throw new AppException("0","应用程序异常");// 抛出第一个异常
}
if (a == 1) {
throw new BusinessException("2","异常2");// 抛出第二个异常
}
if (a == 2) {
throw new DbException("3","异常3");// 抛出第三个异常
}
}
上层的方法要对异常进行处理
处理方式
1)继续向上抛
public static void main(String[] args) throws AppException, BusinessException, DbException {
test(0);
}
2)surrount width try-catch 各个异常分别处理
public static void main(String[] args) {
try {
test(0);
} catch (AppException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BusinessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DbException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3) surrount width muilti-catch 各个异常合并处理
public static void main(String[] args) {
try {
test(0);
} catch (AppException | BusinessException | DbException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
调用堆栈:后进先出Exception5.java
public class Exception6 {
int[] arr = new int[3];
public static void main(String[] args) {
try {
new Exception6().methodOne();
System.out.println("main");
} catch (AppException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("程序异常");
}
}
public void methodOne() throws AppException {
methodTwo();
System.out.println("One");
}
public void methodTwo() throws AppException {
methodThree();
System.out.println("Two");
}
public void methodThree() throws AppException {
try {
System.out.println(arr[3]);
System.out.println("Three");
} catch (Exception e) {
throw new AppException("999","未知异常");
}
}
}
跟异常相关的关键词
try{}
catch{}
finally{}
System.exit(0);
throws
throw new ***Exception
线上学习
文件与流