第7章:异常处理
1、异常概述与异常体系结构
1.1 异常引出: 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是考代码能够避免的(如客户输入数据的格式、读取文件是否存在、网络是否始终保持通畅等)。
1.2 异常概念:
异常: 在Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
1.3 异常事件分类:
Java程序在执行过程中发生的异常事件可以分为两类:
- Error: Java虚拟机无法解决的严重问题。如JVM系统内部错误、资源耗尽等严重情况、StackOverflowError(栈溢出,如无限递归函数)和OOM(OutOfMemoryError,堆溢出,存储空间太大)。一般不编写针对性的代码进行处理。
- Exception: 其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。如空指针访问、试图读取不存在的文件、网络连接中断、数组角标越界。
1.4 异常体系结构:
对于异常体系结构是一个继承关系
java.lang.Throwable
|-----java.lang.Error:一般不编写针对性的代码处理
|-----java.lang.Exception:可以进行异常的处理
|-----编译时异常(checked,非受检异常)
|-----IOException
|-----FileNotFoundException
|-----ClassNotFoundException
|----- …………
|-----运行时异常(unchecked,受检异常)
|-----NullPointerException
|-----ArrayIndexOutOfBoundsException
|-----ClassCastException
|-----NumberFormatException
|-----InputMismatchException
|-----ArithmeticException
编译时异常:执行javac.exe命令时,出现的异常,不让过编译。
运行时异常:执行java.ext命令时,可能出现的异常。
1.5 异常处理概述:
使用过多的if-else分支去处理异常,会导致程序的代码加长、臃肿、可读性差,因此我们此阿勇异常处理机制。
Java异常处理机制: 是将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简洁、优雅、并易于维护。
1.6 Java异常处理的方式:
- try-catch-finally
- throws + 异常类型
1.7 异常处理:抓抛模型
过程一:“抛”:程序在正常执行过程中,一旦出现一异常,就会在异常代码处生成一个对应异常类的对象。并将此对象抛出给程序的调用者,一旦抛出对象以后,其后的代码就不再执行。
关于异常对象的产生:1、系统自动生成异常对象;2、手动的生成一个异常对象,并抛出(throw)
过程二:“抓”:可以理解为异常的处理方式:1、try-catch-finally 2、throws
2、常见异常
2.1 常见异常举例:
package ExceptionTest;
import java.util.Date;
import java.util.Scanner;
import org.junit.Test;
public class ExceptionTest {
//**********以下是编译时异常*****************
//在编译的时候就打叉了,无法进行编译,即javac,无法生成字节码文件
//**********以下是运行时异常*****************
//可以执行,可以生成对应的字节码文件
//当进行运行时,即java时,会出现问题
//NullPointerException —— 空指针
@Test
public void test1(){
//例子1:
//int[] arr = null;
//arr[1] = 10;
//例子2
String str = "abc";
str = null;
System.out.println(str.charAt(0));
}
//ArrayIndexOutOfBoundsException ——数组角标越界
@Test
public void test2(){
int[] arr = new int[10];
System.out.println(arr[10]);
}
//ClassCastException —— 类型转换异常
@Test
public void test3(){
Object obj = new Date();
String str = (String)obj;
}
//NumberFormatException —— 数值格式异常
@Test
public void test4(){
String str = "abc";
int num = Integer.parseInt(str);
}
//InputMismatchException —— 输入类型不匹配
@Test
public void test5(){
Scanner scan = new Scanner(System.in);
int sc = scan.nextInt(); //输入“abc”
System.out.println(sc);
}
//ArithmetticException —— 算术异常
@Test
public void test6(){
int a = 2;
int b = 0;
System.out.println(a / b);
}
}
3、异常处理机制一:try-catch-finally
3.1:try-catch-finally的使用
try{
//可能出现异常的代码(可能出现,不一定是一定会出现的)
}catch(异常类型1 变量名1){
//处理异常方式1
}catch(异常类型2 变量名2){
//处理异常方式2
}catch(异常类型3 变量名3){
//处理异常方式3
}
……
finally{
//一定会执行的代码(即不管有无异常出现都会执行)
}
/*
try-catch的说明:
1、使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配。
2、一旦try中的异常类型匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的try-catch结构(在没有写finally的情况),继续执行其后的代码。
3、catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面(因为不然父类先执行,子类后执行!应该从小到大去判断),否则报错。
4、常用的异常处理对象的方式:a、String getM