java基础17:异常

来源:互联网 发布:淘宝产品图片怎么做 编辑:程序博客网 时间:2024/06/06 18:04


 经常写程序的人对try...catch...finally语句肯定是不陌生的了。但是好多人总对异常搞不太清楚,不知道这个异常什么意思,不知道为什么用这个异常处理,这篇博客为大家从本质上剖析一下java中的异常处理的工作原理。

 一、定义

  在《java编程思想》中这样定义异常:阻止当前方法或作用域继续执行的问题。

  这是书面上的语言,翻译成我们自己的语言其实就是程序运行出现了问题。具体一点说就是程序运行出现了问题,可能会导致程序运行机制。所以就要通过抛出异常的方式告诉开发者哪里出现了问题。

 二、异常体系

  1、既然产生了问题就要解决问题,就像是人生病了要对症下药一样,java中同样给我们一系列的异常处理类。那么这些类要如何区分?

    总的来说,java中的异常有两种,一种是Error,一种是Exception。

    error一般不可以处理也叫错误,Exception一般可以处理。

  2、Exception分类

   而Exception又可以分两类,一类是运行时异常,一类是编译时异常。

a.运行时异常:

   都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

       运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

       b.非运行时异常 (编译异常):

  是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

注意:java中Exception和Error的子类名都是以父类名作为后缀。

 三、自定义异常类

既然java中的异常处理都是调用预先建好的类,那么我们可不可以自定义异常类呢?答案是肯定的。

 1 class CeshiException extends Exception 2 { 3     CeshiException() 4     {} 5  6      7     CeshiException(String msg) 8     { 9         super(msg);10     }11 }

 四、异常处理原则

  1.函数内容如果抛出需要检测的异常,那么函数上必须要声明,否则必须在函数内用try...catch捕捉,否则编译失败。

  2.如果调用到了声明异常的函数,要么try...catch要么throws,否则编译失败。

 

  3.一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。内部有几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。

 五、异常处理机制

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。
1、抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。

2、捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。

 六、最后

一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度。用好异常处理才能让我们的程序跟健壮

 

异常主要分为:错误、一般性异常(受控异常)、运行期异常(非受控异常)

l  错误:如果应用程序出现了Error,那么将无法恢复,只能重新启动应用程序,最典型的Error的异常是:OutOfMemoryError

l  受控异常:出现了这种异常必须显示的处理,不显示处理java程序将无法编译通过

l  非受控异常:此种异常可以不用显示的处理,例如被0除异常,java没有要求我们一定要处理

 

异常的捕获和处理需要采用try和catch来处理

l  try中包含了可能产生异常的代码

l  ry后面是catch,catch可以有一个或多个,catch中是需要捕获的异常

l  当try中的代码出现异常时,出现异常下面的代码不会执行,马上会跳转到相应的catch语句块中,如果没有异常不会跳转到catch中

   

     finally表示,不管是出现异常,还是没有出现异常,finally里的代码都执行,finally和catch可以分开使用,但finally必须和try一块使用

 

java程序运行常见的运行时异常:

ArithmeticException - 算术运算中,被0除或模除

ArrayIndexOutOfBoundsException - 数组越界访问

ArrayStoreException - 数据存储异常,写数组操作时,对象或数据类型不兼容

ClassCastException - 类型转换异常

IllegalArgumentException - 方法的参数无效

IllegalThreadStateException - 试图非法改变线程状态,比方说试图启动一已经运行的线程

NullPointerException - 试图访问一空对象的变量、方法或空数组的元素

NumberFormatException - 数据格式异常,试图把一字符串非法转换成数值(或相反)

SecurityException - 如果Applet试图执行一被WWW浏览器安全设置所禁止的操作

IncompatibleClassChangeException - 如改变了某一类定义,却没有重新编译其他引用了这个类的对象。如某一成员变量的声明被从静态改变为非静

态,但其他引用了这个变量的类却没有重新编译,或者相反。如删除了类声明中的某一域或方法,但没有重新编译那些引用了这个域或方法的类

OutOfMemoryException - 内存不足,通常发生于创建对象之时

NoClassDefFoundException - JAVA运行时系统找不到所引用的类

IncompatibleTypeException - 试图实例化一个接口,Java运行时系统将抛出这个异常


0 0
原创粉丝点击