异常

一、概念

一)为什么会有Java异常机制

在没有Java异常机制的情况下,唯一的退出机制就是返回值,判断是否异常的方法就是

返回值。方法根据是否异常返回不同的返回值,调用者根据不同的返回值进行判断。每一

层方法都需要对调用的方法的不同返回值进行检查和处理,程序的正常逻辑和异常逻辑混杂

到一起,使代码难以阅读和维护。另外,异常毕竟是少数,程序员因此常常偷懒,忽略对异常

返回值的检查,降低了程序的可靠性。

在有了异常机制后,程序的正常逻辑与异常逻辑就可以分离,异常情况就可以集中处理,异常还可以

自动向上传递,不再需要每层方法都进行处理,异常可不可能被自动忽略,从而处理异常的代码大大

减少,代码的可读性,可维护性,可靠性都得到了提高。

二)Java异常处理机制

Java异常的默认处理机制:打印异常栈到屏幕,并退出程序。

异常处理机制会从当前函数查找谁捕获了该异常,如果这一层函数没有捕获就依次向

上一层函数查找,直到主函数,如果主函数也没有捕获该异常,就使用默认机制,打印

异常栈信息,并退出程序。

异常是相对于return的一种退出程序的机制可以由throw语句触发,也可以由系统触发。

三)异常的分类

异常可以分类为:

1)受检(checked)异常:强制要求程序员处理(捕获或者通过throws关键字声明)的异常,否则编译器会报错。

2)未受检(unchecked)异常:不要求程序员处理。

关于受检异常和未受检异常,以前的说法是:

未受检异常属于编程的逻辑错误,编程时应该检查以避免这些错误,比如空指针异常,

如果真的出现这种错误,程序退出也是正常的,程序员应该检查代码BUG而不是想办法

处理这种异常。受检异常表示程序本身没问题,但由于I/O、网络、数据库等不可预测的

错误导致的异常,调用者应该处理。

但实际上编程错误也是应该处理的,尤其Java被广泛应用于服务器应用中,不能

因为一个逻辑错误就使程序退出。所以,目前一种更被认同的的观点是:Java中

对受检异常和未受检异常的区分是没有太大意义的,可以统一使用未受检异常来代替。

这种观点的基本理由是:无论受检异常还是未受检异常,无论是否出现在throws声明中

,都应该在合适的地方以适当的方式进行处理,而不只是为了满足编译器的要求盲目处理

异常,既然都要进行处理异常,受检异常的强制声明和处理就显得很繁琐,尤其在调用层次比较深的情况下。

异常的类体系:

1.Throwable

有四个构造方法:

1. public Throwable()
2. public Throwable(String message)
3. public Throwable(String message, Throwable cause)
4. public Throwable(Throwable cause)

其中message表示异常消息,cause表示触发该异常的其他异常。异常可以形成一个异常链,

上层的异常由底层触发,cause表示的是底层异常。Throwable还有一个public方法用于设置cause:

Throwable initCause(Throwable cause)

Throwable某些子类没有构造函数就可以通过该方法设置。这个方法最多只能被调用一次。

2.Error

Error(unchecked):描述了Java运行时系统内部错误和资源耗尽错误。

应用程序不应该抛出此类异常。如果出现这样的内部错误,应该通报给客户,并尽力使程序安全退出。

3.Exception

Exception层次:

RuntimeException(unchecked):由于程序错误(代码有问题)导致的异常,如

错误的类型转换,

数组访问越界,

访问空指针

这类异常一定是你的错误。

其他异常(checked):程序本身没有问题,由于像I/O错误这类问题导致的异常。如:

试图在文件末尾后面读取数据

试图打开一个不存在的文件。

编译器将核查是否所有checked异常提供了异常处理器。

四)异常的处理

重新抛出:因为当前层级不能处理该异常,抛出给调用者处理。

抛出一个新异常:当前异常所包含的信息不够,或者太过详细。

throws关键字:用于声明一个方法可能抛出的异常,这个声明的

含义是这个方法可能抛出这些异常,并且没有对这些异常进行处理,调用者必须进行处理。

finally执行细节:

1)如果在try或者catch语句内有return语句,则return语句在finally语句

执行结束后才执行,但finally并不能改变返回值。

    //返回0
public static int test(){
int ret = 0;
try{return ret;
}finally{
ret = 2;
}
}

2)如果在finally语句中也有return语句:try和catch中的return会丢失,实际返回finally中的返回值。

finally中有return还会掩盖try和catch内的异常,就像没有异常发生一样。如果finally中抛出了异常,

则原异常也会被覆盖。

    public static int test(){
int ret = 0;
try{
int a = 5/0;
return ret;
}finally{
//返回2而不向上传递异常
return 2;
}
}
    public static void test(){
try{
int a = 5/0;
}finally{
//原来异常ArithmeticException丢失
throw new RuntimeException("hello");
}
}

