Java异常

异常

我的理解

  • 概括来说就是你调用方法时,由于你传递的参数等各种原因,会导致该方法不能正常执行,所以java设计了异常类型(Exception,也就是官方包里写好的一个普通类,你甚至可以通过继承自定义一个异常类),通过异常类型对象可以打印错误信息,让我们更快定位出现问题的位置,大大提高我们找错的效率
  • 于是在定义方法时可以声明可能出现的异常类型,方法内执行语句时通过判断发现了逻辑问题(如1/0很明显是一个运算错误)就抛出异常,语句执行终止
  • 然后你调用声明了异常的方法时,由于可能出现错误,所以必须使用异常处理(try catch语句),调用方法出现了错误,就能获得该方法抛出的异常类型对象,通过该对象就能打印错误信息、异常轨迹(在catch块中调用异常对象的方法)

  • Java语言设计及编写程序的核心是面向对象,对于异常处理Java仍然是以面向对象为核心进行设计错误异常处理。

  • 任何一个错误/异常的出现都被看做是一个异常对象,异常对象必
    需属于某个错误/异常类型。java中异常对象的出现导致此方法调用终
    止,程序将转向异常处理程序。

  • 异常处理能够让编程者跟踪错误信息,确定程序中的错误异常的
    位置,从而调试应用程序,使之调整后重新运行。

  • Error、Exception都继承自Throwable,但Error是JVM出现问题,Exception是程序出现问题

Java异常分为运行时异常编译型异常2类
运行时异常只有在程序运行时被发现和处理
编译型异常在编译阶段就能被发现并且必需显示处理
通常定义自定义异常都是编译型异常


异常的声明和抛出

方法名称( ) throws异常类型1.异常类型2{ throw异常对象; }

  • 使用throws关键字声明异常,多个异常类型用逗号分隔
  • 使用throw关键字在满足条件的时候抛出异常实例
  • 抛出的异常对象必需是声明定义的异常类型
  • 满足条件时抛出异常对象时此方法调用结束,程序转向异常处理
  • 如果有多个异常对象,一次也只能抛出一个
/**
 * 定义方法时声明定义异常,在满足条件时抛出异常对象
 * 时此方法调用结束,程序转向异常处理
 */
public class Test {

    public double count(double a, double b)throws Exception{
        if(b == 0){
            throw new Exception("错误!除数不能为零!");
        }
        return a/b;
    }
}

异常的捕获和处理

  • 声明了编译型异常的方法调用时必需进行异常捕获和处理
  • 使用try块捕获异常或使用throws在调用方法中继续声明
  • 使用catch块处理try块捕获的异常
  • 使用finally块强制执行必需执行的代码

try{ 声明定义了异常的方法调用;}catch(Exception e){ 处理异常的代码;}finally{ 强制执行必需执行的代码;通常是资源的释放
}`

  • 异常常用方法
public String e.getMessage();//获得错误信息
public void printStackTrace();//打印异常轨迹
/**
 * 定义了编译型异常的方法调用,必需进行显示处理
 * 1 使用throws继续向上声明出去,交给下一个调用的方法
 * 2使用try和catch块进行对异常捕获和处理
 */
public class Test {

    public double count(double a, double b)throws Exception{
        if(b == 0){
            throw new Exception("错误!除数不能为零!");//抛出异常
        }
        return a/b;
    }

    public static void main(String[] args) {
        Test t = new Test();
        try{                   //使用try块包围调用的声明了异常的方法
            t.count(2,0);
            System.out.println("释放占用资源");//此语句不会被执行,应该使用finally
        } catch (Exception e) {//处理异常
            System.out.println(e.getMessage());
            e.printStackTrace();
        }finally{
            System.out.println("释放占用资源");//强制执行
        }
    }
}
  • 如果使用多个catch块,则必须遵循子类异常类型的catch块在前边,父类在后边

版本异常新特性

try{ 调用定义了异常的方法;}catch(异常类型1|异常类型2 e){ 异常处理代码; }

  • 可以避免使用多个catch块
  • 异常类型之间不能存在继承关系

自定义异常

  • 自定义异常必需直接或间接继承Exception类
  • 通常在Java预定义异常不能满足要求时自定义异常
  • 自定义异常通常是编译型异常
  • 自定义异常可以重写父类的相关方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值