标签:
异常是程序在执行时发生的事件,它会打断指令的正常流程。
Java中提供了一种独特的处理异常的机制,通过异常来处理程序设计中出现的错误。
Java异常是一个描述在代码段中发生的异常情况(出错)的对象。
引发异常:
在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为引发异常。
分类:
JRE(系统)产生异常对象
人为产生异常对象(明确用throw关键字)
异常处理机制:
两种处理例外的机制: 捕获异常(try catch finally) 声明异常(throws) Finally与final,finalizer
捕获异常:
try catch finally
捕获异常(try catch finally) try{ //会产生异常的代码 }catch(SomeException e){ //异常处理 } catch(SomeException1 e){ //异常处理 }... }finally{ //有没有异常都会执行的代码 }
package com.study4; public class Trycatch { public static void main(String[] args){ System.out.println("开始"); int i = 10; int j = 0; //捕捉异常 try{ int k = i/j; }catch(ArithmeticException e){ System.out.println(e.getMessage());//获取异常信息 e.printStackTrace();//打印信息 } System.out.println("结束"); } }
运行结果:
开始 / by zero java.lang.ArithmeticException: / by zero at com.study4.Trycatch.main(Trycatch.java:10) 结束
人为处理异常:throw
public static void mathod2(){ System.out.println("程序开始"); int i = 10; int j = 0; if (j == 0){ throw new ArithmeticException("被除数不能为0");//抛出异常 } System.out.println("程序结束"); }
运行结果:
程序开始 Exception in thread "main" java.lang.ArithmeticException: 被除数不能为0 at com.study4.Trycatch.mathod2(Trycatch.java:25) at com.study4.Trycatch.main(Trycatch.java:5)
说明:
Throws声明异常
Throw抛出异常
如果Throw抛出的是一个编译异常。那么方法就必须要做throws的异常的声明。明确的告诉其它的调用者要处理这个编译异常。
finally的用法:
不管程序是否会出现异常,Finally块中的代码都会执行到
Finally一般是用来做资源关闭的操作。
Finally先与return执行。
代码举例:
public static void mathod3(){ try{ Class.forName("com.aa"); }catch(ClassNotFoundException e){ System.out.println("找不到com.aa类"); e.printStackTrace(); }finally{ //无论如何都要执行的代码 System.out.println("程序继续运行"); } System.out.println("结束"); }
运行结果:
找不到com.aa类 java.lang.ClassNotFoundException: com.aa at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at com.study4.Trycatch.mathod3(Trycatch.java:35) at com.study4.Trycatch.main(Trycatch.java:7) 程序继续运行 结束
自定义异常:
为什么要自定义异常
Java程序员可以定义更多的方法来处理异常自定义异常类能提供更复杂更详细的方法,这样能极大地加强软件的健壮性比如BLException:用一个异常的功能号来找到异常信息
代码更加清晰
如何自定义异常:
第一种定义方式,继承Exception类
第二种定义方式:继承Throwable 类
代码:
AgeTooBig.java
package com.study4.self; public class AgeTooBig extends Exception { public AgeTooBig(String message){ super(message); } public AgeTooBig(String message, Throwable cause){ super(message, cause); } public AgeTooBig(Throwable throwable){ super(throwable); } }
AgeTooSmall.java
package com.study4.self; public class AgeTooSmall extends Throwable{ public AgeTooSmall(String message){ super(message); } public AgeTooSmall(String message, Throwable cause){ super(message, cause); } public AgeTooSmall(Throwable throwable){ super(throwable); } }
CheckPerson.java
package com.study4.self; public class CheckPerson { public static void checkage(int age) throws AgeTooSmall{ if (age < 20){ throw new AgeTooSmall("年龄太小"); }else if(age > 40){ throw new AgeTooSmall("年龄太大"); }else{ System.out.println("年龄可以"); } } }
TestMain.java
package com.study4.self; public class TestMain { public static void main(String[] args) { int a = 50; try { CheckPerson.checkage(a); } catch (AgeTooSmall e) { e.printStackTrace(); } } }
运行结果:
com.study4.self.AgeTooSmall: 年龄太大 at com.study4.self.CheckPerson.checkage(CheckPerson.java:8) at com.study4.self.TestMain.main(TestMain.java:7)
使用异常的注意点:
将异常信息提前检测出来 不要为每个可能会出现异常语句都设置try和catch 一个try块完全可以跟多个catch 避免总是catch Exception,而要catch具体的异常 不要压制、隐瞒异常。将不能处理的异常往外抛 不要在循环中使用try catch,尽量将try catch放在循环外 catch异常时,必须先捕获小的异常,再捕获大的异常
标签:
原文地址:http://www.cnblogs.com/hlwyfeng/p/4422296.html