当前位置:课程学习>>第六章 异常处理>>文本学习>>知识点一
一、异常
在编写程序时难免会出现一些错误,这些错误一般可以分为两类:编译错误和运行错误。编译错误相对简单,它是由于所编写的程序存在语法错误,不能通过编译操作,导致不能运行,在Java中是由javac.exe来负责检测和报告。运行错误是
指在程序运行过程中产生的错误,这类错误很难发现和更正。
异常(exception)又称例外,它是一种运行错误,是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的健壮性,在程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。
二、异常处理
1. 异常处理
Java中针对程序中的异常采用异常处理机制来捕获和处理异常。在一个方法(main()方法或其他方法)的运行过程中,如果发生了异常,Java系统会生成该异常的一个对象,并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。这个过程一般称为抛出异常。
异常抛出后,运行时系统就在方法的调用栈中查找,采用回溯方式沿着方法调用堆栈向上查找,找到异常处理方法后,交给该方法去处理。这个过程称为捕获处理异常。
如果所有方法中均没有相关的异常处理程序,程序就会被终止执行。
2. Throwable类
针对不同的异常,针对不同的异常,Java中提供了相应的异常类,不过所有这些异常类都是直接或间接继承java.lang.Throwable类。只有当对象是此类(或其子类之一)的实例时,才能通过Java 虚拟机或者throw语句抛出。类似地,只有此类或其子类才可以是 catch 子句中的参数类型。图5.1是Throwable类与子类的层次结构图。
图5.1 Throwable类及其子类的层次结构图
Throwable类有两个直接子类Error类和Exception类。Error类用于表示合理的应用程序不应该试图捕获的严重问题,该类及其子类主要用来描述一些Java运行时系统内部的错误或资源枯竭导致的错误,由Java虚拟机抛出,Java程序对此不做任何处理。
Exception类是所有异常类的父类,它又分为两类:一类是运行时异常(RuntimeException),一类是非运行时异常(Non-RuntimeException)。
运行时异常是Java中最为常见的异常,如除数为0的
数学异常(ArithmeticException)、
下标越界异常(IndexOutOfBoundsException)、
非法参数异常(IllegalArgumentException)、
空引用异常(NullPointerException)等,这类异常产生频率较高,如果一一去编程捕获处理,这样会影响程序的可读性和运行效果。因此对这类异常Java运行时系统本身就可以检测和报告,用户可以不做任何处理。程序中存在这类异常时,能够编译成功,只是在运行过程中,运行到存在异常的语句时会中断程序的运行,报告该异常的相关信息。
【例5.1】运行时异常。
1 //RuntimeExceptionTest.java
2 public class RuntimeExceptionTest {
3 public static void main(String[] args) {
4 int a=0;
5 int b=3;
6 double c;
7 System.out.println("a="+a+",b="+b);
8 c=b/a;
9 System.out.println("c="+c);
10 }
11 }
该程序能够正常编译通过,不过在运行时由于第8行语句除数为0所以会出现异常,第8行以前的语句正常运行,第8行以后的语句便被中断了,同时Java系统报告该异常的信息,如图5.2所示。
图5.2 运行时异常
除了运行时异常及其子类之外的其他异常都被称为非运行时异常,如输入输出异常(IOException)等,这类异常多是由于用户或环境原因造成的,如打开一个不存在的文件,在程序编译时就能被Java编译器检测出来,因此对于非运行时异常,Java程序中必须对其进行处理(捕获处理或者声明抛出),否则程序不能通过编译。
【例5.2】非运行时异常。
1 //NonRunTimeExceptionTest.java
2 import java.io.FileInputStream;
3 public class NonRunTimeExceptionTest
4 {
5 public static void main(String[] args)
6 {
7 System.out.println("begin");
8 FileInputStream in=new FileInputStream("test.txt");
9 System.out.println("over");
10 }
11 }
编译该程序时就会出现图5.3所示的错误提示。
图5.3 未做任何处理的非运行时异常不能通过编译
对于程序中的非运行时异常在程序运行中可能会发生,也可能不会发生,但是这类异常Java系统要求必须捕获处理或声明抛出,如【例5.2】非运行时异常,这里的test.txt文件是存在的。