20170729学习笔记之异常处理

来源:互联网 发布:win10右下角网络红叉 编辑:程序博客网 时间:2024/06/06 09:04

1.为什么会有异常处理这玩意儿?

程序运行时不可避免的会发生错误或出现异常,因此一门成熟的编程语言应提供对这类情况的处理机制。Java从C++继承了以面向对象方式处理错误的机制,用对象的形式来表示一个(或一类)异常,该对象不仅封装了错误信息,还包含了错误发生时的“上下文”信息,便于程序员更好地管理和处理异常,写出具有容错性的健壮的程序。

2.什么是异常?

所谓异常,是指在程序运行中由代码产生的一种错误,在Java中,任何异常都是java.lang.Throwable类或其子类的对象,Throwable类是Java异常类体系中的根类,如图1所示,它有两个子类:Error和Exception。
图1
Error类:系统错误类,代表程序运行时Java系统内部错误,这种错误程序员一般不用关心,因它们通常由硬件或操作系统所引发,一旦发生,程序员除了告知用户并关闭程序外,别无他法。
Exception类:异常类,该类(及其子类)的对象表示的错误往往是因算法考虑不周或由于编程过程中疏忽大意、未考虑到某些特殊情形而引起的,需要程序员认真对待并尽可能地加以处理。
Exception类有两大子类,其中有Runtime(运行时)异常,此类异常编译器不做检查,在运行时才会发现,和其他的非Runtime(运行时)异常,这类异常在编译时就需要处理,不然编译器是无法通过的。

3.异常处理机制?

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。
        抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
        捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。

4.异常的捕获和处理?

Java使用try-catch-finally语句来捕获并处理异常,该语法的语句格式如下:

try{     //可能会产生异常的程序代码}catch(Example_1 e1){     //处理异常Example_1 的代码}catch(Example_2 e2){     //处理异常Example_2 的代码}……catch(Example_n en){     //处理异常Example_n 的代码}finally{     //异常不管是否触发都会运行的代码,通常是释放资源的程序代码}


5.声明抛出异常子句?

声明抛出异常是一个子句,只能加在方法头部的后面,例如:
public int read() throws Example{……}
若一个方法声明抛出异常,就要求方法的调用者在程序中对其抛出的这些异常加以注意并处理。即使一个方法没有声明抛出异常,它仍可能会抛出异常,只不过不要求调用者处理而已。方法抛出的异常也不一定都在其所声明的异常列表中,但通常异常列表中列出的都是要调用者在程序中明确加以处理的异常,处理方式可以是用try-catch-finally语句,或用try-catch-finally捕获后再次抛出,留给后继调用者去处理,从而形成异常处理链。

6.抛出异常?

声明抛出异常子句只是个说明性的语句,表明方式可能会抛出异常,而真正的抛出异常的动作却是由“抛出异常”语句来完成的,例如:
throw new Exception("这是一个异常对象");
例子:
public void f() throws MyException{    ……         if(a<0)               throw new MyException("这是一个异常对象");    ……}

7.自定义异常类

Java内置的异常类已经能够描述编程中出现的大多数异常情况,但有时候需要描述用户程序自身所特有的异常信息,以区别于其他程序的异常,这时候就需要自定义异常类。自定义的异常类必须是Throwable的子类,通常是从Exception或其子类继承。在程序中使用自定义的异常类,大体可以分为以下几个步骤。
(1)创建自定义异常类。
(2)在方法体中通过throw关键字抛出异常对象。
(3)若想在当前方法中就处理该异常,可以使用try-catch-finally语句,否则,在方法的声明出通过throws 关键字指明要抛出给方法调用者的异常,继续下一步。
(4)有方法调用者捕获并处理异常。
例子:
import java.util.Scanner;class MyException1 extends Exception {int num;public MyException1(int a) {this.num = a;}@Overridepublic String toString() {return num + "<10!\r\n值必须大于10";}}class MyException2 extends Exception {int num;public MyException2(int a) {this.num = a;}@Overridepublic String toString() {return num + ">10!\r\n值必须小于10";}}public class MyExceptionTest {public static void makeException(int a) throws MyException1, MyException2 {if (a < 10) {throw new MyException1(a);} else if (a > 100) {throw new MyException2(a);} else {System.out.println("没有产生例外");}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int a = sc.nextInt();try {makeException(a);System.out.println("10<" + a + "<100");} catch (MyException1 e1) {System.out.println("产生第一个例外" + e1);} catch (MyException2 e2) {System.out.println("产生第二个例外" + e2);} finally {sc.close();}}}




原创粉丝点击