黑马程序员——浅析异常

------ Java培训、Android培训、iOS培训、.Net培训 、期待与您交流! -------



                                                                                        浅析java异常

1、基本概念

      当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用。。。)时JAVA就会用异常对象来描述。

       

2、JAVA中有两种处理异常的办法:

      1、在发生异常的地方直接处理;  2、将异常抛给调用者,让调用者处理。


3、异常分类

      (1)检查性异常即编译异常:java.lang.Exception

      (2)运行期异常:java.Runtime.Exception

      请务必记住:只能在代码中忽略RuntimeException及其子类,究其原因是因为RutimeException代表的是编程错误。

      (3)错误:java.lang.Error

       顶层是java.lang.Throwale类,检查项异常,运行期异常,错误都是这个类的子孙类。java.lang.Exception、 java.lang.Error都继承自java.lang.Throwale,而java.Runtime.Exception继承自java.lang.Exception。

         想要对异常有更深刻的理解最好去浏览一下API帮助文档,对异常来说关键是理解概念以及如何使用。

4、异常类的常用方法

       Exception类有自己的数据成员和成员方法。其构造方法为:public Exception() public Exception(String s)

其公有方法为(都是从Throwable继承来的)

public String getMessage()返回异常信息

public String toString()返回异常类型的简要说明

public void printStackTrace()输出调用堆栈路径

5、异常的终止与恢复

       异常处理理论上有两种基本模型。Java支持终止模型。在这种模型中,将假设错误非常关键,以至于程序无法返回到异常发生的地方继续执行。一旦异常被抛出,就表明错误已经无法挽回,也不能回来继续执行。


           另一种成为恢复模型。意思是异常处理程序的工作是修正错误,然后重新尝试调用出问题的方法,并认为第二次能成功。对于恢复模型,通常希望异常被处理以后能继续执行程序。如果想用java实现类似的恢复行为,那么遇见错误时就不能抛出异常,而是调用方法来修正该错误。或者把try块放到while循环里,这样不断的进入try块,直到得到满意的结果。

           长久以来,尽管程序员使用的操作系统支持恢复模型的异常处理,但他们最终还是转向使用类似“终止模型的代码”,并且忽略恢复行为。所以虽然恢复模型开始很吸引人,但不是很实用。其主要原因可能是它所导致的耦合:恢复性的处理程序需要了解异常抛出的地点,这势必包含依赖于抛出位置的非通用性代码。这正加了代码编写和维护的困难,对于异常可能会从很多地方抛出的大型程序来说,更是如此。

6、java异常处理机制

    1、try。。。Catch

程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。


    2.Finally

      如果把finally块置于try。。Catch。。语句后,finally块一般都会得到执行,它相当与一个万能保险,及时前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行。Finally一般出一个清理工作:java有垃圾回收机制所以内存释放不再是问题,需要清理的资源一般包括:已经打开的文件或网络,在屏幕上画的图形等。

  以下情形,finally块将不会被执行:

    (1)finally块中发生异常;

     (2)程序所在的线程死亡;

     (3)在前面代码中用了System.exit();

     (4)关闭cpu。

7、方法声明抛出异常throws
      程序员可以不在当前方法内处理异常,而是把异常抛出到调用方法中。
      方法头声明抛出异常:
     [修饰符] 返回类型 方法名([参数表])throws 异常类型1,异常类型2{
      ……
     会产生异常类型1异常的语句
      ……
     会产生异常类型2异常的语句
      ……

     }
运行时异常(RuntimeException类及其子类)可以不被处理,
同样,运行时异常若不处理,也可以不用throws声明,但其他异常若在方法内不被处理,则必须用throws声明。

调用声明抛出异常的方法时,需要进行异常处理,或者也将异常抛出,由其上级调用者处理。
异常的传播过程
发现异常的方法若不能处理异常,这时异常被抛出给其上级调用者。
如果调用者也不能处理这个异常,还可以继续传递给上级调用者去处理,这种传播会一直继续到异常被处理为止。
如果程序始终没处理这个异常,异常会传递到Java虚拟机运行时系统,运行时系统捕获这异常后通常只是简单地终止这个程序。

8、抛出自定义异常
自定义异常:从Exception继承的类
    异常类中可以有与异常相关的属性和方法,可以被异常处理调用
    在方法内抛出自定义异常
方法体内:创建异常对象,并抛出。 
 throw  异常对象;
方法头:声明抛出异常列表

以上便是我对异常的简单的理解,记录下来方便以后需查阅,如能帮到某位码友,是我的荣幸。如有不周还望海涵


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值