当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,环境,网络不可用...)时,Java就会用异常对象来描述。Java中用2种方法处理异常:
Ⅰ.在发生异常的地方直接处理;
Ⅱ.将异常抛给调用者,让调用者处理
异常分类
Ⅰ.检查性异常:java.lang.Exception
Ⅱ.运行期异常:java.lang.RuntimeException
Ⅲ.错误:java.lang.Error
异常处理
1 //try...catch语句 2 try{ 3 //语句块 4 }catch{ 5 //语句块 6 }
程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。如果catch有多个的话,会捕捉到相对应的问题选择相对应的catch。
1 /* 2 * 作者:白客C 3 * 时间:2020年03月05日 4 * 内容:异常检查 5 */ 6 7 package com.beekc.www; 8 import java.io.*; 9 10 public class Beekc { 11 public static void main(String[] args) { 12 13 //异常检查:打开文件 14 try{ 15 //不知道在D盘有没有aa文件,防止程序异常,把它抛出异常 16 FileReader fr = new FileReader("d:\\aa.text"); 17 }catch(Exception e){ 18 //提示出什么问题 19 e.printStackTrace(); 20 } 21 System.out.println("OK") //上面异常被捕捉,下面这语句不会被执行 22 } 23 }
如果把finally块置try...catch...语句后,finally块一般都会得到执行,它相当于一个万能得保险,即使前面得try块发生异常,而又没有对应异常catch块,finally块将马上执行。
以下情形,finally块不会被执行:
Ⅰ.finally块中发生了异常;
Ⅱ.程序所在线程死亡;
Ⅲ.在前面的代码中用了System.exit();
Ⅳ.关闭CPU;
1 /* 2 * 作者:白客C 3 * 时间:2020年03月05日 4 * 内容:finally的必要性 5 */ 6 7 package com.beekc.www; 8 import java.io.*; 9 10 public class Beekc { 11 public static void main(String[] args) { 12 13 FileReader fr =null; 14 //异常检查:打开文件 15 try{ 16 //比如我们这里的aa文件存在 17 fr = new FileReader("d:\\aa.text"); 18 }catch(Exception e){ 19 //提示出什么问题 20 e.printStackTrace(); 21 }finally{ 22 //这个语句块,不管有没有异常,都会被执行 23 //一般说,把需要关闭的资源[文件,连接,内存...] 24 if(fr!= null) 25 { 26 try{ 27 //关闭文件,打开文件之后一定要把文件关闭了,避免出现的资源问题 28 fr.close(); 29 }catch(IOException e){ 30 e.printStackTrace(); 31 } 32 33 } 34 } 35 36 } 37 }
用throws,将异常抛给调用者,让调用者处理异常。下面是给小实例
1 /* 2 * 作者:白客C 3 * 时间:2020年03月05日 4 * 内容:用throws把异常抛给调用者 5 */ 6 7 package com.beekc.www; 8 import java.io.FileReader; 9 10 public class Beekc { 11 public static void main(String[] args) { 12 //使用try解决异常,也可以抛出去交给虚拟机去处理,但不建议这么做 13 try{ 14 Father father = new Father(); 15 father.fatherMove(); 16 }catch(Exception e){ 17 e.printStackTrace(); 18 } 19 20 } 21 } 22 23 //父亲类 24 class Father{ 25 26 public Son son = null; 27 28 public Father() 29 { 30 son =new Son(); 31 } 32 33 //这里使用了throws 34 public void fatherMove() throws Exception{ 35 //Fahther类调用了Son类抛出异常的方法,如果不想解决这个方法也可以抛出去 36 son.sonMove(); 37 } 38 39 } 40 41 //儿子类 42 class Son{ 43 //使用throws抛出给调用者去解决 44 public void sonMove() throws Exception{ 45 FileReader fr = null; 46 fr = new FileReader("d:\\aa.text"); 47 } 48 }