本文共 4228 字,大约阅读时间需要 14 分钟。
一,异常的概念
1,异常(exception)是在运行过程中代码序列中产生的一种例外情况。 2,Exception类的层次 所有的异常类是从 java.lang.Exception 类继承的子类。 Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。 Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。 Error 用来指示运行时环境发生的错误。 异常类有两个主要的子类:IOException 类和 RuntimeException 类。 二,常见的异常类型 三,异常处理 Java异常处理通过5个关键字控制:try、catch、 throw、throws和 finally。 1,try-catch结构 try{ 代码A 代码B }catch(ExceptionType e){ 异常处理代码C } 代码D 期望:A—>B—>C—>D 程序无异常时 实际:A—>异常处理—>C—>D 代码B出现异常时 实际:A—>B—>异常处理—>C—>D 代码B出现异常时 2,finally关键字 有些时候,try块内引用了一些物理资源,例如数据库连接、网络连接或磁盘文件等,那么一旦try块内出现异常,这些资源将无法保证被释放 必须要有一种很确切的办法办法确保资源一定得到释放,而不管是否存在异常,这就是finally存在的原因。 ry{ 代码A 代码B }catch(ExceptionType e){ 异常处理代码C }finally{ 回收代码资源代码D } 代码E注意下面事项:
catch 不能独立于 try 存在。 在 try/catch 后面添加 finally 块并非强制性要求的。 try 代码后不能既没 catch 块也没 finally 块。 try, catch, finally 块之间不能添加任何代码。代码展示:
package exception;public class ArithmeticException { public static void main(String[] args) { //算数错误 try { int num=5/0; //出现异常 System.out.println(num); // 异常后的程序不再执行 }catch (java.lang.ArithmeticException e){ //捕捉异常 System.out.println("除数不能为零"); //处理异常 }finally { System.out.println("资源回收"); //资源回收 } System.out.println("helloworld"); //后面的程序继续执行 //试图访问null对象引用 try { String str = null; //定义一个空的字符串 System.out.println(str.length()); //输出空字符串长度,出现异常 }catch (NullPointerException c){ //捕捉异常 c.printStackTrace(); //打印异常 System.out.println("不能为空"); //处理异常 }finally { System.out.println("回收资源"); //回收资源 } System.out.println("程序继续执行"); //后面的程序继续执行 }}
运行结果:
3,多重catch块try{
代码A try { 代码A1 代码B1 代码C1 }catch(ExceptionType2 e2){ 异常处理代码D2 } 代码C }catch(ExceptionType2 e2){ 异常处理代码D1 }finally{ 回收资源代码E } 代码F上面的代码段包含了 3 个 catch块。
可以在 try 语句后面添加任意数量的 catch 块。 如果保护代码中发生异常,异常被抛给第一个 catch 块。 如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。 如果不匹配,它会被传递给第二个 catch 块。 如此,直到异常被捕获或者通过所有的 catch 块。代码展示:
package exception;import java.lang.ArithmeticException;public class MultiplAanomalies { public static void main(String[] args) { try { int i=5/1; //语句正确,正常执行 System.out.println(i); try { int num = 5/0; //出现异常 System.out.println(num); //异常语句后面的代码不再执行 String str = null; System.out.println(str.length()); }catch (ArithmeticException c){ //捕捉异常 System.out.println("出现异常啦"); }catch (NullPointerException c){ System.out.println("出现异常"); } }catch (Exception c){ System.out.println("出现异常了"); }finally { System.out.println("资源回收"); } System.out.println("程序继续执行"); }}
运行结果:
3,throw和throws关键字 (1),throw关键字 有时需要明确的引发一个异常,Java语言可以用 throw语句显式地引发异常。 执行流程一旦遭遇throw语句,就会立即停止,不会再执行下一个语句。 简单来说就是自定义一个异常 (2),throws关键字 throws跟在方法之后,说明该方法可能会抛出某个或某些异常,而这个方法并不关心或不方便处理,由方法的调用者来处理这些异常。代码展示:
package Throw;//自定义异常类,继承Exception类public class MyExcertion extends Exception{ public MyExcertion(){ //无参构造方法 super(); } public MyExcertion(String a){ //有参构造方法 super(a); }}package Throw;public class Test1 { public static void main(String[] args) { try { show(); } catch (MyExcertion myExcertion) { myExcertion.printStackTrace(); //打印异常 System.out.println("出现异常"); } } public static void show() throws MyExcertion{ if (2>1){ //自定义异常,比如去银行取钱,取款金额大于卡内余额则会显示余额不足(相当于出现异常)。 throw new MyExcertion(); } }}
运行结果:
四,异常使用规则 不要为每个可能会出现异常的语句都设置try和catch。虽 然使用异常可以分离常规代码和错误处理代码,从而提高 代码的可读性,但是,异常的不恰当使用会降低代码的可 读性。 避免总是catch Exception或Throwable,而要catch具 体的异常类。这样可以使程序更加清晰。 什么情况下使用异常?如果方法遇到一个不知道如何处理 的意外情况(abnormal condition),那么它应该抛出 异常。 不要在循环中使用try…catch,尽量将try…catch放在循 环外或者避免使用。 异常处理不应用来控制程序的正常流程,不要将异常看作 是“super if转载地址:http://tdqai.baihongyu.com/