深入理解java异常【绝对经典,推荐最少看五遍】
2016-01-27 19:25
176 查看
http://blog.csdn.net/hguisu/article/details/6155636
补充:检查异常(checkedException)与运行异常,什么时候throw,什么时候throws,什么时候trycatch的探索。
Demo1:testException方法中throw的是RuntimeException
run:
Exception in thread "main" java.lang.RuntimeException
at com.westward.Demo12.testException(Demo12.java:9)
at com.westward.Demo12.main(Demo12.java:6)
Demo2:testException方法中throw的是MyException(检查异常,非运行时异常);代码与Demo1对比,主要是line9不同,
run:
Exception in thread "main" com.westward.MyException: haha--MyException
at com.westward.Demo12.testException(Demo12.java:10)
at com.westward.Demo12.main(Demo12.java:6)
结论:通过这两个demo的代码可知,
demo1,自定义的方法中throw了一个运行时异常,我们在testException中既没有throws声明这个方法有可能发生异常(在这里指我throw的运行时异常),也没有trycatch对可能发生的异常(在这里指我throw的运行时异常)进行捕捉处理。因为java异常处理机制规定,对于java定义好的运行时异常,由java运行时系统自动处理抛出,不需要程序员声明或者捕捉;
demo2,自定义的方法中throw了一个非运行时异常(自定义的MyException),由于throw的是检查异常(非运行时异常),所以我们必须在定义的方法头throws声明异常类型或者在方法体trycatch捕获 可能发生非运行时的异常(本例的throw new MyException)。同时,在调用该方法的外层方法也得throws或者trycatch。
自己对throws/trycatch throw的简单理解。
对非运行时异常:一段代码,可能发生异常,即可能throw 一个异常对象,为了提前应对这段可能发生异常的代码(可能throw一个异常对象),java异常机制要求在这个方法的头部throws(声明)对应的异常类,即我的这个方法,我提前声明下,可能会有xxx异常;或这个在方法体内对可能发生异常的代码trycatch(捕捉)。throw抛出异常是相对没有发生异常来说的。throws/trycatch的是可能throw异常的代码。如果代码里我们直接throw了一个异常,我们更要(可以这样理解)throws/trycatch这个方法了。同时,在调用该方法的外层方法也得throws或者trycatch。我们可以理解,throws/trycatch是为了应对可能发生异常所做的应对措施。
对运行时异常,java运行时程序自动抛出,不是必须throws或者trycatch。
补充:检查异常(checkedException)与运行异常,什么时候throw,什么时候throws,什么时候trycatch的探索。
Demo1:testException方法中throw的是RuntimeException
package com.westward; public class Demo12 { public static void main(String[] args) { testException(); } public static void testException() { throw new RuntimeException(); } } class MyException extends Exception{//自定义异常,属于检查异常,即非运行时异常 String errorMessage; public MyException(String eString){ errorMessage= eString; } public String getErrorMessage() { return errorMessage; } }
run:
Exception in thread "main" java.lang.RuntimeException
at com.westward.Demo12.testException(Demo12.java:9)
at com.westward.Demo12.main(Demo12.java:6)
Demo2:testException方法中throw的是MyException(检查异常,非运行时异常);代码与Demo1对比,主要是line9不同,
package com.westward; public class Demo12 { public static void main(String[] args) throws MyException { testException(); } public static void testException() throws MyException{ throw new MyException("haha--MyException"); } } class MyException extends Exception{//自定义异常,属于检查异常,即非运行时异常 String errorMessage; public MyException(String eString){ errorMessage= eString; } public String getErrorMessage() { return errorMessage; } }
run:
Exception in thread "main" com.westward.MyException: haha--MyException
at com.westward.Demo12.testException(Demo12.java:10)
at com.westward.Demo12.main(Demo12.java:6)
结论:通过这两个demo的代码可知,
demo1,自定义的方法中throw了一个运行时异常,我们在testException中既没有throws声明这个方法有可能发生异常(在这里指我throw的运行时异常),也没有trycatch对可能发生的异常(在这里指我throw的运行时异常)进行捕捉处理。因为java异常处理机制规定,对于java定义好的运行时异常,由java运行时系统自动处理抛出,不需要程序员声明或者捕捉;
demo2,自定义的方法中throw了一个非运行时异常(自定义的MyException),由于throw的是检查异常(非运行时异常),所以我们必须在定义的方法头throws声明异常类型或者在方法体trycatch捕获 可能发生非运行时的异常(本例的throw new MyException)。同时,在调用该方法的外层方法也得throws或者trycatch。
自己对throws/trycatch throw的简单理解。
对非运行时异常:一段代码,可能发生异常,即可能throw 一个异常对象,为了提前应对这段可能发生异常的代码(可能throw一个异常对象),java异常机制要求在这个方法的头部throws(声明)对应的异常类,即我的这个方法,我提前声明下,可能会有xxx异常;或这个在方法体内对可能发生异常的代码trycatch(捕捉)。throw抛出异常是相对没有发生异常来说的。throws/trycatch的是可能throw异常的代码。如果代码里我们直接throw了一个异常,我们更要(可以这样理解)throws/trycatch这个方法了。同时,在调用该方法的外层方法也得throws或者trycatch。我们可以理解,throws/trycatch是为了应对可能发生异常所做的应对措施。
对运行时异常,java运行时程序自动抛出,不是必须throws或者trycatch。
相关文章推荐
- Java笔记--Session:避免表单的重复提交
- 优化
- SpringMVC与Easyui(实现了JSON的展示)、FreeMarker的整合
- java 服务器获取请求的IP方法之总结
- Java安全之对称加密、非对称加密、数字签名
- java下实现压缩数据存取
- Fat Jar - Myeclipse插件安装使用方法- 完美解决
- 线程基础:线程(1)——操作系统和线程原理
- 嵌入jetty到Java代码
- spring aop面向切面详解,以及heibernate和mybatis的区别(缓存)
- JAVA复习
- JAVA的整型与字符串相互转换
- Java中 Comparator接口 与Comparable 的区别
- Java设计模式(五)----原型模式
- 使用Link方式给eclipse或者myeclipse添加插件如git插件
- Java Lambda表达式入门
- spring mvc,以及与mybatis整合
- Eclipse智能提示及快捷键
- Java线程中yield与join方法的区别
- JAVA技术路线图