Java的异常处理机制
2015-11-10 01:19
821 查看
在程序运行过程中,可能会遇到各种各样的错误。可能由用户没按规定输入,可能在运行过程中发生数组越界,可能在运算中出现了不符合运算规则的数据等等。这些异常,都容易造成程序运行错误,引发程序崩溃。所以,预想到这些异常的发生,并做对应的异常处理就十分重要。
传统的异常处理,采用大量的if语句对异常进行处理,使得整个程序的代码结构十分复杂,可读性很差,而且对于错误的返回信息少。
Java提供了一种独特的处理异常的机制,通过异常来处理程序设计中出现的错误。把出错处理和正常代码分开,Java异常处理通过5个关键字try,catch,finally,throw和throws进行管理。
一、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关键字来调用基类的构造器。
四、异常的处理机制
在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()。
2. throw和throws语句
在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛出(throw)异常。如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛出(throws)异常。这是一种消极的异常处理机制。
在方法中,抛出异常对象是通过throw语句实现的。throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
传统的异常处理,采用大量的if语句对异常进行处理,使得整个程序的代码结构十分复杂,可读性很差,而且对于错误的返回信息少。
Java提供了一种独特的处理异常的机制,通过异常来处理程序设计中出现的错误。把出错处理和正常代码分开,Java异常处理通过5个关键字try,catch,finally,throw和throws进行管理。
一、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{ } }如果方法里产生了异常,而却没有进行处理,编译器会发现这个问题,并提醒你,要不处理这个异常,要不将这个异常抛出。
相关文章推荐
- (java)输出前一天的当前时间
- java线程的基础知识
- 用EL表达式与Java代码的共享数据
- Java --- serial port communication example codes
- Java编译期和运行期
- Java基础4(方法基础和一维数组)
- Java编译期优化与运行期优化技术浅析
- 异常处理:User_$$_javassist_1 cannot be cast to javassist.util.proxy.Proxy
- prefix springmvc
- Java类加载过程
- JDK中数据类型Boolean、Byte
- 专访黄勇:Java在未来的很长一段时间仍是主流
- crud springmvc
- Java 运行原理
- Java文件操作大全
- java 打开本地文件的方法
- 如何将java工程转变为web工程
- java的注释原则
- Java 登陆拦截器
- java 环境变量配置