目录

一、异常的分类

1、异常的层次结构

2、try、catch和finalIy

3、声明异常

4、手动抛出异常 

5、异常的捕获顺序

6、自定义异常


什么是异常? 

在运行程序时出现的错误,称为异常。java提供了一套体系结构,在出现问题时会把错误的详细信息告诉我们。

一、异常的分类

1、异常的层次结构

java的异常分类 java对异常如何进行分类_java的异常分类

异常主要分为:错误、一般性异常(受控异常)、运行期异常(非受控异常)

经典异常

空指针异常:NullPointerException 

类型转换异常:ClassCasException

数组下标越界异常:IndexOutOfBoundsException

数字格式化异常:NumberFormatException

2、try、catch和finalIy

异常的捕获和处理需要采用try和catch来处理

try {
}catch(OneException e) { 
}catch(TwoException e) {
}finally {
 
}

try中包含了可能产生异常的代码

try后面是catch,catch可以有一个或者多个,catch中是需要捕获的异常

finally表示,不管是出现异常还是没出现异常,finally里的代码都执行,finally和catch可以分开使用,但finally必须和try一起使用

finally在任何情况下都会执行,通常在finally里关闭资源。放在finally中的语句,程序出现任何问题都会被执行,所以finally中一般放置一些需要及时释放的资源。只有java虚拟机退出才不会执行finally,其他任何情况都会执行finally.

import java.io.*;
public class ExceptionTest08 {
public static void main(String[] args) {
//因为 fis 的作用域问题,必须放到 try 语句块外,局部变量必须给初始值
//因为是对象赋值为 null
FileInputStream fis = null;
try {
//FileInputStream fis = new FileInputStream("test.txt");
fis = new FileInputStream("test.txt");
/*
System.out.println("-------before fis.close--------");
fis.close();
System.out.println("-------after fis.close--------");
*/
}catch(FileNotFoundException e) { 
e.printStackTrace();
}finally {
try {
System.out.println("-------before fis.close--------");
//放到 finally 中的语句,程序出现任何问题都会被执行
//所以 finally 中一般放置一些需要及时释放的资源
fis.close();
System.out.println("-------after fis.close--------");
}catch(IOException e) {
e.printStackTrace();
} }
} 
}

获取异常的具体信息

获取异常描述信息:getMessage()

获取异常的堆栈信息(比较适合程序调试阶段):printStackTrace()

final finalize finally

3、声明异常

在方法定义处采用throws声明异常,如果声明的异常为受控异常,那么调用方法必须处理此异常

//throws FileNotFoundException, IOException {  
   // 
   可以在此声明异常,这样就交 
 
  
给  
   java  
   虚拟机处理了,不建议这样使用 
 
  
throws Exception {  
   // 
   可以采用此种方式声明异常,因为  
   Exception  
   是两个异常 
 
  
的父类



4、手动抛出异常 

throws和throw的区别?throws是声明异常,throw是抛出异常

public class ExceptionTest17 {
public static void main(String[] args) {
try {
int ret = method1(1000, 10);
System.out.println(ret);
}catch(Exception iae) {
System.out.println(iae.getMessage());
}
} 
private static int method1(int value1, int value2){
try {
if (value2 == 0) {
手动抛出异常
throw new IllegalArgumentException("除数为 0");
//加入如下语句编译出错,throw相当于 return 语句
//System.out.println("----------test111-----------");
}
if (!(value1 >0 && value1<=100)) {
//手动抛出异常
throw new IllegalArgumentException("被除数必须为 1~100 之间
的数据");
}
int value3 = value1/value2;
return value3;
}finally {
//throw 虽然类似 return 语句,但 finally 会执行的
System.out.println("-----------finally------------");
} } }

5、异常的捕获顺序

异常的捕获顺序应该是:从小到大

将 IOException 放到前面,会出现编译问题
因为 IOException 是 FileNotFoundException 的父类,
所以截获了 IOException 异常后,IOException 的子异常
都不会执行到,所以再次截获 FileNotFoundException 没有任何意义
异常的截获一般按照由小到大的顺序,也就是先截获子异常,再截获父
异常

import java.io.*;
public class ExceptionTest18 {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("test.txt");
fis.close();
}catch(IOException e) { 
e.printStackTrace(); 
}catch(FileNotFoundException e) { 
e.printStackTrace();
}
//将 IOException 放到前面,会出现编译问题
//因为 IOException 是 FileNotFoundException 的父类,
//所以截获了 IOException 异常后,IOException 的子异常
//都不会执行到,所以再次截获 FileNotFoundException 没有任何意义
//异常的截获一般按照由小到大的顺序,也就是先截获子异常,再截获父
异常
} 
}

6、自定义异常

自定义异常通常继承于Exception 和RuntimeException

自定义受控异常

class MyException extends Exception {
public MyException() {
//调用父类的默认构造函数
super();
} 
public MyException(String message) {
//手动调用父类的构造方法
super(message);
} }

自定义非受控异常

class MyException extends RuntimeException {
public MyException() {
//调用父类的默认构造函数
super();
} 
public MyException(String message) {
//手动调用父类的构造方法
super(message);
} }