因此:应该避免在finally中return或者抛出异常,如果调用的其他代码可能抛出异常,

则应该捕获异常并进行处理。

Java笔记(三)异常的更多相关文章

  1. Java笔记(十七)……异常

    异常概述 异常是什么 是对问题的描述,将问题进行对象的封装 异常体系 Throwable |---Error |---Exception |---RuntimeException 异常体系的特点 异常 ...

  2. Java笔记:异常

    Exception 类的层次 所有的异常类是从 java.lang.Exception 类继承的子类. Exception 类是 Throwable 类的子类.除了Exception类外,Throwa ...

  3. JAVA笔记9__异常/throw关键字/自定义异常/受检与非受检异常、assert关键字/StringBuffer、StringBuilder/代码国际化、动态文本

    /** * 异常:在程序中导致程序中断运行的一些指令 * 1.受检异常:编译期 * 2.非受检异常:运行期 * 异常处理过程分析: * 1.一旦产生异常,系统会自动产生一个异常类的实例化对象 * 2. ...

  4. Java笔记(三十)……正则表达式

    概述 符合一定规则的表达式 专门用于操作字符串 特点: 用于一些特定的符号来表示一些代码操作,这样就可以简化书写 所以学习正则表达式,就是在学习一些特殊符号的使用 好处: 可以简化对字符串的复杂操作 ...

  5. Java笔记(三)……基础语法

    关键字 标识符 在程序中自定义的一些名称 由26个英文字母大小写,数字:0-9,符号:_ $组成 定义合法标识符规则: 数字不可以开头. 不可以使用关键字. Java中严格区分大小写. 注意:在起名字 ...

  6. 菜鸡的Java笔记 第三十 - java 异常的捕获及处理

    异常的捕获及处理        1.异常的产生分析以及所带来的影响        2.异常的处理的基本格式        3.异常的处理流程        4.异常的处理模式        5.自定义 ...

  7. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  8. java笔记--异常详解与处理

    一.异常概念 Throwable类是Java中所有错误或异常的超类. 1.只有当对象是此类(或其子类)的实例时,才能通过Java虚拟机或着Java throw语句抛出.     2.只有此类或其子类才 ...

  9. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  10. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

随机推荐

  1. Nginx详解二十:Nginx深度学习篇之HTTPS的原理和作用、配置及优化

    一.HTTPS原理和作用: 1.为什么需要HTTPS?原因:HTTP不安全1.传输数据被中间人盗用.信息泄露2.数据内容劫持.篡改 2.HTTPS协议的实现对传输内容进行加密以及身份验证 对称加密:加 ...

  2. 开放系统的直连式存储(Direct-Attached Storage,简称DAS)

    开放系统的直连式存储(Direct-Attached Storage,简称DAS)已经有近四十年的使用历史,随着用户数据的不断增长,尤其是数百GB以上时,其在备份.恢复.扩展.灾备等方面的问题变得日益 ...

  3. oracle数据库无法连接 The Network Adapter could not establish

    Caused by: java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection 这个错误 ...

  4. Django系列(一)

    项目引入静态文件 更改settings.py,为项目下面的每个APP应用,建立静态文件,这里如blog,首先在blog下面建立一个静态文件夹名为statics,注意这里为别名 STATICFILES_ ...

  5. OpenCV trackbar 避免使用全局变量

    OpenCV trackbar 避免使用全局变量 在OpenCV中使用trackbar是交互式地图像处理的一种方式,例如用于图像阈值分割,用户可以一边调整阈值一边看效果.但是很不幸,绝大多数教程上使用 ...

  6. BeautifulSoup下Unicode乱码解决

    今天在用scrapy爬某个网站的数据,其中DOM解析我用的是BeautifulSoup,速度上没有XPath来得快,不过因为用了习惯了,所以一直用的bs,版本是bs4 不过在爬取过程中遇到了一些问题, ...

  7. [转]sqlplus /nolog 出错解决 SP2-0667: Message file sp1<lang>.msb not found SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory

    http://techxploration.blogspot.com/2012/01/resolving-sp2-0750-you-may-need-to-set.html Resolving SP2 ...

  8. 正则表达式匹配URL或者网址

    正则表达式 (http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])? ...

  9. 一起学Hadoop——二次排序算法的实现

    二次排序,从字面上可以理解为在对key排序的基础上对key所对应的值value排序,也叫辅助排序.一般情况下,MapReduce框架只对key排序,而不对key所对应的值排序,因此value的排序经常 ...

  10. python中super的理解(转)

    原文地址:https://www.zhihu.com/question/20040039 针对你的问题,答案是可以,并没有区别.但是这题下的回答我感觉都不够好. 要谈论 super,首先我们应该无视 ...