JAVA之异常处理结构

作者 做棵大树 日期 2017-04-01
JAVA之异常处理结构

异常处理

本章要点

  • 理解异常和错误处理

  • 理解JAVA的异常层次结构及异常分类

  • 掌握基本的异常处理编程

异常

  • 异常(Exception)又称例外—是在程序运行过程中发生的、会打断程序正常执行的事件。

  • 例如:除0(ArithmeticException)、没有给对象开辟内存空间时会出现空指针异常(NullPointException)文件找不到(FileNotFoundException)数组元素下标越界(ArrayIndexOutOfBoundsException)等。这些事件的发生将阻碍程序的正常运行。为了增加程序的容错性健壮性,程序设计时,必须考虑到可能发生的异常情况并做出相应的处理。

  • 设计程序时必须考虑可能发生的异常事件并作出相应的处理。传统程序设计时,要由编程者自己测试出错发生的原因,通过 i f 语句判断是否出现了异常事件,并进行相应的处理。

  • 传统异常处理存在的困难和问题

写程序难

★ 大部分精力花在出错处理上了

只把能够想到的错误考虑到

★ 对以外的情况无法处理

程序可读性差

★ 大量的错误处理代码混杂在程序中

出错返回的信息量太少

★ 无法更确切的了解错误状况或原因

异常层次结构及分类

[caption id=”attachment_379” align=”alignnone” width=”852”] 异常层次结构及分类[/caption]

Error****Exception

1.Throwable**以下的异常都可以被捕获**

2.所有**Error类及其子类代表java运行时系统中可能发生的异常情况,是致命的,即程序遇到了非常严重的不正常状态,不能简单恢复执行,这就是错误**。如:内存耗尽、系统内部错误等,通常我们(应用程序)不应捕获这些异常。

3.所有**Exception类及其子类代表java程序中可能发生的异常情况,是非致命的通过某种修正后程序还能继续执行。这类错误叫作异常。如:文件不存在、无效的下标、空引用、网络断开、打印机脱机、磁盘满了等,通常我们(应用程序)可以捕获这些异常。**

Exception分类

Exception是要重点掌握的,它也分为两类: (1)受控异常(检查异常):java编译器对受控异常强制执行捕获或者声明

(2)不受控异常(非检查异常):java编译器不会检查代码以确定是捕获或者声明不受控异常。尽管编译器对不受控异常没有捕获或者声明的强制要求,但在知道可能发生这种异常时应提供合适的异常处理代码。

|—— IOException

|—— AWTException

Exception ——|

|—— ClassNotFoundException

|—— NoSuchMethodException

不受控异常

[caption id=”attachment_380” align=”alignnone” width=”851”] 异常层次结构及分类[/caption]

异常处理

  • try-catch**结构**

  • try{

  • //**可能产生异常的代码**

  • }

  • catch(**someException e){**

  • //**处理异常的代码**

  • }

  • catch(**someException e){**

  • //**处理异常的代码**

  • }

  • try-catch-finally**结构**

  • try{

  • //**可能产生异常的代码**

  • }catch(**someException e){**

  • //**处理异常的代码**

  • } finally{

  • //**必须执行的代码**

  • }

异常处理

  • 注意:
  • catch**finally必须至少有一个跟在**try 后面
  • 如果不发生异常**,catch**块中的代码不会被执行
  • 不论是否发生异常**finally**块中的代码一定会被执行

自定义异常

用户为什么要自定义异常?

Java**类库中定义的异常主要用来处理编程中一些常见的运行错误,这些错误是系统可以预见和自动识别的。**

若用户程序有其特殊的逻辑要求,需要通过**Java**的异常处理机制来处理用户自定义的异常。

如何自定义异常?

  1. 创建一个类,必须继承**Exception**类
  2. 在可能抛出自定义异常方法的方法头中声明该异常
  3. 在方法体中指明需要抛出自定义异常对象的位置创建异常对象使用**throw**子句抛出异常

自定义异常(例)

在可能抛出自定义异常方法的方法头中声明该异常

public static void show(**int score)**

throws NumberRangeException**{**

if(score<0||score>100){

NumberRangeException e=

new NumberRangeException**(“输入的数字不在指定的范围!请重新输入。“);**

throw e;

}

else{

int s=score/10;

switch(s){

case 10:

case 9:System.out.println(“A”);break;

case 8:System.out.println(“B”);break;

case 7:System.out.println(“C”);break;

case 6:System.out.println(“D”);break;

default:System.out.println**(“E”); }**

}

}

show()**方法的调用**

public static void main(String[] args**) {**

int score = Integer.parseInt**(args[0]);**

try{

show(score);

}catch(**NumberRangeException e){**

System.out.println**(e.getMessage());**

}

}

throws与throw

  • 1.throws 用于抛出方法层次的异常,并且直接由这些方法调用异常处理类来处理该异常,所以它常用在方法的后面。比如 public static void main(String[] args) throws IOException

  • 2.throw 用于方法块里面的代码,比throws的层次要低,表示它抛出异常, 但它不会处理它,而是由方法块的throws Exception来调用异常处理类来处理。

转载请注明:转自:TeenShare梯云分享