微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一文给你通俗易懂的讲解Java异常

这篇文章主要给大家介绍了关于Java异常的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

什么是异常?

最简单的,看一个代码示例:

public static void main(String[] args) { int a = 1; int b = 0; System.out.println(a / b); }

这段代码有什么问题?简单,除数不能为0对吧,我们打印输出

显而易见,程序出问题了,不能正常执行了,这里出现了一些爆红的信息,这些就是异常提示,这就是Java中提供的异常机制,当你的程序存在问题的情况下,会给你打印输出一些信息,这个就叫做异常信息

字面意思上去理解,所谓“异常”也就是“不正常”,放在代码程序中就是那些导致不能正确执行的问题,比如上述代码,Java就会给你打印出为啥此段代码不能正确执行,给你输出不正常的信息,这样你就可以根据异常信息修改代码,从而提高代码的健壮性!

详细聊聊异常

以上我们简单看了下一个具体的异常,下面我们就“何为异常”再直白的探讨一下,异常作为一种代码的处理机制,现在基本上大多数的编程语言都包含有这个异常机制,但是,我门熟知的伟大的C语言是没有异常处理机制的。

大多数的高级语言,比如Java,python,C++这些都包含非常完善的异常处理机制,既然有这个玩意,那自然有它的好处,一般来说吧,拥有异常机制可以是我们的代码

拥有更好的容错性

更加的健壮

那啥意思嘞?啥是容错性,啥又是健壮呢?

首先是容错性,这个通俗来讲,就是可承受错误的范围和概率,比如说我们的程序要是没有异常机制的话,那很多错误是无法承受的,可能一旦出现错误,就会导致我们的系统崩溃出大问题,这个带来的后果可能比较严重,但是具有异常机制,就可以帮助我们去处理一些错误,以至于即使出现错误也不会造成这么严重的后果。

那什么又是健壮呢?这个一般就是说我们的代码比较安全,不容易出现bug,基本上把该想到的情况都想到了,代码编写比较严谨,不容易出错,质量好,这个一般就可以说我们的代码比较健壮。

当然,以上只是我粗浅的理解,希望能够帮助大家对异常机制的理解。

那再来说异常,其实就是不好的东西,比如我们的代码有bug,程序出错等等,这些都是有可能发生的,谁也不能保证自己写的代码一定是正确的,对吧。

异常也就是代码中可能出现的意外情况,这就要求我们在编写代码的时候尽量考虑全面,但是即使你考虑的再全面也不可能将所有的意外情况都考虑进去,所以,实际当中意外情况会有发生的概率,对于这种我们无法考虑周到的意外情况,就需要我们的异常机制去处理了。

Java中的异常

接下来我们来看看Java中的异常,想必大家多多少少都会听说过这样一个异常叫做空指针异常,我们来看代码演示:

NullPointerException nullPointerException = new NullPointerException("空指针异常"); System.out.println(nullPointerException);

可以发现,在Java真实存在NullPointerException这个类,而我们可以通过这个类去创建具体的异常对象,比如这里的空指针异常对象,我们打印输出看看:

如此来看,在Java中,异常是以类的形式存在的,而且我们可以通过这些异常类去创建相应的异常对象,那么我们再来看这段代码

public static void main(String[] args) { int a = 1; int b = 0; System.out.println(a / b); }

这里会出现异常,其实实际上就是在运行到“ System.out.println(a / b);”的时候Jvm虚拟机就会在底层为我们创建出一个异常对象,从而将相关的异常信息打印输出

所以:

Java中异常是的的确确存在的类

Java的异常处理机制

接下来我们来说说Java的异常机制。我们还是来看上面那个代码,也就是这个:

public static void main(String[] args) { int a = 1; int b = 0; System.out.println(a / b); }

这段代码我们如果运行的话是会出错的,也就是这样:

这里会给到我们一个异常信息,告诉我们说除数不能为0,然后程序就自动退出了,接下来我们再为这段代码添加一个打印输出

很显然这里并不会执行后面的这句输出语句,因为前面已经出现异常程序退出了,但是如果我们要求这里的输出必须执行该怎么办呢?

在Java中是提供了相对应的异常处理机制的,以上在a/b的时候出现了异常,在Java中我们是可以通过如下的方式去捕获到这个异常的。

try-catch捕获异常

具体的操作就是使用try- catch去捕获我们的异常并作出相应处理,具体看代码

public static void main(String[] args) { int a = 1; int b = 0; try { System.out.println(a / b); } catch (Exception e) { System.out.println(e+":除数不能为0!"); } System.out.println("执行到这里……"); }

