您的位置:首页 > 编程语言 > Java开发

Java的异常处理机制

2015-11-10 01:19 821 查看
  在程序运行过程中,可能会遇到各种各样的错误。可能由用户没按规定输入,可能在运行过程中发生数组越界,可能在运算中出现了不符合运算规则的数据等等。这些异常,都容易造成程序运行错误,引发程序崩溃。所以,预想到这些异常的发生,并做对应的异常处理就十分重要。

  传统的异常处理,采用大量的if语句对异常进行处理,使得整个程序的代码结构十分复杂,可读性很差,而且对于错误的返回信息少。

  Java提供了一种独特的处理异常的机制,通过异常来处理程序设计中出现的错误。把出错处理和正常代码分开,Java异常处理通过5个关键字try,catch,finally,throwthrows进行管理。

一、Throwable类

  Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java
throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。 当Java程序遇到不可预料的错误时,会实例化一个从Throwable类继承的对象。

  两个子类的实例,Error
Exception,通常用于指示发生了异常情况。通常,这些实例是在异常情况的上下文中新近创建的,因此包含了相关的信息(比如堆栈跟踪数据)。

Error一般指系统错误或运行环境的错误,一般在编译时解决,由Java虚拟机生成并抛出。在Java程序中不做处理。

Exception指一些在运行周六可以恢复的异常,一般是可以预知的异常情况。

二、Exception类

  Exception
类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。

  Exception
类有非常多的子类。分别用于处理各种类型的异常。它继承了来自Throwable的一些方法,常用的有:

String getMessage() :返回该异常所存储的描述性字符串。

String toString():返回异常对象的详细信息,包含该类名和指出所发生问题的描述性消息的字符串。

void printStackTrace():将异常发生的路径,即引起异常的方法调用嵌套序列打印到标准错误流。

三、自定义异常类

  在Java中,除了Exception类中已经给出的异常处理之外,还有很多异常类型,Java所提供的异常体系不可能预见到所有可能出现的加以报告的异常。所以,我们需要自己定义异常类来处理程序中会遇到的特定异常。

  要自己定义异常类,必须从已有的异常类继承。最好的方法是选择一个已有异常相近的类继承。

  建立异常类,最简单的办法是让编译器为你产生一个默认的构造器,这样可以不用写很多的代码。由编译器创建的默认构造器会自动调用基类的构造器。

  也可以创建一个带参数的构造器,使用super关键字来调用基类的构造器。

class MyException extends Exception
{
MyException(){
super("数据错误!");
}
MyException(String exp){
super(exp);
}
}


四、异常的处理机制
在Java中处理异常的方式有两种:捕获异常和声明抛出异常。

捕获异常:就地解决,并使程序继续执行。

声明抛出异常:是将异常向外转移,即将异常抛出方法之外,由调用该方法的环境去处理。

1. try-catch-finally语句

try语句包含的代码块为监控区域,这是一段可能产生异常的代码,在try之后紧跟着的catch是处理这些异常的代码,catch语句可以有多个。catch语句只需要一个形式参数指明它所能够捕获的异常类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛弃的异常对象传递给catch块。最后的finally是在异常处理之后一定会执行的语句。

每一个catch子句,就是处理一个异常的代码。当被监控的代码块产生异常时,程序不再继续往下执行,程序捕获到异常,并在catch中搜寻与异常类型相匹配的第一个处理程序。然后就进入到相应的catch语句块中执行,此时,认为异常得到了处理。所以catch语句块中存放对异常对象进行处理的代码。在对应一个catch语句块之后,剩下的catch语句块不会再被执行。所以,在写catch语句块的顺序时,应当先处理最特殊的异常,然后再逐渐一般化。先安排子类的异常处理,再安排父类的。

finally语句是最后一步,它为异常处理程序提供一个统一的出口,可以为程序的下一步运行做一个准备。不过,无论try语句块中是否发生了异常,finally语句都会被执行。另外,finally语句并不是必须存在的。finally语句块可以用来执行一些无论如何都希望被执行的语句块,比如sw.off()。

public class TryCatchDemo {

public static void main(String[] args) {
try{
int a,b,c;
a = 100;
b = Integer.parseInt(args[0]);
c = (a / b);

System.out.println("c="+c);
}
catch(ArrayIndexOutOfBoundsException e)  //数组下标越界异常
{
System.out.println("异常:"+e.getMessage());
e.printStackTrace();
}
catch(ArithmeticException e)  //处理算术运算异常
{
System.out.println("异常:"+e.getMessage());
e.printStackTrace();
}
finally
{
System.out.println("执行完毕!");
}
}

}


2. throw和throws语句

在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛出(throw)异常。如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛出(throws)异常。这是一种消极的异常处理机制。

在方法中,抛出异常对象是通过throw语句实现的。throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。

IOException e=new IOException();
throw e ;
当异常在方法内部不知道如何处理的时候,就可以将异常向外抛出,由调用方法的对象来处理异常。用关键字throws,在方法的参数列表之后,throws后可以跟多个异常类型。

public class TryCatchDemo {

public static void main(String[] args) throws ArrayIndexOutOfBoundsException,ArithmeticException{

}

}
如果方法里产生了异常,而却没有进行处理,编译器会发现这个问题,并提醒你,要不处理这个异常,要不将这个异常抛出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: