异常指程序运行中出现的不期而至的各种状况
,
如
:
文件找不到、网络连接失败、非法参数等。
异常发生在程序运行期间
,
它影响了正常的程序执行流程。
异常发生的原因有很多,通常包含以下几大类:
用户输入了非法数据。
要打开的文件不存在。
网络通信时连接中断,或者
JVM
内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。
要理解
Java
异常处理是如何工作的,你需要掌握以下三种类型的异常:
检查性异常:
最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如
要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
运行时异常:
运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译 时被忽略。
错误:
错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出
时,一个错误就发生了,它们在编译也检查不到的
异常指不期而至的各种状况,如:文件找不到、网络连接失败、除
0
操作、非法参数等。异常是一个 事件,它发生在程序运行期间,干扰了正常的指令流程。
异常体系结构
Java把异常当作对象来处理,并定义一个基类
java.lang.Throwable
作为所有异常的超类。
在
Java API
中已经定义了许多异常类,这些异常类分为两大类,
错误
Error
和异常
Exception
。
Java异常层次结构图:
异常之间的区别与联系
1
、
Error
Error类对象由
Java
虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
不希望被捕捉
2
、
Exception
通常情况下是可
以被程序处理的,并且在程序中应该尽可能的去处理这些异常
3
、检查异常和不受检查异常
检查异常:在正确的程序运行过程中,很容易出现的、情理可容的异常状况,在一定程度上这种异常的
发生是可以预测的,并且一旦发生该种异常,就必须采取某种方式进行处理。
解析:
除了
RuntimeException
及其子类以外,其他的
Exception
类及其子类都属于检查异常
,当程序
中可能出现这类异常,
要么使用
try-catch
语句进行捕获,要么用
throws
子句抛出
,否则编译无法通
过。
不受检查异常:包
括
RuntimeException
及其子类和
Error
Java
异常处理机制
java
异常处理本质:抛出异常和捕获异常
1、抛出异常
异常情形(
exception condition
),它是指阻止当前方法或作用域
继续执行的问题。其次把异常情形和普通问题相区分,普通问题是指在当前环境下能得到足够的信息,
总能处理这个错误。
对于异常情形,已经无法继续下去了,因为在当前环境下无法获得必要的信息来解决问题,你所能做的
就是从当前环境中跳出,并把问题提交给上一级环境,这就是抛出异常时所发生的事情。抛出异常后,
会有几件事随之发生。
首先,是像创建普通的
java
对象一样将使用
堆上创建一个异常对象;然后,当前的执行路径
(已经无法继续下去了)被终止,并且从当前环境中弹出对异常对象的引用。此时,异常处理机制接管
程序,并开始寻找一个恰当的地方继续执行程序,
2
、捕获异常
在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(
exception handler
)。潜在的异常
处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出
的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的
方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适的异常处理
器,则运行时系统终止。同时,意味着
Java
程序的终止。
3
、异常处理五个关键字
try
--
用于监听。将要被监听的代码
(
可能抛出异常的代码
)
放在
try
语句块之内,当
try
语句块内发生异常
时,异常就被抛出。
catch
--
用于捕获异常。
catch
用来捕获
try
语句块中发生的异常。
fifinally
-- fifinally
语句块总是会被执行。它主要用于回收在
try
块里打开的物力资源
(
如数据库连接、网络
连接和磁盘文件
)
。只有
fifinally
块,执行完成之后,才会回来执行
try
或者
catch
块中的
return
或者
throw
语
句,如果
fifinally
中使用了
return
或者
throw
等终止方法的语句,则就不会跳回执行,直接停止。
throw
--
用于抛出异常。
throws
--
用在方法签名中,用于声明该方法可能抛出的异常。
处理异常
1
、
try -catch
try 里面存放可能放生异常的语句,,,通过catch捕捉,可以添加参数类型
try{
//code that might generate exceptions
}catch(Exception e){
//the code of handling exception1
}catch(Exception e){
//the code of handling exception2
}
3
、
throws
如果一个方法可以导致一个异常但不处理它,它必须指定这种行为以使方法的调用者可以保护它们自己
而不发生异常。
public
void
info
()
throws
Exception
{
//body of method
}
Exception
是该方法可能引发的所有的异常
,
也可以是异常列表,中间以逗号隔开。等到调用的时候用 catch捕捉
4
、
finally
当异常发生时,通常方法的执行将做一个陡峭的非线性的转向,它甚至会过早的导致方法返回。例如,
如果一个方法打开了一个文件并关闭,然后退出,你不希望关闭文件的代码被异常处理机制旁路。
finally
关键字为处理这种意外而设计。
不管try catch 是否执行,finally一定会执行
try, catch,fifinally ,return
执行顺序
1
.执行
try
,
catch
, 给返回值赋值
2
.执行
fifinally
3
.
return