简述java异常处理机制_java异常处理机制的理解
参考《第⼀⾏代码java》《java程序设计教程》
java中程序的错误有语法错误、语义错误。如果是语法性错误,在编译时就可以检查出来并解决。语义错误是在程序运⾏时出现的,在编译时没有错误,但在运⾏时可能会出现错误导致程序退出,这些错误称为异常。在没有异常处理的情况下,也即默认情况下,程序出现异常后会打印异常信息,同时终⽌执⾏异常之后的代码。为了让程序在出现异常后仍然可以正常执⾏完毕,必须引⼊异常处理语句完善代码。因此,异常处理机制⽤于检测和处理异常,提⾼java程序的健壮性。
在java中,所有的异常都当做对象处理,即当发⽣异常时产⽣了异常对象。java异常处理机制的语法为:
try{
//可能出现异常的语句
}catch(异常类型 对象){
//异常处理
}finally{
//不管是否出现异常,仍会统⼀执⾏的代码
}
try语句⽤于捕获可能出现异常的代码。catch语句根据不同的异常类型进⾏不同的异常处理,因此⼀个try语句可以对应多个catch语句。如果try语句中产⽣异常,程序会跳转到匹配异常类型的catch语句中,进⾏异常处理。不管程序是否产⽣异常,都会执⾏finally语句。finally 语句可以省略。如果省略了finally语句,程序在执⾏完catch语句后,会继续向下执⾏。
catch语句和finally语句可以省略,但是不能同时省略。异常格式的组合通常有如下三种:atch, finally, finally。
异常的继承结构
在java中,所有异常类型最⾼继承类是Throwable。Throwable下⾯有两个⼦类Error和Exception。java的异常⼦类命名都会使⽤***Error 或***Exception的形式,开发者可以根据这个特征进⾏区分Error和Exception。
Error是JVM错误,属于不可查错误。出现Error时程序因⽆法处理,没有执⾏。
Exception是程序运⾏中的错误,⽤户可以使⽤异常处理格式处理。异常分为可查异常和不可查异常。
不可查异常是在运⾏中出现的异常。这类异常在编译中可能出现,也可能不出现,所以在程序中可以选择处理这类异常,或者选择不处理。RuntimeException和其⼦类属于不可查异常。
可查异常是在编译时被强制检查的异常。这种异常可以预见,因此必须在程序中进⾏处理,或进⾏捕获和处理,或抛出给上⼀级调⽤⽅法处处理。否则,编译将⽆法通过。RuntimeException以外的异常都属于可查异常。
public Throwable getCause() //返回Throwable对象的原因。
public String getMessage() //返回Throwable对象的详细信息
unknown怎么处理
public void printStackTrace() //将此Throwable对象的堆栈跟踪输出⾄错误输出流,作为的值
异常的处理流程
1、当程序出现异常,JVM⾃动根据异常的类型实例化⼀个与之类型匹配的异常类对象。
2、根据异常对象判断是否存在异常处理。如果不存在异常处理,则由JVM对异常默认处理:输出异常信息,结束程序调⽤。
3、如果存在异常捕获操作,try语句捕获异常类实例化对象,再与catch语句进⾏异常类型匹配,并处理异常。
4、不管是否匹配到catch语句,如果存在finally语句,就会执⾏finally语句代码。
5、finally语句后⾯的代码根据之前是否匹配到catch语句进⾏处理。如果匹配到catch语句,也即捕获到异常,则继续执⾏finally后的语句。如果没有匹配到catch语句,则将异常交由JVM默认处理。
异常捕获是⼀个异常类对象的传递过程,所有异常类对象都可以相⽗类对象转型。因此可以异常类对象可以使⽤Exception接收,简单实现异常处理。
对于异常分开处理还是⼀起处理的问题,没有严格的规范,⽽是根据项⽬开发标准决定。异常分开处理便于代码的维护,统⼀处理则可以节省开发精⼒。
在处理多个异常时,范围⼩的异常要放在范围⼤的异常之前处理。否则,范围⼩的异常会因异常处理完成⽽⽆法处理。
throws关键字
throws关键字⽤在⽅法的定义上,表⽰此⽅法不进⾏异常的处理,⽽是交给被调⽤处处理。
myMath.java
class myMath{
public static int div(int x, int y) throws Exception{ //该⽅法不处理异常
return x/y;
}
}
exception_throws.java
public class exception_throws{
public static void main(String args[]){
try{ //div()⽅法抛出异常,这⾥必须明确处理异常
System.out.println(myMath.div(10,0));
}catch(Exception e){
e.printStackTrace();
}
}
}
throw关键字
throw关键字⽤于⽤户⼿动抛出⼀个异常类实例化对象。
exception_throw.java
public class exception_throw{
public static void main(String args[]){
try{
throw new Exception("self-defined exception"); //直接抛出⾃定义异常类对象
}catch(Exception e){
e.printStackTrace();
}
}
}
异常处理的标准格式
除在上⾯提到的三种异常组合格式,还有⼀种是finally结合throw和throws的异常处理格式。class myMath{
public static int div(int x, int y) throws Exception{ //出现异常交给被调⽤处输出
System.out.println("===start===");
int result = 0;
try{
result = x / y;
}catch(Exception e){
throw e; //向上抛出
}finally{
System.out.println("===end===");
}
return result;
}
}
public class exception_standerd{
public static void main(String args[]){
try{
System.out.println(myMath.div(10,0)); //被调⽤处处理异常
}catch(Exception e){
e.printStackTrace();
}
}
}
在本例中,也可以将myMath.java中的catch语句省略。myMath.java中的try语句捕获的异常通过div()⽅法抛出给调⽤处处理。
RuntimeException类
RuntimeException的⼦类对象可以根据⽤户需要进⾏有选择的处理,程序在编译时不会强制性要求⽤户处理异常,所以在调⽤时不处理也不会有任何编译错误。如果没有处理却发⽣异常,则交给JVM默认处理。
例如Integer类中的parseInt()⽅法
public static int parseInt(String s) throws NumberFormatException;
异常类NumberFormatException属于RuntimeException⼦类。使⽤parseInt()时可根据需要处理Runtime⼦类异常。
public class exception_RuntimeException{
public static void main(String args[]){
int temp = Integer.parseInt("100");
System.out.println(temp);
}
}
assert关键字
assert在JDK1.4时候引⼊的,通常⽤于程序不准备使⽤捕获异常来处理的错误。其功能是在程序执⾏到某⾏后,判断是否是预期的结果。断⾔的语法格式:
assert 布尔表达式
assert 布尔表达式:字符串表达式
java默认没有开启断⾔功能。因此程序正式执⾏时不⽤去除断⾔语句。在执⾏解释java字节码⽂件时,增加参数“-ea”,开启断⾔功能。
java -ea exception_assert
public class exception_assert{
public static void main(String args[]){
int num = 10;
assert num == 20 : "num isn't 20";
System.out.println("num = " + num);
}
}
⾃定义异常
当java提供的异常类型不能满⾜开发需要时,可以⾃⼰开发⼀个异常类。实现⾃定义异常类,只需要继承Exception或RuntimeException ⽗类即可。
class AddException extends Exception{
public AddException(String msg){
super(msg);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。