概述
文章目录
- Error(错误)
- Exception
- 常见的Exception
- 异常的处理
- try-catch-finally
- throws和throw
- final、finally、finalize 的区别
在Java当中,所有的异常都有一个共同的祖先java.lang包中的Throwable类。
Throwable:当中有两个重要的子类:Exception(异常)和Error(错误)。二者都是Java异常处理的重要子类,各自都包含有大量的子类。其中最为重要的两个子类:Exception(异常)和Error(错误),二者都是Java当中异常处理的重要子类。
Error(错误)
这个是程序无法处理的错误,表示运行应用程序中较为严重的问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM出现的问题。
例如:Java虚拟机运行时错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机一般会选择线程终止。
这些错误表示故障发生于虚拟机自身,或者发生在虚拟机视图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它的应用程序来说,即使确实发生错误,本质上也不应该视图去处理它所引起的异常状况,在Java中,错误是通过Error的子类来描述的。
Exception
表示程序可以处理的异常,可以捕获且可能恢复,遇到这类异常,应该尽可能处理异常,是程序恢复允许,而不应该随意终止异常。
异常又分为编译期异常和运行时异常。
编译期异常通常是会在编译期间就会对我们写的代码进行一个校验,提示。
运行时异常是代码在执行的时候,遇到异常,在会给我们进行报错。
常见的Exception
java.lang.NullPointerException 空指针异常;
出现原因:调用了未经初始化的对象或者是不存在的对象。
java.lang.ClassNotFoundException 指针的类找不到
出现原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引起异常。
java.lang.NumberFormatException 字符串转数字异常
出现原因:字符串数据中包含非数字型字符
java.lang.IndexOutOfBoundsException 数字角标越界异常
出现原因:常见于操作数组对象时发生
java.lang.illegalArgumentException方法传递参数错误
java.lang.ClassCastException 数据类型转换异常
java.lang.NoClassDefFoundException 未找到类定义错误
SQLException SQL异常,常见于数据库时的SQL语句错误
java.lang.InstantiationException 实例化异常
java.lang.NoSuchMethodException 方法不存在异常
异常的处理
try-catch-finally
try块:用于捕获异常。其后可以接0个或者多个carch块,如果没有catch块,则就必须跟一个finally块。
catch块:用于处理try捕获到的异常。
finally块:无论是否捕获或处理异常,都会执行finally块里面的语句。
但是当在try块或catch块里面遇到return语句时,finally语句块也就将不会在执行的。
但是finally也会有不执行的时候:
- 当在finally语句块第一行发生异常的时候,也就不会向下执行了
- 在前的代码里面使用了System.exit(int)表示已经退出来程序。exit是带参的函数;若该语句在异常语句之后,finally就会执行了。因为异常出现,表示在try块里面异常之后的代码以及停止执行了。
- 程序所在的线程会死亡。
- 关闭CPU
注意: 当 try 语句和 finally 语句中都有 return 语句时,在⽅法返回return之前,finally 语句的内容将被执⾏,并且 finally 语句的返回值将会覆盖原始的返回值直接返回出去的,不在执行try里面的return语句。如下:
当然上面例子当中的try-finally语句也是可以书写的,在当中没有做异常处理,所以当发生异常的时候,执行finally里面的语句,然后抛出异常。
throws和throw
throws是用于方法的声明处,用来声明该方法可能发生的异常类型,也可以多个异常的类型,让它的 使用者都知道需要捕获的异常都有哪些类型。
它表示出来的异常只是表示是一种可能性,并不一定发生的。
当然的在抽象方法当中也是可以使用throws关键字的
和try-catch的意义一样,对异常的处理,throws是表示将异常抛给调用它的父类来解决这个异常的。
import java.io.UnsupportedEncodingException;
public class Demo02 {
public static void main(String[] args) {
try {
demo1();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static void demo1() throws UnsupportedEncodingException {
String s = "星辰与晨曦";
s.getBytes("gbk");
}
}
一般的位于底层的代码都是选择向上进行抛出
throw是用于方法当中,用来抛出一个实际的异常对象,由方法体内的语句进行执行。
在使用throw的时候也要注意到,在使用后要么使用try-catch捕获异常,要么使用throws来声明一下异常。
它表示的是具体向外抛出的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常
用throw也可以理解为自己根据自己所写的需求,来抛出一个异常。
final、finally、finalize 的区别
final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。
finally:异常处理语句结构的一部分与try-catch搭配使用,表示不管异常怎么执行,finally里面的语句都是要执行的。
finalize:是Object 类的一个方法,在学到jvm的时候,就很明确了。
在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用。(相对应的是,这个finalize依靠线程,随线程就灭了,所以它是极不可靠的,所以不建议使用)
最后
以上就是兴奋魔镜为你收集整理的Java中的异常处理Error(错误)Exception异常的处理final、finally、finalize 的区别的全部内容,希望文章能够帮你解决Java中的异常处理Error(错误)Exception异常的处理final、finally、finalize 的区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复