Tags: Java基础
Exception常用例子
1.try-with-resources(JDK7)
public class ResourceBasicUsage {
public String readFile(String path) throws IOException{
try(BufferedReader reader = new BufferedReader(new FileReader(path))) {
StringBuilder builder = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null) {
builder.append(line);
builder.append(String.format("%n"));
}
return builder.toString();
}
}
}
2.消失的异常
//finally中的ArithmeticException覆盖了try语句中NumberFormatException异常
public class DisappearedException{
public void show() throws BaseException{
try{
Integer.parseInt("Hello");
}catch(NumberFormatException nfe){
throw new BaseException(nfe);
}finally{
try{
int result = 2 / 0;
}catch(ArithmeticException ae){
throw new BaseException(ae);
}
}
}
}
//try语句块中为原始异常,忽略finally语句块中的异常
//除非原始异常未抛出,才抛出finally语句中的
public class ReadFile {
public void read(String filename) throws BaseException {
FileInputStream input = null;
IOException readException = null;
try{
input = new FileInputStream(filename);
}catch(IOException ex){
readException = ex;
}finally{
if(input != null){
try{
input.close();
}catch(IOException ex){
if(readException == null){
readException = ex
}
}
}
if(readException != null){
throw new BaseException(readException);
}
}
}
}
//不会丢失任何异常,将finally语句中的异常通过addSuppressed()方法加到try语句产生的异常中
//jdk7中Throwable类中增加的addSuppressed()方法
public class ReadFile {
public void read(String filename) throws IOException {
FileInputStream input = null;
IOException readException = null;
try{
input = new FileInputStream(filename);
}catch(IOException ex){
readException = ex;
}finally{
if(input != null){
try{
input.close();
}catch(IOException ex){
if(readException != null){
readException,addSuppressed(ex);
}else{
readException = ex;
}
}
}
if(readException != null){
throw new readException;
}
}
}
}
Exception概述
编写程序时,程序的异常如果调用者能处理,那么直接就抛给调用者,如果调用者不能处理,则通常应该转换运行时异常再抛给调用者
1.异常的分类
A[Throwable] -->B[Error]
B-->B1[...]
A -->C[Exception]
C -->C1[...]
C -->D[RuntimeException]
D -->D1[...]
- 1.Error:由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理,也处理不了
- 2.Exceptin:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示的声明或者catch
- 3.RuntimeException:一类特殊的异常(如除0溢出,数组下标越界),其产生比较频繁,处理麻烦,如果显示的声明或者catch将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。
- 4.Exceptin下不属于RuntimeException必须得处理
2.异常的捕获和处理
public void someMethod() throws SomeException {//声明可能抛出的异常
if(condition) {
throw new SomeException("错误原因");//构造并抛出
}
}
try{
someMethod();
}catch (SomeException e) {
//定义处理异常的代码
}
try{
//可能抛出异常的语句
}catch(SomeException1 e){
//对捕获的SomeException1处理
e.getMessage() //用来得到异常事件信息
e.printStackTrace //用来跟踪异常事件发生时执行堆栈内容
}catch(SomeException2 e){
//对捕获的SomeException2处理
...
}finally{
//无论是否发生异常都有执行(通常可以进行资源清除工作)
}
- 1.Java异常是Java提供处理程序“运行期”错误的一种机制,使得程序不会因为异常发生阻断或者不可预见的结果
eg:除0溢出,数组下标越界,要读取的文件不存在- 2.Java程序执行过程如出现异常事件,生成一个异常类对象封装异常事件的信息,并提交给Java运行时系统(抛出异常throw)
- 3.当Java运行时系统接受到异常对象时,会寻找处理这一异常的代码,并把当前异常对象交给其处理(捕获异常catch)
- 4.finally:为异常处理提供一个统一的出口,使得控制流程转到其它部分以前,能够对程序的状态作统一管理通常可以作资源清理工作(关闭打开的文件,删除临时文件…)
- 5.异常的捕获先catch子类,再catch父类
3.使用自定义异常
步骤:
- 1.通过继承java.lang.Exception类声明自己的异常类,实际使用最好继承RuntimeException
- 2.在方法适当的位置生成自定义异常的对象,并用throw语句抛出
- 3.在方法声明部分用throws语句声明该方法可能抛出的异常
注意:继承类中重写方法与原方法抛出的异常类型 “一样”或者”不抛出”