文章目录
一、异常与异常类
1.1 异常(Exception)的概念
在Java程序中,异常通常是由两种原因导致的;
(1)程序中存在非法操作,最简单的例子就是除数为0的出发操作。这种原因常常时程序员处于无意或大意导致,所以称为隐式异常。
(2)程序员在程序中使用了thorw语句引起的异常。这种异常是程序员出于某种考虑有意安排的,所以称为显式异常。
看一段代码:
public class Exception {
public static void main(String[] args) {
int i=0;
String str[]={"one","two","three"};
while(i<3)
{
System.out.println(str[i]);
i++;
}
System.out.println("程序正常结束");
}
}
上面的代码数组超出了上限,因而出现了异常。我们下面对此来进行处理。
1.2 Java异常类
1、 Java异常类定义
Java的异常处理机制也是面向对象的。每发生一起异常事件,就会自动生成一个异常对象。在Java类库的各个包里定义了很多异常类,所有异常类都直接或间接地继承了Throwable这个类。
Java所有的异常都以类的形式存在,除预定义的异常类外,还允许自定义异常类。如果在一个方法的运行过程中发生了异常,则这个方法将会自动生成一个异常类对象,该异常类对象将被提交给Java运行时系统,这个过程称为抛出异常。抛出异常也可以在程序中使用throw语句强制进行。当Java运行时系统接收到异常对象,会查找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获异常。如果Java运行时系统找不到可以捕获异常的代码,则运行时系统将终止,相应的Java程序也会终止运行。
2、 常用的方法
有关Throwable、Error 和Exception的构造方法和方法可查看JDK API 文档。在此只介绍几个常用的构造方法和方法。
(1 ) public Exception( ):构造详细消息为null新异常。
(2) public Exception(String message):构造带指定详细消息的新异常。
(3 ) public String getMessage( ):返回异常抛出原因的字符串。
(4) public String toString ( ):返回异常的简短描述,包括异常类名、异常原因。
(5) public void printStackTrace( ):输出调用堆栈跟踪信息。
3 、异常类:Error类和Exception类
由上图可以得到Java异常分为两大类:Error类和Exception类。
Java对于不同异常采取以下3种不同处理方式。
(1)程序不能处理的错误
Error类定义了在通常环境下不希望被程序捕获的异常,也就是说Java程序不应该捕获这类异常。因为它们通常是灾难性的致命错误,不是程序可以控制的,如内存溢出、虚拟机错误、桂溢出等。这类错误与程序本身无关,通常由系统进行处理。
(2)通过调试程序避免而不捕获的异常
RuntimeException 类异常(运行时异常)主要是程序设计或实现问题,如数组下标越界、算术异常、使用空引用等。正确设计与实现的程序不应该产生这类异常。对这类异常可以通过调试程序尽量避免而不是去捕获。当然在必要的时候,也可以声明抛出或捕获这类异常。上图是常见RunTimeException类的子类,更多的RunTimeException类的子类可查看JDK API文档。
(3)必须捕获的异常
有些异常在程序编写时无法预料,如中断异常、文件没有找到异常、无效的URL异常等,是除RmEncepien类的其他Ecpon异常(非运行时异常)。在正常条件下这些异常是不会发生的,什么时候发生也是不可预知的。为了保证程序的健壮性,Java要求必须对可能出现的这类异常进行捕获并处理。
二、异常处理
2.1 try-catch-finally 语句
1.使用try-catch-finally 语句处理异常的过程如下。
(1)将要异常监控的程序段放在try代码块中。
(2)如果try代码块中发生异常,抛出的异常会被捕获。
(3)抛出的异常用catch捕获,如何用某种合理的方法处理该异常。
修改上面程序,对数组下标越界异常进行处理。
public class Exception {
public static void main(String[] args) {
int i = 0;
String str[] = {"one", "two", "three"};
try
{while (i < 3) {
System.out.println(str[i]);
i++;
}
}catch (java.lang.ArrayIndexOutOfBoundsException e){
System.out.println("数组下标越界异常");
} finally{
System.out.println("finally i="+i);
}
System.out.println("程序正常结束");
}
}
运行结果如下:
one
two
three
finally i=3
程序正常结束
Process finished with exit code 0
上述程序是RunTimeException类异常,修改程序就可以避免这些异常。使用try-catch-finally 语句捕获程序中产生的异常,然后对不同异常进行不同处理。
下面是try-catch-finally 语句基本格式。
try{
//可能发生异常的语句块
}catch (ExceptionType1 e) {
//处理ExceptionTypel异常的语句块
}catch (ExceptionType2 e) {
//处理Except ionType2异常的语句块
}catch( ..... ){
//处理其他异常的语句块
} finally{
//无论异常是否发生都一-定执行的语句块
}
2.try-catch-finally语句的作用是:当try语句块中的代码执行时发生异常,程序的正常运行便中断,并抛出异常对象,然后在try语向块后面的各个catch()中找出与异常对象相匹配的类。当异常对象符合下面3个条件之一时,就认为这个异常对象与对应的异常类相匹配。
(1)异常对象所属的类与catch()中参数类相同。
(2)异常对象所属的类是catch()中参数类的子类。
(3)catch()中参数类是 一个接口时, 发生的异常对象类实现了这一-接口。
当找到第一一个与之相匹配的参数类时,就执行包含这一参数类的 cuch语句块中的代码,即常处理代码。执行完该caich 语句块中的代码后,程序恢复运行,但不会回到异常发生处继续行,而是执行try-catch结构后面的代码。
2.2 throw和throws 语句
前面已经提到,程序中存在非法操作,会导致异常发生(隐式异常),在程序中也可以使用throw语句人为抛出异常(显式异常)。用throw语句抛出异常有以下两种方法。
(1)直接抛出异常类。
throw new ExceptionType(...);
其中ExceptionType是Throwbale类的子类。
(2)先定义异常对象并实例化,然后抛出。
ExceptionType e=new ExceptionType(...);
throw e;
三、自定义异类
除了可以使用Java包中预定义的异常类,Java还允许自定义异常类来处理特殊情况。自定义异常类主要用来处理用户程序字中特定的逻辑运行错误。
自定义异常类一般都是以 Exception类为父类。
自定义异常类对象只能用throw语句抛出。