Error和Exception的联系

  • 继承结构:Error和Exception都是继承于Throwable,RuntimeException继承自Exception。

  • Error和RuntimeException及其子类称为未检查异常(Unchecked exception),其它异常成为受检查异常(Checked Exception)。

Error和Exception的区别

  • Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。如java.lang.StackOverFlowError和Java.lang.OutOfMemoryError。对于这类错误,Java编译器不去检查他们。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。

  • Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

运行时异常和受检查的异常

Exception又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception )。

  • RuntimeException:其特点是Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try……catch捕获,也没有用throws抛出,还是会编译通过,如除数为零的ArithmeticException、错误的类型转换、数组越界访问和试图访问空指针等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。

  • 受检查的异常(IOException等):这类异常如果没有try……catch也没有throws抛出,编译是通不过的。这类异常一般是外部错误,例如文件找不到、试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。

throw 和 throws两个关键字有什么不同

  • throw 是用来抛出任意异常的,你可以抛出任意 Throwable,包括自定义的异常类对象;throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。如果方法抛出了异常,那么调用这个方法的时候就需要处理这个异常。

try-catch-finally-return执行顺序

  • 1、不管是否有异常产生,finally块中代码都会执行;
  • 2、当try和catch中有return语句时,finally块仍然会执行;
  • 3、finally是在return后面的表达式运算后执行的,所以函数返回值是在finally执行前确定的。无论finally中的代码怎么样,返回的值都不会改变,仍然是之前return语句中保存的值;
  • 4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

举例:

情况1:try{} catch(){}finally{} return; 
按正常顺序执行。


情况2:try{ return; }catch(){} finally{} return; 
程序执行try块中return之前(包括return语句中的表达式运算)代码; 
再执行finally块,最后执行try中return; 
finally块后面的return语句不再执行。


情况3:try{ } catch(){return;} finally{} return; 
程序先执行try,如果遇到异常执行catch块, 
有异常: 
则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码, 
最后执行catch块中return. finally块后面的return语句不再执行。 
无异常: 
执行完try再finally再执行最后的return语句.


情况4:try{ return; }catch(){} finally{return;} 
程序执行try块中return之前(包括return语句中的表达式运算)代码; 
再执行finally块,因为finally块中有return所以提前退出。


情况5:try{} catch(){return;}finally{return;} 
程序执行catch块中return之前(包括return语句中的表达式运算)代码; 
再执行finally块,因为finally块中有return所以提前退出。


情况6:try{ return;}catch(){return;} finally{return;} 
程序执行try块中return之前(包括return语句中的表达式运算)代码; 
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码; 
则再执行finally块,因为finally块中有return所以提前退出。 
无异常:则再执行finally块,因为finally块中有return所以提前退出。

测试程序事例

public class FinallyTest
{
public static void main(String[] args) {
System.out.println(new FinallyTest().test());;
}
static int test()
{
int x = 1;
try
{
x++;
return x;
}
finally
{
++x;
}
}
}

打印结果是2。

根据之前的分析,在try语句块中,在执行return语句时,要返回的结果已经准备好了,然后程序转到finally执行。在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,再从中取出返回结果,因此,即使finally中对变量x进行了改变,也不会影响返回结果。

原文链接:http://blog.csdn.net/goodlixueyong/article/details/47122487

谈一谈Java中的Error和Exception的更多相关文章

  1. Java中的Error和Exception

    Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型. Excep ...

  2. Java牛角尖【007】:Java中的Error能不能被Catch

      Java牛角尖[007]:Java中的Error能不能被Catch 网上看到很多朋友说Java中Error是无法Catch到的,而Java中定义的Error类型又很难测试到,那就估且以为确是如此吧 ...

  3. 简谈 JavaScript、Java 中链式方法调用大致实现原理

    相信,在 JavaScript .C# 中都见过不少链式方法调用,那么,其中实现该类链式调用原理,大家有没有仔细思考过?其中 JavaScript 类库:jQuery 中就存在大量例子,而在 C# 中 ...

  4. java中的error该不该捕获

    写java程序时,通常会被提示捕获异常,而又有一些异常是不需要强制捕获的,这是一个被说烂了的话题.像我一样从其他语言转过来的人确实有点迷惑,那我以我的理解重新解释一遍吧. 异常的基类是Exceptio ...

  5. java 异常处理 Throwable Error 和Exception

    Java异常类层次结构图:       异常的英文单词是exception,字面翻译就是“意外.例外”的意思,也就是非正常情况.事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误. 比如使用 ...

  6. python 实现过滤出tomcat日志中含有ERROR 或Exception 的行并保存在另一个文件

    遍历多个tomcat日志文件,找出含有ERROR 和Exception 的日志,并把该行日志输出到另一个文件中:(这里为了体现python模块导入的知识,所有建立了多个文件夹和模块) 项目结构: co ...

  7. 源码浅谈(一):java中的 toString()方法

    前言: toString()方法 相信大家都用到过,一般用于以字符串的形式返回对象的相关数据. 最近项目中需要对一个ArrayList<ArrayList<Integer>> ...

  8. 源码浅谈(二):java中的 Integer.parseInt(String str)方法

    这个方法是将字符串转换为整型 一.parseInt方法 ,可以看到默认又调用了parseInt(s,10) ,  第二个参数为基数,默认10 ,当然也可以自己设置  public static int ...

  9. 关于java中的“error: bad operand types for binary operator ”

    今天做这个题目的时候(142. O(1) Check Power of 2),遇到一个错误“ bad operand types for binary operator '&' ”. 先贴一下 ...

随机推荐

  1. UTF8编码

    UTF-8是Unicode的实现方式之一. UTF-8最大的一个特点,就是它是一种变长的编码方式.它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度. UTF-8的编码规则很简单,只有二 ...

  2. spring的jar各包作用

    http://yjwen337.blog.163.com/blog/static/3625847820106132949858/[转]spring.jar是包含有完整发布的单个jar 包,spring ...

  3. fullpage.js的easing参数怎样配置自定义动画

    首先看非官方文档 并没有详细的说明怎样去使用easing.js,所以我加的运动属性根本就不起作用, 再看,官方文档 Optionally, when using css3:false, you can ...

  4. iOS 设置文本中指定某段文本的颜色 大小

    NSString *money = @"300"; NSString *perStr = @"元/时"; NSString *text = [NSString  ...

  5. JavaSE基础篇—数据类型和运算符

       本章知识点内容概括 数据类型:  1.基本数据类型 数值型 整数类型 byte(128~127),占1个字节的储存间 short(-2^15~2^15-1),占2个字节 int(默认类型-2^3 ...

  6. linux服务器配置pyspark解决py4j报错等问题

    1.下载spark,python包 略 2.环境变量配置 打开 ~/.bashrc配置文件 如图添加下列环境变量及path 3.退出配置文件,输入 source ~/.bashrc 来执行你添加的一些 ...

  7. Sql Server的艺术(一) 视图的增删查改

    视图是从一个或者多个表中查询数据的另一种方式.利用视图可以集中.简化定制数据库,同时还能保障安全. 视图其结构和数据是建立在对应的查询基础上的.和表一样,视图也是包括几个被定义的数据列和多个数据行,但 ...

  8. ferror,clearerr和EOF含义

    1.我们并不是实时操纵文件,也不是实时生效,它依赖于缓冲区.非缓冲模式编程与常规区别,就是实时与不实时的区别. 2.//fgetc fputc, fgets fputs, fgetwc fputwc, ...

  9. LINUX文件定位

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  10. Sonar 数据库表关系整理一(rule相关)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/7510072.html 简介:Sonar ...