黑马程序员—JAVA基础之异常

异 常

    异常:程序在运行时出现的不正常情况。即程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。

    java.lang.Throwable:类 ,Throwable字面意思“可抛出的”。

    Error子类。错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,出现时需要对程序进行修正。

    Exception子类。异常,有针对性的处理方式

 

    无论是错误还是异常,它们都有具体的子类体现每一个问题,JavaAPI中它们的子类都有一个共性,都以父类名作为子类的后缀名。


    这个体系中的所有类和对象都具备一个独有的特点;就是可抛性。

可抛性的体现:就是这个体系中的类和对象都可以被throws和throw两个关键字所操作。


class  ErrorDemo{

public static void main(String[] args) {

//byte[] buf = new byte[1024*1024*1024];

OutOfMemoryError(内存溢出)

}

}


    在开发时,如果定义功能时,发现该功能可能会出现一些问题,应该将问题在定义功能时标示出来,这样调用者就可以在使用这个功能的时候,预先给出处理方式。

 

通过throws关键字完成标示,格式:方法声明 throws 异常类名,异常类名...

这样标示后,调用者,在使用该功能时,就必须要处理,否则编译失败。

 

处理问题方式有两种:1、捕捉;2、抛出。

对于捕捉:java有针对性的语句块进行处理。

try {

需要被检测的代码;

}

catch(异常类 变量名){

异常处理代码;

}

fianlly{

一定会执行的代码;

}

 

异常处理原则:功能抛出几个异常,功能调用者如果要进行try处理,需要有与异常对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。

 

特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。因为子类的描述会更准确,如果有一个catch捕捉到了错误,下面的catch就不会继续执行。

 

throw 和throws关键字的区别:

    throw:用在函数内,用于抛出异常对象,后面跟的是异常对象。

    throws:用在函数声明上,用于声明可能会抛出的异常类对象,后面跟的异常类名,可以跟多个,用逗号隔开。

 

异常分两种:

    1:编译时异常,只要是Exception及其子类都是编译时被检测的异常。

    2:运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常。

 

编译时被检查的异常和运行时异常的区别:

    编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。

    声明的原因:是需要调用者对该异常进行处理。

    运行时异常如果在函数内被抛出,在函数上不需要声明。

    不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。

 

自定义异常

    当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们自定义异常。

自定义异常的步骤:

    1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。自定义异常类一定要继承已经有的异常。

    2:通过throw 或者throws进行操作。

 

异常的转换思想:当出现的异常是调用者处理不了的,就需要将此异常转换为一个调用者可以处理的异常抛出。

 

try  catch  finally的几种结合方式:

    1:try{……;}catch(Exception e){……;}finally{……;}

    2:try{……;}catch(Exception e){……;}

    3:try{……;}finally{……;} 

第三种方式:如果出现异常,并不处理,但是资源一定关闭,所以这种方式只是为了关闭资源。

使用System.exit(0) 来正常退出jvm,只有这种情况finally不执行。非0状态码表示非正常终止。

 

 

当异常出现后,在子父类进行覆盖时,有了一些新的特点:

    1:当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常、要么抛出父类异常或该异常的子类,不能抛出其他异常。

    2:如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。

 

注意:

    如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try进行处理,而不能用throws声明。

    如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类异常,通过这种办法,子类的方法上是不需要使用throws声明的。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值