怎么处理Java中的异常

发布时间:2021-11-01 15:26:33 作者:iii
来源:亿速云 阅读:126

这篇文章主要讲解了“怎么处理Java中的异常”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么处理Java中的异常”吧!

异常与error介绍

下面还是先让我们来看一下基本概念吧!

 异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。异常机制本质就是当程序出现错误,程序安全退出的机制。在Java的异常处理机制中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。

Java是采用面向对象的方式来处理异常的。处理过程:

让我们来看看前面所讲到的异常类究竟是个什么东西!

其实所有的异常对象都是派生于Throwable类的一个实例。如果内置的异常类不能够满足需要,还可以创建自己的异常类。所有异常的根类为java.lang.Throwable。看看它的家族长什么样。

怎么处理Java中的异常

Throwable类下面主要是两大门派:Error和Exception。

RuntimeException和 CheckedException异同

首先我们先来看看什么是运行时异常。

这类异常通常是由编程错误导致的,所以在编写程序时,并不要求必须使用异常处理机制来处理这类异常,而是经常需要通过增加“逻辑处理来避免这些异常”。

比如以下常见的几种异常:

这里再补充两点,方便大家更好的理解java异常的机制和处理过程。

上面我们讲述了什么是运行时异常以及一些处理方式,下面就再来看看什么是已检查异常吧!

所有不是RuntimeException的异常,统称为Checked  Exception,又被称为“已检查异常”,如IOException、SQLException等以及用户自定义的Exception异常。  这类异常在编译时就必须做出处理, 否则无法通过编译。

通常异常的处理方式有两种:

下面就来详细的聊聊吧!

异常的处理

上面已经提了,异常处理通常有2种方式。先看看捕获异常吧。

捕获异常是通过3个关键词来实现的:try-catch-finally。用try来执行一段程序,如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它,最后一步是通过finally语句为异常处理提供一个统一的出口,finally所指定的代码都要被执行。

这个捕获异常其实也是我们在面试的时候会经常碰到的问题。下面我们分别再来对各个部分做一个简单的提示吧!

(1) try

一个try语句必须带有至少一个catch语句块或一个finally语句块  。当异常处理的代码执行结束以后,不会再回到try语句去执行尚未执行的代码。

(2) catch

每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。在此介绍一些常用的方法,这些方法均继承自Throwable类  。

这里有一个需要特别注意的地方,那就是catch捕获异常时的捕获顺序:

如果异常类之间有继承关系,在顺序安排上就需注意。越是顶层的类,越放在下面,再不然就直接把多余的catch省略掉。  也就是说先捕获子类异常再捕获父类异常。

(3) finally

finally语句块中始终都要执行,除了遇到了System.exit(0)结束程序运行。针对这个特性,所以我们通常在finally中关闭程序块已打开的资源,比如:关闭文件流、释放数据库连接等。

即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。

在这里就有一道非常经典的一个面试题。

public class Test {     public static void main(String[]args) {        System.out.println(new Test().test());;     }     static int test(){        int x = 1;        try{           retun x;        }finally{           System.out.print("jdbk"+ ++x);        }     } } // 问输出结果?

先解释哈这里存在的玄妙吧!

看了上面的讲述,我们都知道了当try和catch中有return时,finally仍然会执行,所以正常逻辑来说此题的答案应该是“jdbk2  2”,但这里存在一个陷阱,那就是:

finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保  存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是  在finally执行前确定的。因此正确答案应该是:“jdbk2 1”。

还有一点需要注意的就是:finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

接下来再来讲讲声明异常吧,它相对来说就比较简单了。

在一些情况下,当前方法并不需要处理发生的异常,而是向上传递给调用它的方法处理。如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开。

public static void readFile(String fileName) throws FileNotFoundException,IOException { }

需要注意的地方就是:

自定义异常

我们为什么要自定义异常?还不是因为在程序中,可能会遇到JDK提供的任何标准异常类都无法充分描述清楚我们想要表达的问题。此时我们就可以创建自己的异常类,即自定义异常类。

那我们怎么自定义异常类呢?相信你看了上面的异常类的家族图应该就猜到了。不错,自定义异常类只需从Exception类或者它的子类派生一个子类即可。如果你继承Exception类,则为受检查异常,必须对其进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类。通常我们自定义异常类应该包含2个构造器:一个是默认的构造器,另一个是带有详细信息的构造器。这里举一个例子。

/**IllegalAgeException:非法年龄异常,继承Exception类*/ class IllegalAgeException extends Exception {     //默认构造器     public IllegalAgeException() {      }     //带有详细信息的构造器,信息存储在message中     public IllegalAgeException(String message) {         super(message);     } }     public void setAge(int age) throws IllegalAgeException {         if (age < 0) {             throw new IllegalAgeException("人的年龄不应该为负数");         }         this.age = age;     }

最后给大家讲述一点使用异常机制的建议:

感谢各位的阅读,以上就是“怎么处理Java中的异常”的内容了,经过本文的学习后,相信大家对怎么处理Java中的异常这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. Java中的异常处理
  2. java如何处理异常

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Java中void的用法和意义是什么

下一篇:怎么用Java将PPT文档标记为最终状态

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》