Java:异常处理

一、异常与异常类

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语句抛出。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

silence_sz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值