Java异常-Exception

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语句声明该方法可能抛出的异常
    注意:继承类中重写方法与原方法抛出的异常类型 “一样”或者”不抛出”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值