throws 和throw 的范围区别
2015-09-08 17:52
369 查看
public class TestExceptionSer { public void testExceptionOne() throws RuntimeException{ throw new ExceptionTest("500","throw 子类,thorws 父类异常"); } public void testExceptionTwo() throws ExceptionTest{ throw new RuntimeException(); } public void testExceptionThree() throws RuntimeException{ throw new RuntimeException(); } public void testExceptionFour() throws ExceptionTest{ throw new ExceptionTest("500","throw 子类,thorws 父类异常"); } }
/** * * 〈功能详细描述〉测试throws 与throw 范围 * * @author * @since v1.0.1 */ public class ExceptionTest extends RuntimeException { /** */ private static final long serialVersionUID = 1L; /** * 错误码 */ private String code; /** * 错误信息 */ private String message; public ExceptionTest(String code, String message) { this.code = code; this.message = message; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public static long getSerialversionuid() { return serialVersionUID; } }
TestExceptionSer test = new TestExceptionSer(); //声明为父类异常,方法体抛出子类异常,catch 可以用父类捕获 try { test.testExceptionOne(); } catch (RuntimeException e) { System.out.println("方法体抛出子类异常"); } //声明为父类异常,方法体抛出子类异常,catch 可以用子类捕获(catch 捕获的异常为方法体抛出的明确异常类,可以用异常类及其父类进行捕获) try { test.testExceptionOne(); } catch (ExceptionTest e) { System.out.println("ExceptionTest+++++++++++++"); } //声明为父类异常,方法体抛出子类异常,catch 可以用子类捕获(catch 捕获的异常为方法体抛出的明确异常类,可以用异常类及其父类进行捕获, //如果同时添加异常类及其父类catch,则会走明确异常类处理)(多个catch时捕获异常有顺序,子类异常在前,父类异常在后) try { test.testExceptionOne(); } catch(ExceptionTest e1){ System.out.println("会走这个catch,子类异常处理在前"); }catch (RuntimeException e) { System.out.println("这个不会走,父类异常catch在子类异常catch后,不然编译报错"); }
运行结果:
方法体抛出子类异常
ExceptionTest+++++++++++++
会走这个catch,子类异常处理在前
//声明的是子类异常,抛出的是父类异常,catch的异常范围大于等于方法体抛出的异常类时可以被捕获 try { test.testExceptionTwo(); } catch (RuntimeException e) { System.out.println("可以被捕获"); } //声明的是子类异常,抛出的是父类异常,catch的异常范围小于方法体抛出的异常类时不可以被捕获 try { test.testExceptionTwo(); } catch (ExceptionTest e) { System.out.println("异常不能被捕获"); }
运行结果:
可以被捕获
Exception in thread "main" java.lang.RuntimeException
at com.suning.slop.web.action.TestExceptionSer.testExceptionTwo(TestExceptionSer.java:9)
at com.suning.slop.web.action.Test.main(Test.java:40)
//声明异常与抛出异常一致,catch 可以用父类异常捕获 try { test.testExceptionFour(); } catch (RuntimeException e) { System.out.println("捕获子类异常"); } //声明异常与抛出异常一致,catch 可以用父类异常捕获 try { test.testExceptionFour(); } catch (ExceptionTest e) { System.out.println("捕获子类异常"); } //声明异常与抛出异常一致,catch用子类异常不能捕获 try { test.testExceptionThree(); } catch (ExceptionTest e) { System.out.println("用子类异常捕获父类异常"); }
运行结果:
捕获子类异常
捕获子类异常
Exception in thread "main" java.lang.RuntimeException
at com.suning.slop.web.action.TestExceptionSer.testExceptionThree(TestExceptionSer.java:14)
at com.suning.slop.web.action.Test.main(Test.java:59)
总结:catch 在捕获异常时和方法体抛出的异常类有关,可以用方法体抛出的异常本身及其父类用来捕获,方法头声明的异常只是用来进行声明,抛出的异常可以声明异常的父类或子类,所以在try catch时要根据方法体抛出的异常来进行定义,不能盲目的以方法头部声明的异常为准(例如方法体抛的异常是父类,而方法头部声明的是子类异常,try catch用声明的子类异常进行捕获时是捕获不到的)
相关文章推荐
- 漫谈C指针第十七讲---定义函数的指针类型
- Objective-C基础知识之(四):实例变量的可变度、初始化方法的声明、self和super的具体应用
- 显示 GIF 图片
- js前台加密传输到后台C#解密
- 文件操作 输入
- SQL中关键字的执行顺序
- sql语句
- HDU2037
- Unity3D中用于工具制作常用属性(Attribute)
- Android 性能优化的一些建议
- android高手进阶教程(一)之--android中的消息机制
- 解析java实体类
- 为 Java 程序员准备的 Go 入门 PPT
- java素数
- 说说EMC解决方案中的那些产品和案例(一)
- Android OkHttp完全解析
- IOS第一天多线程-01pthread
- ThinkPHP函数详解:M方法
- [LeetCode] Valid Sudoku
- 客户端发送xml数据,服务器端接收之