JavaSE系列第二篇——java异常机制
来源:互联网 发布:java服务端开发是什么 编辑:程序博客网 时间:2024/05/20 06:04
请自行运行代码分析,深夜,累,分析可能有误;后续会做详细分析;
package com.mjq.exceptiontest;import javax.management.RuntimeErrorException;/** * 对异常处理机制进行测试 * @author Administrator * java异常机制: * 1.代码执行顺序:无异常:try块=====》finally块======》finally块后 * 抛出异常:try块=====》catch块=====》finally块======》finally块后 * 2.return 检查:无异常:finally块====》try块=====》finally块后 * 抛出异常:finally块=====》catch块====》 * * * * 后续还会修改,可能分析有误;可自行分析。 * * */public class ExceptionTest {/*====================================================================================================================== * 下面通过代码测试 * 1.JAVA异常捕获机制 * * 2.JAVA try catch finally 及finally块后的代码执行请情况 * * *//** * 下面的代码不会抛出任何异常 * 运行结果:0 */public static void test0(){int i = 0;System.out.println(i/1);}/** * 下面的代码有运行时异常抛出 * 但是运行时异常是不受检查的异常,编译器无法检查; * 运行结果: * Exception in thread "main" java.lang.ArithmeticException: / by zero *at com.mjq.exceptiontest.ExceptionTest.test1(ExceptionTest.java:39) *at com.mjq.exceptiontest.ExceptionTest.main(ExceptionTest.java:21) */public static void test1(){int i = 0;System.out.println(i/i);} /** * try块对可能抛出异常的代码块进行监视,catch块对try块抛出的异常进行捕获 * 机制:虚拟机会对try块中的代码进行监视,如果其中抛出异常,则该异常会被组装成异常对象,首先对try后的catch块由上到下依次进行类型匹配,如果有类型与当前异常对象相匹配的catch块,则运行该catch块中的代码; * 如果当前方法中没有与当前异常类型相匹配的catch块,则该异常对象沿着方法的调用栈中方法调用的地方依次向上抛出,并对每个方法调用处的catch块能够捕获的异常类型与当前异常类型进行匹配,如果成功匹配,则执行该catch块中的代码; * 如果直到main方法依旧没有找到能够与当前异常相匹配的catch块,则虚拟机退出; * 运行结果:ArithmeticException * * 注:本来以为结果是:RuntimeErrorException 结果是:ArithmeticException 查看了jre,我使用的是1.8 可能1.8异常捕获机制有所变化,不再支持父类型异常匹配子类型异常? * * */public static void test2(){try{test1();}catch(NullPointerException n){System.out.println("NullPointerException");}catch(RuntimeErrorException r){System.out.println("RuntimeErrorException");}catch(ArithmeticException a){System.out.println("ArithmeticException");}}/** * test3() 的运行结果与 test2()运行结果比较 可以看到java异常捕获的机制: * 本类 3 与 4 对比,想证明:父类型catch块可以成功捕获子类型异常,结果出乎意料。 * 运行结果:ArithmeticException * * * */public static void test3(){try{test1();}catch(NullPointerException n){System.out.println("NullPointerException");}catch(ArithmeticException a){System.out.println("ArithmeticException");}catch(RuntimeErrorException r){System.out.println("RuntimeErrorException");}}/** * try catch finally 连用,无异常抛出时,finally块和finally块后的代码会运行; * 运行结果:0 * finally 块中! * finally 块后! */public static void test4(){try{test0();//不会抛出异常}catch(NullPointerException n){System.out.println("NullPointerException catch块中!");}finally{System.out.println("finally 块中!");}System.out.println("finally 块后!");}/** * 如果try块中抛出了异常,catch块中捕获到了异常,finally块中的代码会运行,finally块后的代码会运行; * 运行结果:、 * ArithmeticException catch块中! *finally 块中! *finally 块后! */public static void test5(){try{test1();//不会抛出异常}catch(NullPointerException n){System.out.println("NullPointerException catch块中!");}catch(ArithmeticException a){System.out.println("ArithmeticException catch块中!");}finally{System.out.println("finally 块中!");}System.out.println("finally 块后!");}/** * 如果try块中抛出了异常,catch块中没有捕获到异常,finally块中的代码会运行,但是finally块后的代码不会运行; * finally 块中!Exception in thread "main" java.lang.ArithmeticException: / by zeroat com.mjq.exceptiontest.ExceptionTest.test1(ExceptionTest.java:40)at com.mjq.exceptiontest.ExceptionTest.test6(ExceptionTest.java:160)at com.mjq.exceptiontest.ExceptionTest.main(ExceptionTest.java:151) */public static void test6(){try{test1();//不会抛出异常}catch(NullPointerException n){System.out.println("NullPointerException catch块中!");}finally{System.out.println("finally 块中!");}System.out.println("finally 块后!");}/*================================================================================================================== * 下面通过代码测试try catch finally 与return 一起使用后 * try 块,catch 块 finally块及finally块后的代码执行情况; * 7 不会抛出异常 * 8 会抛出异常 * * * * *//** * 下面的方法不会抛出异常 * 打印运行返回结果: * Exception! * @return */public static String test7(){String str = "Test Exception!";return str.substring(4);}/** * 下面的代码会抛出异常 * 运行结果: * Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -5 * at java.lang.String.substring(Unknown Source) * at com.mjq.exceptiontest.ExceptionTest.test8(ExceptionTest.java:170) * at com.mjq.exceptiontest.ExceptionTest.main(ExceptionTest.java:175) * @return */public static String test8(){String str = "Test Exception!";return str.substring(20);}/*============================================================================ * 9 ----- 13 测试当try块中不抛出异常时,return的位置 * 结论:1.不论何种情况,finally块中的代码始终都会执行 * 2.try块未抛出异常的情况下,如果finally块中有return,则从finally块中返回;如果finally块中没有return,则检测try块中是否有renturn * 如果try块中有return,则从try块中返回;如果try块中没有return,则finallly块后的代码中肯定有return(不可能没有!),则从此处返回; * 3.catch 块中return ,在程序未抛出异常的情况下,并不会返回; * * * *//** * return 存在位置 * 运行结果:finally块中!finally块后返回! * @return */public static String test9(){try{ test7();//不会抛出异常}catch(StringIndexOutOfBoundsException s){System.out.println("StringIndexOutOfBoundsException catch块中!");}finally{System.out.println("finally块中!");}return "finally块后返回!";}/** * return 位置 * 运行结果:finally块中! Exception! * @return */public static String test10(){try{ return test7();//不会抛出异常}catch(StringIndexOutOfBoundsException s){System.out.println("StringIndexOutOfBoundsException catch块中!");}finally{System.out.println("finally块中!");}return "finally块后返回!";}/** * return 位置 * 运行结果: * finally块中!finally块中返回! * @return */public static String test11(){try{ return test7();//不会抛出异常}catch(StringIndexOutOfBoundsException s){System.out.println("StringIndexOutOfBoundsException catch块中!");}finally{System.out.println("finally块中!"); return "finally块中返回!";}/*return "finally块后返回!";*/}/** * return 位置 * 运行结果:finally块中! Exception! * @return */public static String test12(){try{ return test7();//不会抛出异常}catch(StringIndexOutOfBoundsException s){System.out.println("StringIndexOutOfBoundsException catch块中!");return "StringIndexOutOfBoundsException catch块后返回!";}finally{System.out.println("finally块中!");}/*return "finally块后返回!";*/}/** * return 位置 * finally块中!finally块中返回! * @return */public static String test13(){try{ return test7();//不会抛出异常}catch(StringIndexOutOfBoundsException s){System.out.println("StringIndexOutOfBoundsException catch块中!");return "StringIndexOutOfBoundsException catch块后返回!";}finally{System.out.println("finally块中!");return "finally块中返回!";}/*return "finally块后返回!";*/}/**============================================================================== *14 --- 18 测试try块中抛出异常,catch块成功捕获异常时,return的不同位置 * 结论: * 1.try块中抛出异常,catch块中成功捕获异常,finally块中代码都会运行! * 2.代码执行顺序:首先执行try块中代码,如果抛出异常,则执行相应的catch块中的代码,然后执行finally块中的代码; * 检查catch块中是否有return,如果catch块中有return,则从该catch块中返回; * 如果catch块中木有return,则检查finally块中是否有return,如果有就从finally块中返回,如果没有则检查finally块后的代码中的return(此处一定会有!) * * **//** * return 存在位置 * 运行结果: * StringIndexOutOfBoundsException catch块中!finally块中!finally块后返回! * @return */public static String test14(){try{ test8();//抛出异常}catch(StringIndexOutOfBoundsException s){System.out.println("StringIndexOutOfBoundsException catch块中!");}finally{System.out.println("finally块中!");}return "finally块后返回!";}/** * return 位置 * 运行结果: * StringIndexOutOfBoundsException catch块中!finally块中!finally块后返回! * @return */public static String test15(){try{ return test8();//抛出异常}catch(StringIndexOutOfBoundsException s){System.out.println("StringIndexOutOfBoundsException catch块中!");}finally{System.out.println("finally块中!");}return "finally块后返回!";}/** * return 位置 * 运行结果: * StringIndexOutOfBoundsException catch块中!finally块中!finally块中返回! * @return */public static String test16(){try{ return test8();//抛出异常}catch(StringIndexOutOfBoundsException s){System.out.println("StringIndexOutOfBoundsException catch块中!");}finally{System.out.println("finally块中!"); return "finally块中返回!";}/*return "finally块后返回!";*/}/** * return 位置 * 运行结果: * StringIndexOutOfBoundsException catch块中!finally块中!StringIndexOutOfBoundsException catch块后返回! * @return */public static String test17(){try{ return test8();//抛出异常}catch(StringIndexOutOfBoundsException s){System.out.println("StringIndexOutOfBoundsException catch块中!");return "StringIndexOutOfBoundsException catch块中返回!";}finally{System.out.println("finally块中!");}/*return "finally块后返回!";*/}/** * return 位置 * StringIndexOutOfBoundsException catch块中!finally块中!finally块中返回! * @return */public static String test18(){try{ return test8();//抛出异常}catch(StringIndexOutOfBoundsException s){System.out.println("StringIndexOutOfBoundsException catch块中!");return "StringIndexOutOfBoundsException catch块后返回!";}finally{System.out.println("finally块中!");return "finally块中返回!";}/*return "finally块后返回!";*/}/*================================================================================ * 19 ----23 测试当try块中抛出异常,但是catch块中未能成功捕获时,return的不同位置返回 * 1.finally中的代码始终会运行; * 2.先执行代码,代码执行顺序: try块=====》catch块=====》finally块 * 3.然后检查return:检查顺序: finally块======》catch块 * * * * *//** * return 存在位置 * 运行结果: * finally块中!Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -5at java.lang.String.substring(Unknown Source)at com.mjq.exceptiontest.ExceptionTest.test8(ExceptionTest.java:205)at com.mjq.exceptiontest.ExceptionTest.test19(ExceptionTest.java:461)at com.mjq.exceptiontest.ExceptionTest.main(ExceptionTest.java:451) * @return */public static String test19(){try{ test8();//抛出异常}catch(NullPointerException s){System.out.println("NullPointerException catch块中!");}finally{System.out.println("finally块中!");}return "finally块后返回!";}/** * return 位置 * 运行结果: * finally块中!Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -5at java.lang.String.substring(Unknown Source)at com.mjq.exceptiontest.ExceptionTest.test8(ExceptionTest.java:205)at com.mjq.exceptiontest.ExceptionTest.test20(ExceptionTest.java:488)at com.mjq.exceptiontest.ExceptionTest.main(ExceptionTest.java:451) * @return */public static String test20(){try{ return test8();//抛出异常}catch(NullPointerException s){System.out.println("NullPointerException catch块中!");}finally{System.out.println("finally块中!");}return "finally块后返回!";}public static void main(String [] args){System.out.println(test23());}/** * return 位置 * 运行结果: * finally块中!finally块中返回! * @return */public static String test21(){try{ return test8();//抛出异常}catch(NullPointerException s){System.out.println("NullPointerException catch块中!");}finally{System.out.println("finally块中!"); return "finally块中返回!";}/*return "finally块后返回!";*/}/** * return 位置 * 运行结果: * StringIndexOutOfBoundsException catch块中!finally块中!StringIndexOutOfBoundsException catch块中返回! * @return */public static String test22(){try{ return test8();//抛出异常}catch(StringIndexOutOfBoundsException s){System.out.println("StringIndexOutOfBoundsException catch块中!");return "StringIndexOutOfBoundsException catch块中返回!";}finally{System.out.println("finally块中!");}/*return "finally块后返回!";*/}/** * return 位置 * 运行结果: * StringIndexOutOfBoundsException catch块中!finally块中!finally块中返回! * @return */public static String test23(){try{ return test8();//抛出异常}catch(StringIndexOutOfBoundsException s){System.out.println("StringIndexOutOfBoundsException catch块中!");return "StringIndexOutOfBoundsException catch块后返回!";}finally{System.out.println("finally块中!");return "finally块中返回!";}/*return "finally块后返回!";*/}}
1 0
- JavaSE系列第二篇——java异常机制
- JavaSE系列第二篇——java环境配置之为什么?
- 【javaSE】java异常处理机制
- JavaSE——Java异常
- 【JavaSE系列-入门篇1】——Java技术简介
- Javase—异常处理
- JavaSE 拾遗(6)——JavaSE 异常
- 黑马程序员 JAVASE——异常及异常的处理机制
- JavaSE基础知识学习—异常
- java——异常机制
- ——java异常机制
- java—异常处理机制
- 【JavaSE系列-入门篇2】——Java技术能够做什么?
- 【JavaSE系列-入门篇3】——Java技术如何改变我的生活?
- JAVA中的异常处理机制系列一
- JAVA总结系列之异常机制
- javaSE_8系列博客——重要的基础Java类——Excavations(异常处理机制)--2--什么是异常?
- 0706——JAVASE第二天学习
- window下安装Vue.js
- LeetCode刷题【Array】 Contains Duplicate II
- 前端你不得不知的问题。
- Struts2之值栈
- NSURLSession 同步请求(使用信号量)
- JavaSE系列第二篇——java异常机制
- 紫书动规 例题9-13 UVA
- Android开发环境(eclipse下)条目介绍
- Codeforces Round #404 (Div. 2) C. Anton and Fairy Tale(二分)
- Clipboard.js 不依赖Flash,把浏览器内容复制到系统剪贴板
- C语言解惑(1)
- 读书笔记7 《深阅读》 斋藤孝
- MySql接口API函数综述
- Mysql 数据库小记