Java的异常处理
Java的异常处理机制可以帮助我们避开或者处理程序可能发生的错误,从而使得程序在遇到一些可恢复的错误的时候不会意外终止,而是去处理这些错误,也使得我们在写程序的时候不必写大量的代码来检查错误情况,增强了代码的可读性和逻辑性。在Java中,异常代表一个错误的实体对象。异常可分为两类;一类是严重错误,如硬件错误、内存不足等,它们对应着java.lang包下的Error类及其子类。通常这类错误程序自身是无法恢复的,需要中断程序的执行;另一类是非严重的错误,如用户输入了非法数据,被0除等,它们对应着java.lang包中的Exception类及其子类,这种错误一般可以恢复,不影响程序的运行。我们可以用try, catch,finally关键字来捕捉异常。1、try, catch将可能会发生异常的语句放到try{}块中,然后在catch{}语句块中捕捉即可。如被0除异常:[java]public class SimpleDemo{//除法运算public static int devision(int a,int b){return a / b;}public static void main(String[] args){try{//5除以0SimpleDemo.devision(5,0);System.out.println("Exception");}catch (Exception e){e.printStackTrace();}System.out.println("Finish");}}执行结果:可以看到,Finish被打印了出来,说明程序并没有因为发生了被0除的错误而终止。同时我们也发现,发生异常的SimpleDemo.devision()下面的System.out.println语句并没有被执行。一旦异常发生,程序就会从当前执行的位置跳出,而不会执行异常后面的语句。2、finallyfinally语句块中的语句无论异常有没有发生都会被执行。有人可能会问,既然finally块中的语句无论异常有没有发生都会被执行,那么这个finally到底有什么实际作用呢?我不用finally直接写在外面不行么?如上例,我们在catch语句块中加入一个return:[java]public class SimpleDemo{//除法运算public static int division(int a,int b){return a / b;}public static void main(String[] args){try{//5除以0SimpleDemo.division(5,0);System.out.println("Exception");}catch (Exception e){e.printStackTrace();return; //main函数返回}finally{System.out.println("Finally");}System.out.println("Finish");}}这时候,finally外面的Finish没有被打印,而finally块内部的Finally则被打印了出来。finally在实际开发中非常有用。例如我们打开了一个数据库,在数据库读写数据的时候发生了异常,那么这时候就应该关闭数据库的连接,并释放相应的资源。这时候把释放资源的代码写在 finally块中是最合适不过的了。但要注意的是,finally块在一种情况下是不会被执行的。如果程序在执行到finally块前退出了,如调用System.exit()方法,则 finally块也就得不到执行的机会了。3、丢出异常如果在一个方法中会有异常发生,但我们不想在方法中直接去处理这个异常,而是想让方法的调用者去处理,则可以使用throws关键字声明这个方法来丢出异常。这在Sun给我们提供的API函数中非常常见,如java.io.Reader中的read方法被声明为丢出一个IOException异常:public int read(char[] cbuf)throws IOException这时候我们在调用read方法时就必须将其放在try语句块中进行异常捕捉,否则编译器就会报错,强制我们进行异常捕捉。当然,如果我们确实不想在调用read的时候处理异常,那么也可以把调用read方法的方法声明为throws IOException,这样异常就会再次被丢出。如果我们在main函数中声明丢出Exception异常,那么异常信息最终会被JVM捕获处理,而JVM的处理结果是,打印出异常信息,然后终止程序的运行。4、异常处理的构架所有的异常类都是从Exception类中派生而来的。这意味着,如果我们不确定会发生什么类型的异常,可以直接在catch中声明一个Exception对象,就能捕获到所有的Exception类及其子类的异常了。但要注意catch书写的顺序。如果在一个try后面有多个catch且第一个catch中声明的是Exception对象,那么这个异常就会直接被第一个catch处理,后面的catch都无法捕获到这个异常。这种错误在编译的时候就会以产生错误。如下例:[java]public class CatchDemo{//除法运算public static int division(int a,int b){return a / b;}public static void main(String[] args){try{CatchDemo.division(4,0);}catch(Exception e){System.out.println("Exception Class");}catch(ArithmeticException e){System.out.println("ArithmeticException Class");}}}编译器输出 ArithmeticException已经被捕获了,意思就是说上面的Exception已经捕获了这个异常,无须重复捕获。如果把这两个catch反过来会怎样呢?[java]public class CatchDemo{//除法运算public static int division(int a,int b)补充:软件开发 , Java ,
上一个:Spring mvc
下一个:10020 - Minimal coverage
- 更多JAVA疑问解答:
- java怎么在线读取ftp服务器上的文件内容
- 关于程序员的职业规划
- HTML和JSP矛盾吗?
- java小程序如何打包?
- java怎么split路径文件名?
- 关于Hibernate实体自身多对一的抓取问题
- 关于apache2+tomcat群集出现的问题
- SSH 导入导出excel 谁有这块的资料吗?
- springmvc 加载一个jsp页面执行多个方法 报404
- 关于用jquery 导入 excel
- java对时间进行循环放到List中
- 一个图片的输入输出程序,第一次调用某方法会中断,第二次调用则正常
- 请上过传智播客的人说一下传智播客怎么样呀!是不是像它说的那样好呀!
- spring的schema怎么配置
- 【菜鸟求助】SSH中怎么从JSP页面往后台传值呢