我们在之前已经说过,在Java中,异常是以类的形式存在的,在我们写的程序代码中,只要出现了异常,JVM就会给我们创建一个异常对象出来,这个时候,我们是需要对这个异常对象做处理的,如果你放任不管的话,最终导致的结果就是你的Java程序会退出

所以啊,有异常你不处理,你的程序就会退出,那咋办,处理啊,找到这个异常,处理它,那怎么找到呢?

我们可以使用try去包裹可能出现的异常代码,比如上述所讲的代码,在执行到a/b的时候可能出现异常,也就是b不能为0,这里简单说下,这里的a和b是我们提前定义还好的,如果是让用户输入a和b的值呢?

我们简单改写下代码

Scanner StringA = new Scanner(system.in); Scanner StringB = new Scanner(system.in); int a = Integer.parseInt(StringA.next()); int b = Integer.parseInt(StringB.next()); System.out.println(a/b); System.out.println("执行到这里……");

这里的意思是我们从键盘输入去获取这个a和b,那么当我们输入的是这样的a和b的时候执行是没什么问题的:

可是一旦用户不小心把b的值输成0,那么问题就来了:

所以这里绕了一圈就是告诉大家b/a这步操作是可能出现异常的,我们把这个操作叫做可能出现的异常代代码块,于是我们就可以使用try去操作这段代码

try { System.out.println(a / b); } catch (Exception e) { System.out.println(e+":除数不能为0!"); }

这里要注意的就是,这个try和catch是一起配合使用的,catch是捕获的意思,我们使用try包裹可能出现的异常代码快,然后使用catch去捕获这个异常对象,然后做出相应的处理,比如这里,我们使用try包裹了a/b的操作,那么当b不小心被赋值为零的时候,那么这里在运行的时候就会出现异常,由于在Java中异常是以类的形式存在,所以这里会抛出一个异常对象。

那么我们仔细看这个catch后面有个括号,就是异常对象参数,意思就是如果出现的这个异常对象属于我括号里的这个异常,那么就进入这个catch块去处理这个异常。

说白了就是,程序一旦出现异常,随之而来就是会产生一个异常对象,而异常是以类的形式存在,那么你就得为这个异常对象定义一个catch块,这个异常对象会根据catch后的参数去找属于自己的那一个catch块,找到就进入该catch块,没有的话程序就有因为异常而终止了。

而除数为0这是一个叫做ArithmeticException的异常,也就是算术异常,而这个异常是继承自Exception,也就是说Exception的范围比ArithmeticException要大,所以Exception的catch块可以处理身为子类的ArithmeticException异常。

异常类的继承

以上我们说了ArithmeticException这个异常是继承自Exception的,后者的范围更广,然后我们再看代码

try { System.out.println(a / b); } catch (ArithmeticException e) { System.out.println(e + ":除数不能为0!出现算术异常"); } catch (Exception e) { System.out.println(e+"出现异常"); }

也就是说,一个try下面可以对应多个catch块,而每一个catch都有自己对应的一个可以处理的异常类型,我们看上面的改进,我们添加了负责处理ArithmeticException的catch块,那么结果是如呢?

可以看到,这里是直接进入了ArithmeticException的catch块,也就是说,异常对象一旦被一个catch捕获,就不会再进入下一个异常了。

有人可能会说可以这样吗?

也就是把Exception放在第一个catch块,实际上这里是不行的,为啥?我们来看下再这里的一个异常继承关系:

可以看到,ArithmeticException其实是Exception的子类的,如果你把Exception放在第一个catch块的话那么所以的异常对象都将直接被这个catch块捕获,因为所有的异常对象都是Exception或者其子类的实例对象,这就很关键啊,意味着你后面定义再多的catch块也没有用啊,因为永远不会执行到这里,上面已经被Exception这个老大哥给截胡了,在Java中永远执行不到的代码就会被定义为错误的,所以是不能把Exception给放到第一个catch块的。

这里有这么一个原则:

先捕获处理小范围的异常,再捕获处理大范围的异常,也就是先小后大

意思也就是先把子类异常放在前面的catch块,这么以来,Exception的捕获基本上都是在最后一个catch了。

多异常的处理

这个是在Java 7之后增加的,也就是说啊在Java7之前嘞,一般来说一个catch块只能捕获处理一个异常,但是在Java7之后就升级了,可以一个catch块捕获处理多个异常。

那这个是怎么操作的呢?来看看代码就一目了然了:

