【java】异常和处理
(根据http://www.imooc.com/learn/110 陈码农老师教学视频总结)
一.异常体系结构
所有不正常类都继承于Throwable类
1.异常两个子类 error & Exception
(1)Error类:
表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。
(2)Exception类
(参考 http://bbs.itheima.com/thread-117155-1-1.html wanghe826的回答)
分为:runtime exception和checked exception。
面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常
|
try{ |
|
//会抛出异常的方法,若抛出异常,该方法终止执行,控制权交给catch里 |
|
}catch(Exception e){ |
|
//处理该异常的代码块,发出警告、记录错误日志 |
|
} |
【1】RuntimeException(非检查异常,运行时异常)
eg. 引用了空对象的属性或方法(空指针),数组访问越界、错误类型转换、除数0算数异常
运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一.
如果不对RuntimeException处理,出现运行时异常之后,要么是线程中止,要么主程序终止。
如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。
如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。
【2】检查(checked)异常 要手动捕获处理
检查异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。
二.异常处理
抛出多个异常(多重catch)
多个catch
|
try{ |
|
//会抛出异常的方法,若抛出异常,该方法终止执行,控制权交给catch里 |
|
}catch(AritheticException e){ |
|
//处理算数为0的情况 |
|
}catch(Exception e){ // 处理该异常的代码块,发出警告、记录错误日志 //算数异常使Exception 的子类,按照父亲谦让儿子的顺序 } |
注意:
顺序问题:先小后大,先子类、后父类,因为会自动找就近匹配的异常处理。上述Exception是上面异常的父类,所以放到最后,不然编译会报错。
finally善后工作
具体案例参考 http://www.cnblogs.com/haitao-fan/archive/2012/05/31/2528389.html
finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源
|
Try{ |
|
//会抛出异常的方法,若抛出异常,该方法终止执行,控制权交给catch里 |
|
}catch(AritheticException e){ |
|
//处理算数为0的情况 |
|
}catch(Exception e){ // 处理该异常的代码块,发出警告、记录错误日志 e.printStackTrace(); }finally{ |
|
//善后工作,最后要处理的代码 } |
三.异常抛出throw
throws——声明将要抛出何种类型的异常
|
public void methodName(args1,args2) |
|
throws 异常列表{ |
|
//调用会抛出的异常的方法或者throw new Exception() |
|
} |
例子
|
public void divide(int one, int two) throws Exception{ |
|
if (two==0) |
|
throw new Exception("\"two\" can't be zero "); |
|
else |
|
System.out.println("the result is :"+one/two); |
|
} |
四.自定义异常
必须继承java标准类中意思相近的异常类型,或者Exception
class yourName extends ExceptionType{ }

五.异常链
把捕获的异常包装成新的异常,从新的异常添加对原始异常的引用
|
package com.imooc; |
|
public |
|
/** |
|
* test1() 抛出drunk异常, |
|
* test2() 调用test1(),捕获drunk异常,并包装成运行时异常,继续抛出 |
|
* main()调用test2(),尝试捕获test2抛出的异常 |
|
*/ |
|
public |
|
ChainTest ct=new ChainTest(); |
|
try { |
|
ct.test2(); |
|
} catch (Exception e) { |
|
e.printStackTrace(); |
|
} |
|
} |
|
public |
|
throw |
|
} |
|
|
|
public |
|
try { |
|
test1(); |
|
} catch (DrunkException e) { |
|
RuntimeException newException = new RuntimeException("司机一滴酒,亲人两行泪"); |
|
//调用含参构造器 |
|
newException.initCause(e);//下面有解释 |
|
throw newException; |
|
} |
|
} |
|
} |

