Java 异常机制
Java 异常机制
- 什么是异常
异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程 - 为什么要有异常
- 什么出错了
- 哪里出错了
- 为什么出错了
- 通过异常可以降低错误处理代码的复杂度
- 异常的结构
主要是两大类错误 error和异常exception 它们均继承自Throwable
- Error 表示不希望被程序捕获或者是程序无法处理的错误。 比如StackOverflowError经常由递归操作,向这样类型的操作是jvm错误我们是无法挽回的。
- Exception 错误是假设程序猿们回去处理这些异常例如 数据库连接错误 网络连接错误,Exception也分为两种检查类型(checked)和未检查类型(unchecked)、
- 检查型的需要强制加try catch语句
- 非检查型的没有这些限制
4.异常的处理机制
Java异常处理的本质是抛出异常和捕获异常
-
抛出异常 由上层代码进行处理
if(object== null){ throw new NullPointerException(); }
-
捕获异常 捕获之后由当前catch中的代码块进行操作
try{ //做一些可能出现异常错误的操作 }catch(Exception e){ //对异常之后进行操作 }finally{ //无论是否出现异常都会经过这里 }
下面通过一次从磁盘中读取一个文件来演示一遍完整的异常捕获
void fun(){
int count=0;
InputStreamstreamReader = null;
try{
streamReader=newFileInputStream(new File("test.txt"));
while(streamReader.read()!=-1) {
count++;
}
}catch (IOException e) {
e.printStackTrace();
}finally{
try{
if(streamReader != null){
streamReader.close();
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
上面我们只是获取到Java的异常且对其进行了处理,但是我们也可以获得异常之后不进行处理进行抛出
有关抛出的有两个异常抛出关键字有两个 throw和throws 现在咱们就对其进行分析。
-
throw 程序执行完throw语句之后立即停止;throw后面的任何语句不被执行,最邻近的try块用来检查它是否含有一个与异常类型匹配的catch语句。
void fun(){ try{ throw new NullPointerException(); }catch(NullPointerException e){ throw e; } } void fix(){ try{ fun(); }catch(NullPointerException e){ System.out.println("Recaught: "+e); } }
-
throws 表示一个方法可能会抛出异常,但是这个方法不对它进行处理而是向上抛出,这样这个方法的调用者保护它自己而不发生异常。
代码示例public void fun() throws Exception{ // 做一些可能会出现异常的操作 }
根据上面那个示例来进行更改来演示throws
void fun() throws Exception{
//操作可能出现异常
throw new NullPointerException();
}
void fix(){
try{
fun();
}catch(NullPointerException e){
System.out.println("Recaught: "+e);
}
}
异常使用指南
- 在多重Exception之后再加一个Exception的来防止异常遗漏
- 对于调用不确定是否出现错误的方法,用try将代码块包住。处理潜在的异常
- 尽量处理异常而不是就catch住然后打印错误信息
- 根据已有的业务逻辑来对异常进行异常逻辑操作
- 在一些时候尽量使用finally去释放占用的资源