Java的异常机制
Posted 款款就是我
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的异常机制相关的知识,希望对你有一定的参考价值。
一.什么是异常:非正常的,不同寻常的,不是语法错误。
生活中,医生说你身体某个部位异常,该部位和正常相比,有点不同功能可能受损。
张三开车去上班,正常情况下,顺利到达公司
非正常情况下,车子坏了,走路去公司
异常指的 不是语法错误 ,语法错误编译通不过,不会产生字节码文件,根本不能运行
程序中:代码出现错误,程序就会停止运行。
异常处理是衡量一门语言是否成熟的标准之一。主流的java c++ c# 都有异常处理机制。
异常处理可以让程序有更好的容错性,使代码更健壮。
传统的c语言是没有异常处理的,此时只能程序员通过使用方法的特定返回值来表示异常情况,并且使用if语句来判断正常和非正常的情况
没有异常机制存在的缺点:
1.使用方法的返回值表示异常的情况有限,无法穷举所有的异常情况
2.异常处理代码和业务代码混合在一起,增大的程序的复杂性
3.随着系统规模不断增大,程序的可维护性极低
二.异常体系
针对上述的情况,我们提出解决办法:
1.把不同类型的异常情况描述成不同的类(称之为异常类)
2.分离异常流程代码和正确流程代码
3.灵活处理异常,如果当前方法解决不了,我把异常交给别人来解决
-------
非正常情况出现后,程序会中断
Error:表示错误,一般指jvm相关的不可修复的错误,如系统崩溃,内存溢出,JVM错误等,由JVM抛出,我们不用处理。
Exception:表示异常,指程序中出现不正常情况,该问题可以修复(处理异常)
常见的exception:
NullPointerExeception空指针异常
ArrayIndexOutOfBoundsExeception 数组越界异常
数字格式化出问题
二.使用try catch捕获单个异常:
异常出现后,程序会中断,所以必须处理异常:
1.该方法不处理,而是声明抛出,由该方法的调用者来处理(throws)
2.在方法中使用try catch语句块来处理异常
使用try catch捕获单个异常,语法:
try{
编写可能出现异常的代码
}catch(异常类型 e){
处理异常的代码
打印异常信息
继续抛出异常
}
注意:try 和catch都不能单独使用
案例
三.获取和查看异常信息,Throwable类的方法
1.String getMessage() 获取异常的描述信息,原因(提示给用户的时候,就提示异常信息))
2.String toString() 获取异常的类型和异常描述信息
3.Void printStackTrace() 打印异常的跟踪栈信息并输出到控制台,不需要使用syso输出,它包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,经常使用这个方法。
注意:现在在catch语句块中,都写e.printStackTrace()
四.使用try-catch捕获多个异常:
一个catch语句,只能捕获一种异常,如果需要捕获多个异常,就得使用多个catch语句
try{
编写可能出现异常的代码
}catch(异常类型A e){
处理异常的代码//打印异常信息//继续抛出异常
}catch(异常类型B e){
处理异常的代码//打印异常信息//继续抛出异常
}
注意:
1.一个catch语句只能捕获一种类型的异常,如果需要捕获多种异常,就得使用多个catch语句
2.代码在一瞬间只能出现一种类型的异常,只需要一个catch捕获,不可能出现多个异常
案例:
五.Finally代码块:表示最终都会执行的代码,无论有没有异常
什么时候的代码必须最终执行:
当我们在try语句中打开了一些物理资源(磁盘文件/网络连接/数据库连接),我们都得在使用完之后,最红关闭打开的资源。
finally 的两种语法:
1.try...finally :此时没有catch来捕获异常,因为此时根据根据应用场景,我们会抛出异常,自己不处理
2.try...catch..finally :自身需要处理异常,最终还得关闭资源
注意:finally不能单独使用
当只有存在try或者catch中调用退出jvm的相关方法,此时finally才不会执行,否则finally永远会执行
System.exit(0);//退出jvm
注意:如果finally有return语句,永远返回finally中的结果,避免该情况
六.异常的分类:根据在编译时期还是运行时期取检查异常?
1.编译时期异常:checked异常,在编译时期,就会检查,如果没有处理异常,则编译失败
2.运行时异常:runtime异常,在运行时期,检查异常,在编译时期,运行异常不会被编译器检测(不报错)
注意:运行异常,在编译时期,可处理,可不处理
七.抛出异常:
throw:运用于方法内部,用于给调用者返回一个异常对象,和return一样会结束当前方法
throws:运用于方法声明上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)
throw语句:
运用在方法内部,抛出一个具体的异常对象
throw new 异常类型(“异常信息”):终止方法
throw
一般的,当一个方法出现不正常的情况的时候,我们不知道方法该返回什么,此时就返回一个错误,在catch语句块中继续向上抛出异常
Return是返回一个值,throw是返回一错误,返回给该方法
public static int dowork(int num1,int num2){ System.out.println("beging......."); if (num2 == 0){ System.out.println("有问题"); throw new ArithmeticException("被除数不能为0"); } System.out.println("-------------------------"); try{ int a =num1/num2; System.out.println(a+"aaaa"); return a; }catch(ArithmeticException e){ e.printStackTrace(); System.out.println("出异常了"); } System.out.println("end........."); return 0; } public static void main(String[] args) { try{ int ret=dowork(10,0); System.out.println(ret); }catch(ArithmeticException e){ System.out.println(e.getMessage()); } }
Throws语句
如果每一个方法都放弃处理异常直接通过throws声明抛出,最后异常会抛到main方法,main方法不出,继续抛出个jvm,底层的处理机制就是打印信息跟踪栈。
public static int dowork(int num1,int num2) throws Exception{ System.out.println("begin........."); if(num2==0){ System.out.println("有问题"); throw new Exception("被除数不能为0"); } System.out.println("----------------"); try{ int a=num1/num2; System.out.println(a+"aaaaa"); return a; }catch(ArithmeticException e){ e.printStackTrace(); System.out.println("出异常了"); } System.out.println("end........."); return 0; } public static void main(String[] args) throws Exception { dowork(10,0); }
以上是关于Java的异常机制的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.database.sqlite异常(代码片段