解释newException.initCause(e)
出处 http://zy19982004.iteye.com/blog/1975986
- 现在所有Throwable的子类子构造器中都可以接受一个cause对象作为参数,这个cause就异常原由,代表着原始异常,即使在当前位置创建并抛出行的异常,也可以通过这个cause追踪到异常最初发生的位置。
- 只有Error,Exception,RunimeException提供了带cause参数的构造器,其他的所以异常就只有通过initCause()来设置cause了。
六.经验总结
- 多重catch后面加个catch(Exception),处理可能遗漏的异常
- 不确定的代码surrounded with try-catch,处理潜在异常
- 尽量处理异常,不要只用简单的调用printStackTrace()
- 尽量添加finally去释放占用资源
【java】异常和处理的更多相关文章
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
本文转载自 java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...
- Java异常体系及分类
上图是基本的java异常体系结构. 主要分为2大类:Error和Exception 1.Error:描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象,一般是由虚拟 ...
- Java异常之自定义异常
哎呀,妈呀,又出异常了!俗话说:"代码虐我千百遍,我待代码如初恋". 小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了,今天来跟大家聊聊Java异常.Java异 ...
- 第11章 Java异常与异常处理
1.Java异常简介 1.什么是异常异常出现的时候代码会无法正常运行下去,会产生各种问题2.捕捉异常的作用提早发现异常,方便查找问题,并给出解决方法3.Java中的异常1.Java中所有不正常的类都是 ...
- java 异常
1.java异常 2.自定义抛出 3.运行时异常,程序有问题,让使用者可以改' ' 4.return 和 throw的区别 return 符合函数要求的值 throw 有问题的时候用它结束 ...
- 3.Java异常进阶
3.JAVA异常进阶 1.Run函数中抛出的异常 1.run函数不会抛出异常 2.run函数的异常会交给UncaughtExceptionhandler处理 3.默认的UncaughtExceptio ...
- 2.Java异常学习
1.Java异常的概念 异常的例子 1.除法就是一个需要捕获异常的例子,除数又可能是0 异常处理的基本流程如下 一旦发生异常,就使得程序不按照原来的流程继续的运行下去 a.程序抛出异常 try{ th ...
- java异常架构图 和几个面试题
1.java异常架构图 粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被 ...
- 黑马----JAVA异常
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA异常 一.JAVA异常有三种语句块:try语句块.catch语句块.finally语句块. 1.try语句 ...
随机推荐
- OBD芯片应用开发手册 OBD2开发 内部资料分享 汽车电子通讯开发TDA61 TDA66芯片
OBD产品及各种汽车电子相关的开发.往往需要开发者学习各种汽车协议,深入了解全部OBD规范和汽车各性能参数.这往往需要开发者很长的时间学习研究,大大延缓了OBD产品的上市开发进度.为此深圳芯方案电子公 ...
- C# 发送邮件代码
C# 发送邮件代码 MailMessage mailMsg = new MailMessage(); //using System.Net; 引用 mailMsg.From = new MailAdd ...
- C++实现的屏幕截图软件 v1.0
之前用win32做的屏幕截图软件,使用了好久,非常好用. 在2.0版本中增加了屏幕尺和颜色拾取功能,并且改用屏幕和内存DC双缓冲,彻底消灭了闪屏,可惜代码丢失了 好不容易找到1.0版本的代码,以后再重 ...
- SqlSever基础 union all 联合查询,简单的组合 两个查询结果拼在一起
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- android 串口调试
在usb调试过程中,都会选择串口查看log,更希望在串口中输入命令查看相关状态.但是一般情况下串口调试时 进程用户是shell,即使你在adb shell下是root用户. 暴力方法是在 adroid ...
- oracle dual 表
dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下: 1.查看当前用户,可以在 SQL Plus中执行下面语句 sele ...
- Word和Windows有严重的bug这样下去微软堪忧
Word和Windows对微软的重要性就像C语言的指针. Windows中特别常用的搜索功能有严重的bug,常常搜不到Excel文件. Word中的排版功能有严重的bug,有图超过几十页就无法排版了, ...
- hdu 2199 (二分)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2199 Can you solve this equation? Time Limit: 2000/1000 ...
- Hibernate之N+1问题
什么是hibernate的N+1问题?先了解这样一个描述: 多个学生可以对应一个老师,所以student(n)---teacher(1).Stu类中有一个属性teacher.在hibernate配置文 ...
- plot bar chart using python
Example import matplotlib.pyplot as plt import plotly.plotly as py # Learn about API authentication ...