标签:
异常(Exception)
一、什么是异常?
异常就是程序中的错误,比如数组越界、访问空指针等。在Java中,一切皆对象,异常也不例外。所有的异常都是派生于Throwable类的一个实例对象。
二、异常的分类
在异常界,有两大流派。一派叫Error类,另一派叫Exception类,它们都继承自Throwable类。在Exception类下还有两大分支,IOException类和RuntimeException类。
RuntimeException是由程序本身的错误导致的异常。
IOException是程序本身没有问题,但是因为IO发生的错误引起的异常。
举例:
RuntimeException |
IOException |
数组访问越界 |
试图打开一个不存在的文件 |
访问空指针 |
试图在文件尾部读取数据 |
错误的类型转换 |
|
RuntimeException类和它的叔叔Error类比较亲,叔侄俩统称为未检查异常(unchecked Exception),大白话就是不用你检查,不用你管的异常。而IOException和它的兄弟和叔叔明显不是一路的,被称为已检查异常(checked Exception),就是你得管它。
三、异常处理(Exception handing)
前面说过未检查异常不用我们管,所以这里就只说我们怎么对付已检查异常。
(1)throws
首先,你得声明它。方法应该在其首部用throws+异常名声明所有可能抛出的异常。
抛出异常的4中情形:
1.调用一个抛出已检查异常的方法。
2.程序运行过程中发现错误,并且利用throws语句抛出已检查异常
3.程序出现错误,比如数组访问越界,会自动抛出ArrayIndexOutOfBoundsException
4.Java虚拟机和运行时库出现的内部错误
举个例子:
1 Class MyAnimation{ 2 public Image LoadImage(String s)throws IOException, EOFException 3 { 4 ...... 5 } 6 }
(2)用throw关键字抛出异常
1 String readData(Scanner in)throws EOFException{ 2 ... 3 while(...){ 4 if(!in.hasNext()) 5 { 6 if(n<len) 7 throw new EOFException(); 8 } 9 } 10 }
(3)自定义异常
当java提供的异常满足不了需要的时候,可以自己DIY一个
1 //定义一个FileFormatException类 2 class FileFormatException extends IOException{ 3 public FileFormatException(){} 4 public FileFormatException(String gripe){ 5 super(gripe); 6 } 7 } 8 //下面抛出自定义异常 9 String readData(Scanner in)throws EOFException 10 { 11 ... 12 while(...){ 13 if(ch == -1){ 14 if(n<len) 15 throw new FileFormatException(); 16 } 17 } 18 return s; 19 }
(4)捕获异常
光把异常抛出去,不能不管啊,所以就得捕获它并处理它。
1 //利用try-catch语句块捕获异常 2 try{ 3 code 4 } 5 catch(ExceptionType e){ 6 handler for this type 7 }
如果在try语句块中的代码抛出了一个在catch子句中说明的异常类,那么
1)程序将跳过try语句块的其他代码。
2)程序将执行catch子句中的处理器代码
(5)异常-方法内外
对于异常,可以在方法内部用try-catch语句块来捕获并处理,如果不想在方法内处理,可以在方法首部声明可能抛出的异常,将异常可能抛出的异常交给调用方法的代码去处理。总之,就是方法内用try-catch处理,方法外用throws抛出。
(6)捕获多个异常
1 try{ 2 code 3 } 4 catch(FileNotFoundException | UnknowHostException e){ 5 ... 6 } 7 catch(IOException e){ 8 ... 9 }
(7)finally
1 try{ 2 ... 3 } 4 catch(IOException e){ 5 ... 6 } 7 finally{ 8 ... 9 }
不管有没有异常发生,finally语句块中的代码都将执行。
try-catch、try-catch-finally、try-finally三种组合,1、3组合更常用
(8)带资源的try语句块
带资源的try块在退出时,会自动关闭资源,这样往往就可以省掉finally语句
1 try(Scanner in = new Scanner(new FileInputStream(“文件路径”))){ 2 while(in.hasNext()) 3 System.out.println(in.next()); 4 }
注:╮(╯▽╰)╭本文大量参考《Java核心技术 卷I》
标签:
原文地址:http://www.cnblogs.com/youilika/p/4995897.html