Java异常处理机制,java异常处理
Java异常处理机制,java异常处理
本文总结的是Java的异常处理机制,其它语言的异常处理与Java的思想是一致的,细节可以自行百度一下。接下来会按照以下目录来总结以下Java异常处理机制。
目录
Java异常分类
Java中异常处理过程
总结
Java中常见的异常处理类
Java中常见的异常处理函数
Java中抛出异常
throws
throw
用户自定义异常
Java异常分类
Java异常分两大类,Error和Exception,其中这两个类都是Throwable 类的子类。
Error类:严格地说Error类不属于异常,它是错误,但这里先归为异常里面,Error表示系统级的错误,是java运行环境内部错误或者硬件问题,例如,JVM 内存溢出等。,它是Java虚拟机抛出的。
Exception异常类:表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序必须处理的问题。其中Exception异常类又分为运行时异常(Runtime Exception)和检查性异常(Checked Exception)。
运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略,运行时异常在代码中不一定要求捕获或者抛出。一般运行时异常有空指针,数组越界等。
检查性异常(重要):最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。因此检查性异常必须要处理。
Java中异常处理过程
我们会将可能会出现异常的代码放到try语句块中,如果有异常出现通过catch来截获并进行解决处理异常,最后一个选择的通过finally语句块来执行一段代码。
接下来按照种情况介绍程序执行的顺序
1.不会出现异常的try{}catch(){}finally{}
try{
代码块1
}catch(异常1 e){
代码块2
}catch(异常2 e){
代码块3
}finally(){
代码块4
}
运行顺序是:代码块1 -> 代码块4
2.不会出现异常的try{}catch(){}
try{
代码块1
}catch(异常1 e){
代码块2
}catch(异常2 e){
代码块3
}
运行顺序是:代码块1
3.会出现异常的try{}catch(){}finally
try{
代码块1
}catch(异常1 e){
代码块2
}catch(异常2 e){
代码块3
}finally(){
代码块4
}
运行顺序是:代码块1 -> 代码块2或代码块3(主要根据产生的是哪个异常)-> 代码块4
4.会出现异常的try{}catch(){}
try{
代码块1
}catch(异常1 e){
代码块2
}catch(异常2 e){
代码块3
}
运行顺序是:代码块1 -> 代码块2或代码块3(主要根据产生的是哪个异常)
总结
因此可以看出无论发不发生异常,如果有finally代码块,都会执行finally代码块的内容。如果在try、catch、finally都中出现return语句呢,那执行的顺序变为以下几种情况:
1.没有异常抛出的时候并且try和finally都有return语句:执行到try语句块中的return语句时,系统会将return的值存储到一个变量中,然后跳过catch去执行finally里的代码,执行完finally代码返回finally里面的return返回的值。
2.没有异常抛出的时候并且只有try有return语句:执行到try语句块中的return语句时,系统会将return的值存储到一个变量中,然后跳过catch去执行finally里的代码,执行完finally代码,最后返回try语句块中的那个return的值,也就是执行完try时系统存的那个变量值。
3.有异常抛出的时候并且try、catch和finally都有return语句:执行到try语句块时抛出异常,进入catch语句块中,执行catch语句块,系统会将catch中的return的值存储到一个变量中,然后去执行finally里的代码,执行完finally代码返回finally里面的return返回的值。
4.有异常抛出的时候并且try和catch有return语句:执行到try语句块时抛出异常,进入catch语句块中,执行catch语句块,系统会将catch中的return的值存储到一个变量中,然后去执行finally里的代码,执行完finally代码,最后返回catch语句块中的那个return的值,也就是执行完catch时系统存的那个变量值。
Java中常见的异常处理类
常见的异常处理
异常 介绍 ArithmeticException 当出现异常的运算条件时,抛出此异常。 ArrayIndexOutOfBoundsException 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。 ArrayStoreException 试图将错误类型的对象存储到一个对象数组时抛出的异常。 IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 StringIndexOutOfBoundsException 此异常由 String
方法抛出,指示索引或者为负,或者超出字符串的大小。
Java中常见的异常处理函数
异常处理函数 | 介绍 |
public String getMessage() | 返回关于发生的异常的详细信息。 |
public Throwable getCause() | 返回一个Throwable 对象代表异常原因。 |
public String toString() | 使用getMessage()的结果返回类的串级名字。 |
public void printStackTrace() | 打印toString()结果和栈层次到System.err,即错误输出流。 |
Java中抛出异常
throws
有的时候我们在封装某一个函数时,可能不想自己去捕获异常,这时我么可以通过throws来抛出异常,之后由使用该函数的人来捕获异常。当我们通过throws来抛出异常时,我么将throws语句写在方法体的尾部。
public void throwsFunction()throws IOException,ClassCastException{
//方法体,这里不需要再写try{}catch(){}来捕获异常了
}
throw
有时我们需要自己抛出异常并进行处理,这时可以使用throw来抛出异常再通过catch来捕获并解决异常或者直接通过throws抛出该异常。
public int divideFunction(int x,int y){
if(y==0){
try{
throw new ArithmeticException();
}catch(ArithmeticException e){
System.out.println("除数不能为0");
return 0;
}
}
else{
return x/y;
}
}
用户自定义异常
有时我们需要自己定义异常类,我们定义的一场类都会继承自Throwable的子类,如果想定义运行时异常我们就将我们定义的异常类继承Runtime Exception,当然我们一般都会定义检查性异常类,这时我们必须继承Exception类。
相关文章
- 暂无相关文章
用户点评