java异常介绍

来源:互联网 发布:mac回到桌面快捷键 编辑:程序博客网 时间:2024/05/18 01:20

java异常的层次结构是Throwable接口下有2个子类error和exception。error异常是jvm抛出来的程序员用程序解决不了的异常。向OutOfMemeory内存溢出异常。

exception分为运行时异常(runtimeexception)和非运行时异常。

   首先先讲运行时异常,所谓运行时异常就是在程序运行的过程中产生的异常。这种异常编译器是检查不到的需要程序员自己注意。比如空指针异常和数组越界异常接下来举个列子说明下:

public class Test4 {public static void main(String[] args) throws IOException {String s = null;System.out.println(s.length());}}


这段代码在编译的时候没有问题编译器不会报错,但是在运行的时候由于s=null,而null没有length方法所以当null调用length方法的时候会报空指针异常。

 

处理异常有2种方式第一种就是用try....catch....finally来进行扑捉,try...catch是必须有的 catch可以有多个 至少有一个 而finally可有可无。也可以往外抛由方法的调用者来处理该异常。不过如果最终不用try..catch来扑捉的话程序会因为抛出来的异常而全体崩溃,如果用try...catch来处理后的话那么当有异常的时候程序只会步执行try中碰到异常后面的代码而try...catch外面的代码还能执行。举个列子来说

public class Test4 {public static void main(String[] args) throws FileNotFoundException{InputStream is = new FileInputStream(new File("123"));System.out.println("test");}}


当然我们这个文件是步存在的连最基本的文件格式都是错误的。。当运行的时候会发现异常后面的test没有打印出来。因为没有扑捉异常而是抛给了main线程导致整个程序都崩溃了。

接下来我们看下try..catch处理过的程序

public class Test4 {public static void main(String[] args){try {InputStream is = new FileInputStream(new File("123"));System.out.println("try");} catch (FileNotFoundException e) {System.out.println("catch");e.printStackTrace();}System.out.println("test");}}


程序运行的结果是打印catch,打印错误信息,最后我们会发现try..catch外面的test也打印出来了。这说明如果异常由try...catch扑捉后只有在try中抛异常的代码后来的程序(比如上面程序中打印try没有打印)不执行外面的代码还会执行(比如外面的天test还是打印的),这样就保证了程序没有完全崩溃还是继续往下执行。。

 

这里插一句往外抛异常的目的一是让方法的调用者来处理该异常,二是可以通知编译器来检查方法的调用者是否处理了该异常(就是非运行时异常)。比如我们在写程序的时候有的时候编译器会提示我们有异常没处理(非运行时异常),编译器怎么知道我们没有处理异常是因为我们调用jdk的那个方法抛出了异常比如:

public class Test4 {public static void main(String[] args){InputStream is = new FileInputStream(new File("123"));System.out.println("try");}}


会发现 new FileInputStream(new File("123"));提示要跑异常我们看下这个构造器的源码会发现

  public FileInputStream(File file) throws FileNotFoundException {


源码构造器抛出了异常通知了编辑器来检查构造器是否有处理异常。。。。。

 

最后讲一下try..catch...finally  这里想要突出的是不管有没有异常finally语句中的代码是一定会执行的。finally语句可以用来关闭一些资源比如io和数据库连接这里就不举列子了。

这里想要说的一种情况是:举个列子

package com.djk.test;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class Test4 {public static void main(String[] args){System.out.println(Innerss.getTest());}}class Innerss{@SuppressWarnings("finally")public static String getTest(){try {String s = null;return s.length()+"";} catch (Exception e) {System.out.println(e);return "catch";}finally{return "finally";}}}


这段代码会发生异常然后到catch语句中这是会发现catch中进行了return 。那么retrun后finally中的语句还会执行吗?答案是会的 所以最终返回的其实是finally字符串。这里想要说的是有时候当遇到一个方法有返回值的时候,里面有try..catch..finally语句尽管在try或catch中已经retrun不过最后还是会执行finally句最终返回finally中的return。不过这样做意义不大。。。呵呵异常就讲到这吧 ,如果哪里讲的不对的会希望朋友们可以帮我指出来 谢谢。。。。。。。