是不是还是比较清楚的,这里的编写也很简单,就是通过符号“|”把不同的异常对象类型给分隔开,记住这里只需要在最后定一个异常就行,也就是这里的“e”,同时由于是捕获多个异常,这里的e其实是认final修饰的,因此就不能再对e进行任何赋值操作了,比如一下这样就是错误的:

这就是多个异常的捕获了。

获取异常信息

先明白这点:

当产生一个异常对象,被相对应的catch块捕获之后,这个catch块后的异常形参变量也就接受到了这个异常对象。

因此,我们就可以通过这个异常参数去获得一些异常信息,一般我们常用的一些方法如下:

getMessage():这个方法会返回异常的详细描述信息

printstacktrace():这个方法会打印出异常的跟踪栈信息

printstacktrace(PrintStream p):这个则会将异常的跟踪栈信息输出到指定的输出流中去

getgtacktreace():返回异常的跟踪站信息

那具体的访问,我们看下代码便知:

这里其实也比较简单,就是几个常见的异常信息获取方法的使用。

finally

这个可以说叫做善后的,啥意思嘞?简单来说,就是你的异常对象无论进入哪个catch块执行,那么到最后这个finally里的代码一定会被执行。

这个一般用在哪里呢?通常被用于释放资源,一般比如说数据库连接操作,网络连接或者常见的IO流的操作,这些就需要进行资源的回收,那么这个时候就可以使用finally里,因为它必定会被执行。

看到这里不知道大家有没有疑惑啊,不是说Java会自动回收资源吗?这个感觉要手动操作啊,这里其实你要区分资源的分类,Java的垃圾回收针对的堆内存中的对象所占用的内存,而这里说的IO流操作,数据库连接什么都是属于物理资源,而物理资源必须是需要手动回收的。

看看代码

这个时候我们看异常的处理就比较完整了,也就是包括try,然后是catch,再加上一定会被执行的finally块。

那么这里就需要特别说一下了:

对于异常处理来说,try块是必须的,没有try块啥也不是,而catch和finally则不是必须的,但是,也必须选择其一,也就是说,你不能只有个try,既没有catch也没有finally,然后就是注意catch块了,可以有多个,但是要遵循“先小后大”的原则

接下来我们来看个测试,看代码

我们在这里加入了return语句,一般来说吧,只要程序的方法中碰到了return,那么就会立即结束该方法,但是现在呢?我们看下结果:

这说明,finally语句一定会被执行!另外再给大家说一个注意点:

如果你在finally中定义了return语句,那么这个将导致你在try中定义的return语句失效,所以记住一点,不要在finally中使用return哦。

到这里我们清楚了,对于finally语句来说是一定会被执行的(其实有例外,比如你调用了System.exit(1)退出虚拟机),我们常在finally中去做释放资源的操作,但是你有没有发现,这样的操作觉得比较麻烦上一篇:SpringBoot+netty-socketio实现服务器端消息推送下一篇:Springboot项目保存本地系统日志文件实现方法

热门搜索

支持向量机最通俗易懂 

运算放大器通俗讲解 

Java异常 

交易异常 

java异常处理 

相关文章

一文给你通俗易懂的讲解Java异常

2021-10-12阅读(7955)评论(0)推荐()

这篇文章主要给大家介绍了关于Java异常的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学...

一篇文章带你深入了解Java异常

2021-11-05阅读(4780)评论(0)推荐()

本篇文章主要介绍了java异常处理机制及应用,异常处理机制是Java语言的一大特色。从异常处理的机制、异常处理的方法、异常处理的原则等方面介绍Java语言的异常...

讲解ssm框架整合(最通俗易懂)

2021-10-11阅读(3780)评论(0)推荐()

这篇文章主要介绍了讲解ssm框架整合(最通俗易懂),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学...

Java通俗易懂系列设计模式之模板模式

2021-10-12阅读(9318)评论(0)推荐()

这篇文章主要介绍了Java通俗易懂系列设计模式之模板模式,想了解设计模式的同学,可以仔细看一下

Java通俗易懂系列设计模式之装饰模式

2021-10-11阅读(5714)评论(0)推荐()

这篇文章主要介绍了Java通俗易懂系列设计模式之装饰模式,对设计模式感兴趣的同学,一定要看一下

java异常继承何类,运行时异常与一般异常的区别(详解)

2021-09-19阅读(6692)评论(0)推荐()

下面小编就为大家带来一篇java异常继承何类,运行时异常与一般异常的区别(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Java通俗易懂系列设计模式之策略模式

2021-10-12阅读(7150)评论(0)推荐()

这篇文章主要介绍了Java通俗易懂系列设计模式之策略模式,对设计模式感兴趣的同学,一定要看一下

取消

有人回复邮件通知

提交评论

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