异常处理/java

来源:互联网 发布:泰尔终端实验室 知乎 编辑:程序博客网 时间:2024/06/15 17:08

 1.概念:程序不正常执行,在运行时出现错误。对于这种情况,程序要有相应的处理,这种处理就是异常处理。

2.常规处理异常方法,通过一个整数值来说明程序运行时出现的问题,这是通过函数的返回值来在运行函数时对结果进行判断,麻烦,而且程序异常信息不够丰富没需要进行非常多的判断。

3.java异常处理,函数定义中加上throws Exception,表示该函数有可能会丢出异常。在调用函数时,不能用获取返回值来判断,通过try和catch来接收异常,然后进行处理,在这里只是把异常的信息打印出来。

 从程序上的执行流程来看,异常的处理本质就是流程的跳转,并且是带丰富信息的流程跳转,异常后面的代码不继续执行,跳转到对该异常进行处理的catch程序块中去。catch既可以在当前函数中,也可以在外部的调用该函数的函数中。

 如果一个函数定义了抛出异常Exception,在调用时就要用try...catch程序块来处理。

4.函书的调用是嵌套调用的,如函数main调用函数A,函数A又调用函数B,这样的一个函数调用嵌套就称为函数调用栈。程序入口是main函数,进入main函数,在main执行打印语句后进入functionA,main函数放到一个先进后出的栈中,functionA执行打印语句后又调用functionB函数,这时functionA函数又被放到栈中,直到调用函数functionC,其执行完后从栈中取出函数B中继续执行,直到main函数被取出来,栈被清空。如果出现异常,就会通过异常的printsStackTrace把异常相关的调用栈打印出来。

5.捕获异常,异常的捕获处理通过try...catch关键字来实现,可以直接在抛出异常的函数中捕获异常,这样异常就不会被抛出到函数往外面了,在函数定义时就不用再说明会抛出异常了,因为它已经被处理了。

6.异常流转,可以在函数调用栈中的任何一个函数来处理掉这个异常。如果函数抛出异常在该函数中被接收处理掉了,就不会抛到函数外,这时在定义函数时就不需要加上throws Exception。因为该函数对于它的调用函数而言并不能接收异常。

7.异常的控制,通过throw关键字来实现抛出异常,作为一个操作,可以再任何地方,即在接受异常的程序块catch中也可以抛出异常。

8.自定义异常,Exception也是一个类,它实现了throwable接口,所以能够被抛出。它既然是类,当然可以被扩展,可以定义子类对它进行继承,这样逻辑会更清晰,对于不同的错误可以抛出不同类型的异常。

9.捕获所有异常,Catch语句可以判断捕获的异常类型,如果类型与要捕获的类型一致就执行相应的异常处理程序。通过一个catch来处理所有异常不合适,会丢失掉异常的具体类型信息,不方便对不同异常进行不同处理。

10.运行期异常,在所做的第一个程序里,运行时会抛出异常,这样的异常没有try...catch来捕获,但程序可以编译,只是运行时才出现。这种异常的父类是RuntimeException,称其为运行期异常。可以创建一个它的子类,这样就不用再在定义函数时抛出异常了。

11.finally程序块,如果某些操作在有没有异常出现都要执行,可以在异常处理块上加finally程序块,该程序块在除了系统退出以外的任何情况下都会执行。catch语句只有在出现异常的情况下才执行,而finally里面的语句是不管是否异常都会被执行。finally语句既不处理也不捕获异常。

12.error。Exception能够被抛出是因为实现了Throwable接口,这个接口有个子类error,这个子类及其子类表示一个非常严重错误,一般程序不要抛出这样的错误,这样的错误通常不要去catch,通常就表示程序发生严重错误退出。

13.总结:异常的本质就是带丰富信息的异常的流程控制

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击