首页 / JAVA / 深入理解java异常机制
深入理解java异常机制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了深入理解java异常机制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含17297字,纯文字阅读大概需要25分钟。
内容图文
![深入理解java异常机制](/upload/InfoBanner/zyjiaocheng/626/d5eb7e91831f4dc599363ef1265b5708.jpg)
5.1. try-catch-finally语句
[java]?view plain?copy?print?- try {
- // 可能会发生异常的程序代码
- } catch (Type1 id1) {
- // 捕获并处理try抛出的异常类型Type1
- } catch (Type2 id2) {
- // 捕获并处理try抛出的异常类型Type2
- } finally {
- // 无论是否发生异常,都将执行的语句块
- }
5.2. try、catch、finally语句块的执行顺序:
5.3. try-catch-finally 规则(异常处理语句的语法规则):
1) ?必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。 2) 必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。 3) catch 块与相应的异常类的类型相关。 4) 一个 try 块可能有多个 catch 块。即Java虚拟机会把实际抛出的异常对象从上到下依次和各个catch代码块声明的异常类型匹配,匹配到了就执行这个catch代码块,不会再执行其他的 catch代码块,应该尽量将捕获底层异常类的catch子 句放在前面,同时尽量将捕获相对高层的异常类的catch子句放在后面 5) 可嵌套 try-catch-finally 结构。 6) 在 try-catch-finally 结构中,可重新抛出异常。 7) 除了下列情况,总将执行 finally 做为结束:JVM 过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。 ? 5.4例子 [java]?view plain?copy?print?- public class TestException {
- public static void main(String args[]) {
- int i = 0;
- String greetings[] = { " Hello world !", " Hello World !! ",
- " HELLO WORLD !!!" };
- while (i < 4) {
- try {
- // 特别注意循环控制变量i的设计,避免造成无限循环
- System.out.println(greetings[i++]);
- } catch (ArrayIndexOutOfBoundsException e) {
- System.out.println("数组下标越界异常");
- } finally {
- System.out.println("--------------------------");
- }
- }
- }
- }
- public class TestException {
- public static void main(String[] args) {
- int a = 6;
- int b = 0;
- try { // try监控区域
- if (b == 0) throw new ArithmeticException(); // 通过throw语句抛出异常
- System.out.println("a/b的值是:" + a / b);
- }
- catch (ArithmeticException e) { // catch捕捉异常
- System.out.println("程序出现异常,变量b不能为0。");
- }
- finally{
- System.out.println("执行finally语句"); }
- System.out.println("程序正常结束。");
- }
- }
6 抛出异常
? ? ? ? 任何Java代码都可以抛出异常,如:自己编写的代码、来自Java开发环境包中代码,或者Java运行时系统。无论是谁,都可以通过Java的throw语句抛出异常。从方法中抛出的任何异常都必须使用throws子句,该方法不处理异常,交给调用该方法的方法去处理。使用throws关键字将异常抛给调用者后,如果调用者不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的调用者。1. throws抛出异常
? ?如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常。例如汽车在运行时可能会出现故障,汽车本身没办法处理这个故障,那就让开车的人来处理。 ? ? ?throws语句用在方法定义时声明该方法要抛出的异常类型,如果抛出的是Exception异常类型,则该方法被声明为抛出所有的异常。多个异常可使用逗号分割。throws语句的语法格式为: [java]?view plain?copy?print?- methodname throws Exception1,Exception2,..,ExceptionN
- {
- throw new Exception1("异常信息"); //抛出异常
- }
- void method1() throws IOException{} //合法
- //编译错误,必须捕获或声明抛出IOException
- void method2(){
- method1();
- }
- //合法,声明抛出IOException
- void method3()throws IOException {
- method1();
- }
- //合法,声明抛出Exception,IOException是Exception的子类
- void method4()throws Exception {
- method1();
- }
- //合法,捕获IOException
- void method5(){
- try{
- method1();
- }catch(IOException e){…}
- }
- //编译错误,必须捕获或声明抛出Exception
- void method6(){
- try{
- method1();
- }catch(IOException e){throw new Exception();}
- }
- //合法,声明抛出Exception
- void method7()throws Exception{
- try{
- method1();
- }catch(IOException e){throw new Exception();}
- }
2. 使用throw抛出异常
?throw总是出现在函数体中,用来抛出一个Throwable类型的异常。程序会在throw语句后立即终止,当然会执行finally的语句,finally括号后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try,?如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果抛出的是Error或RuntimeException,则该方法的调用者可选择处理该异常。 public static int med1() throws ArithmeticException{ try { int a = 3/0; } catch (ArithmeticException e) { System.out.println("异常"); throw new ArithmeticException("跑出去"); } finally { System.out.println("finally信息"); } System.out.println("会不会执行");? //throw异常之后就不会不会执行了 return 33; } public static void main(String[] args) { try { med1(); }catch (ArithmeticException e){ System.out.println("扑捉到异常"); } }} 结果: 异常 finally信息 扑捉到异常 ? 4.3 异常链 Java这种向上传递异常信息的处理机制,形成异常链。Java方法抛出的可查异常将依据调用栈、沿着方法调用的层次结构一直传递到具备处理能力的调用方法,最高层次到main方法为止。如果异常传递到main方法,而main不具备处理能力,也没有通过throws声明抛出该异常,将可能出现编译错误。4.4 Throwable类中的常用方法
注意:catch关键字后面括号中的Exception类型的参数e。Exception就是try代码块传递给catch代码块的变量类型,e就是变量名。catch代码块中语句"e.getMessage();"用于输出错误性质。通常异常处理常用3个函数来获取异常的有关信息: ? ? ?getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。 getMeage():返回异常的消息信息。 printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。 ? ? ?有时为了简单会忽略掉catch语句后的代码,这样try-catch语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会忽略处理异常,而错误发生的原因很难查找。 ? ?? ?5.自定义异常 class MyException extends Exception { // 创建自定义异常类?? ????String message; // 定义String类型变量?? ????public MyException(String ErrorMessagr) { // 父类方法?? ????????message = ErrorMessagr;?? ????}?? ?? ????public String getMessage() { // 覆盖getMessage()方法?? ????????return message;?? ????}?? }?? 使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。 ? ? 在程序中使用自定义异常类,大体可分为以下几个步骤。 (1)创建自定义异常类。 (2)在方法中通过throw关键字抛出异常对象。 (3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。 (4)在出现异常方法的调用者中捕获并处理异常。 常见RuntimeException:NullPointException、ArrayIndexOutOfException、ArithmeticException、ArrayStorException、IllgalArgumentException、NegativeArraySizeException、ClassCastException,自动抛出- 异常构造
38、try {}或者catch{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?return 和throw功能差不多。都代表结束。
也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果: ? public??class Test { ????/** ?????* @param args add by zxx ,Dec 9, 2008 ?????*/ ????public static void main(String[] args) { ???????// TODO Auto-generated method stub ???????System.out.println(new Test().test());; ????} ????static int test() ????{ ???????int x = 1; ???????try ???????{ ???????????return x; ????} ???????finally ???????{ ???????????++x; ???????}??}} ? ? ---------执行结果 --------- 1 运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。 catch{}中有return,这时候虽然有异常,但是正常返回3了,那么主函数中就扑捉不到异常,return表示正常返回。 public static int med1(){ ????try { ??????int a = 3/0; ????} catch (ArithmeticException e) { ???????return 3; ????} finally { ????????System.out.println("finally信息"); } ????System.out.println("会不会执行"); ????return 33; } public static void main(String[] args) { try { med1(); }catch (ArithmeticException e){ System.out.println("扑捉到异常"); } }} 结果: finally信息 ? ? 断言:用在测试开发阶段,发布后不会加载断言。 assert?条件 : 表达式;?assert?条件;两种形式,当条件失败后,会抛出一个assertionError异常,使用表达式的作为其构造器的字符串信息。内容总结
以上是互联网集市为您收集整理的深入理解java异常机制全部内容,希望文章能够帮你解决深入理解java异常机制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。