说到异常,大家都熟悉,只要程序出错了,那么肯定会说:“哎呀,我的程序出错啦~它抛出异常啦”。

但单单以“异常”的名称来称呼它们,未免也太粗糙了。我们毕竟是一个精致的程序员,当然得知道他们到底都有哪些种类啦。这就好比一个优质的男朋友(比如本帅博主)必须能够精准地区分女朋友的口红色号一般。

那Java到底有哪些异常呢?

其实也不多,Java提供了两种错误的异常类,分别是Error和Exception,它们的爸爸(即父类)都是Throwable,从这个角度来看,它们也算的上是亲兄弟啦。

但哪怕是兄弟,那也会有差别。那么咱们就来看看这两兄弟都有区别。

1.Error

Error,看名字就知道,这个错误肯定不会小,事实上也的确是如此,Error表示程序在运行期间出现了非常严重的错误,并且该错误是不可恢复的。

这个错误到底有多严重呢?“Error属于JVM层次的错误”。

JVM我们都知道,代码的顺利运行时离不开JVM这位大佬的。当JVM层次出现错误,那铁定会导致程序终止运行。此外,编译器不会检查Error是否被处理了,所以呀,在程序中我们不推荐去捕获Error类型的异常,主要的原因就是运行时异常大多都是逻辑错误导致的,它属于应该解决的错误,也就是说,一个正常的程序中是不应该存在Error的。像我们平常经常遇见的OutOfMemoryError、ThreadDeath等都是属于Error的,当这些错误发生的时候,JVM基本上都会选择让程序终止。

怎么理解上面的话呢,举个例子。假如咱们在面试的时候,和面试官爆发了语言上乃至身体上的冲突,这种错误就是Error,出现这种错误,面试铁定得中断了呀,毫无疑问的,咱们这次面试肯定也就凉凉了。对方不需要知道你在这件事情发生之后有没有进行反省或者挽救,反正你这回面试就是凉了,再怎么补救都没有用。我们只能放弃这次面试,改过自新,争取在下一次面试的时候不再出现这样的Error,这样才有可能让面试顺利进行,而不被中断。

所以呀,无论是写代码还是做别的事情,咱们都得谨慎,因为一旦出现了Error,无论咱们怎么补救,对本次程序运行或者事情都是无济于事的。

2.Exception

上面说到Error是一个超级重大的错误,那么作为它的兄弟,或多或少在这一方面会对Error的强硬有一些弥补。

Exception表示的是可恢复的异常,是编译器可以捕捉到的,而这家伙有包含这两种类型:检查异常恶化运行时异常。

(1)检查异常

检查异常是在程序中最经常碰到异常,所有继承自Exception并且不是运行时异常的异常都是检查异常,比如咱们最常见的IO异常和SQL异常。这种异常都发生在编译的阶段,Java编译器强制程序去捕获此类型的异常,即它会把可能会出现这些异常的代码放到try块中,把对异常的处理代码放到catch块中。这种异常一般在如下几种情况中使用:

  • 异常的发生并不会导致程序出错,进行处理之后可以继续执行后续的操作,比如,连接数据库失败之后可以重新连接之后再进行后续操作。
  • 程序依赖于不可靠的外部条件,比如系统IO。

(2)运行时异常

运行时异常不同于检查异常,编译器没有强制对其进行捕获并处理,如果不对异常进行处理,那么当出现这种异常的时候,会由JVM来处理,比如NullPointerException异常,它就是运行时异常。

在Java语言中,最常见的运行时异常包括NUllPointerException(空指针异常)、ClassCastException(类型转换异常)、ArrayIndexOutOfBoundsException(数组越界异常)、ArrayStoreException(数组存储异常)、BufferOverflowException(缓冲区溢出异常)、ArithmeticException(算术异常)等。

出现运行时异常之后,系统一般会把异常一直往上层抛,知道遇到处理代码位置,如果没有处理代码,那就一直抛到最上层;如果是多线程就会用Thread.run()的方法抛出;如果是单线程就用main()方法抛出。抛出之后呢,如果是线程,那么这个线程也就退出了,如果是主程序抛出的异常,那么这个主程序也就退出了。所以说,如果不对运行时的异常进行处理,后果也是非常严重的,一旦发生这种异常,要么是线程中止,要么就是主程序终止。

不过,在进行异常处理的时候,还需要注意一下几个问题:

(2.1)Java异常处理用到了多态的概念,如果在异常处理过程中,先捕获到了基类,然后再捕获子类,那么捕获子类的代码永远都不会被执行。因此,在进行以后才那个捕获的时候,正确的方法是先捕获子类,然后再捕获基类的异常信息。

错误示例如下:

try{//access db code
}catch(Exception e2)
{//deal with this exception
}catch(SQLException e1)

那要怎么写呢,如下:

try{//access db code
}catch(SQLException e1)
{//deal with this exception
}catch(Exception e2)

(2.2)我们要尽早地抛出异常,同时对捕获的异常进行处理,或者从错误中恢复,或者让程序继续执行。咱们程序员得时刻记住,对捕获的异常不进行处理是一个非常不好的一贯,这样将非常不利于调试。但是,也不是抛出的异常越多越好,对于有些异常,比如运行时异常,实际上根本不必处理。

(2.3)可以根据实际的需求自定义一场类,这些自定义的一场类只要是继承自Exception类即可。

(2.4)异常能处理就处理,不能处理就抛出,对于一般异常来说,如果不能进行有效的处理,最好转换成为运行时异常抛出。而对于最终没有被处理的异常,JVM会进行处理。

关于检查异常和运行时异常,我们来看一个例子:

public class ExceptionTypeTest {public void doSomething()throws ArithmeticException{System.out.println("this is doSomething");}public static void main(String[] args) {// TODO Auto-generated method stubExceptionTypeTest ett=new ExceptionTypeTest();ett.doSomething();}
}

大家猜猜,这段程序可以编译通过吗?

我们来试一试。

上图表示这是可以的。那么,如果咱们更换一下异常的种类,将ArithmeticException换成IOException异常呢?

可以看到代码会提示错误。如果强行执行的话,将报错,如下图。

为什么ArithmeticException可以编译通过,而IOException不可以呢?因为前者属于运行时异常,编译器没有强制对其进行捕获并处理,因此编译可以通过。而IOException属于检查异常,编译器会强制去捕获此类型的异常,如果不对异常进行捕获的话将会有编译错误。

因此,我们只要捕获一下异常就可以了 用try-catch或者throws即可。如下图:

方法一:

方法二:

运行结果如下:

3.总结

Error:是JVM(java虚拟机)中出现的不可恢复的错误。
 Exception:是类发生的异常,又具体分为以下三种:

  • 检查异常:  编译期发生
  • 运行时异常: 运行期(运行时)发生
  • 自定义异常

总而言之,对于异常,需谨慎,切记哟~。

好啦,以上就是关于运行时异常和普通异常的相关知识总结啦,如果大家有什么不明白的地方或者发现文中有描述不好的地方,欢迎大家留言评论,我们一起学习呀。

Biu~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~pia!

杂谈——运行时异常和普通异常有什么区别相关推荐

  1. 什么是引发?Java运行时系统引发的异常如何处理?

    到目前为止,你只是获取了被Java运行时系统引发的异常.然而,程序可以用throw语句引发明确的异常.Throw语句的通常形式如下: throw ThrowableInstance; 这里,Throw ...

  2. 动态库、静态库、运行时库、引入库之间的区别

    动态库.静态库.运行时库.引入库之间的区别 杂集.捡对口味的看看吧. 转自:http://lingualspark.blog.sohu.com/94785899.html 运行时库:Unix中一个典型 ...

  3. C++-运行时类型信息,异常(day11)

    一.运行时类型信息 1.typeid运算符 头文件:#include<typeinfo> C++的标准头文件,都对应相应的类 //sizeof(类型/变量/表达式),返回内存大小 type ...

  4. JVM运行时常量池跟静态常量池区别

    2019独角兽企业重金招聘Python工程师标准>>> 最近学习了JVM原理,遇到了运行时常量池的区域定义,他是属于JVM运行时内存模型方法区中的一部分,总体分布如下图: 如下图:整 ...

  5. IDEA 运行时出现 too long 异常

    修改项目下 .idea\workspace.xml,找到标签 <component name="PropertiesComponent"> , 在标签里加一行  < ...

  6. finale域在修改时是安全的,虽然运行时修改不抛异常但是实际上没修改任何东西...

    转载于:https://www.cnblogs.com/a6948076/p/8274084.html

  7. java运行时_java编译时与运行时概念与实例详解

    Java编译时与运行时很重要的概念,但是一直没有明晰,这次专门博客写明白概念. 基础概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只 ...

  8. java编译不报错但运行啥都没_java编译时与运行时概念与实例详解

    java编译时与运行时概念与实例详解 发布于 2020-7-29| 复制链接 本篇文章通过实例对 java程序编译时与运行时进行了详解,需要的朋友可以参考下 Java编译时与运行时很重要的概念,但是一 ...

  9. 什么是异常?如何处理异常?

    到底神马是异常?如何处理异常? 异常的概念 异常的体系结构 Java 异常的处理机制 异常处理的基本语法 异常链 自定义异常 总结 异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且 ...

最新文章

  1. Redis 创始人宣布退居二线:我写代码只是为了表达自己!
  2. python3数据类型:Number(数字)
  3. Spark ML - 协同过滤
  4. JavaScript PHP 通过URLEncode字串判断其编码是UTF-8还是GBK
  5. 2020-04-27 三种内存屏障 acquire barrier / release barrier / full barrier
  6. MyEclipse + Tomcat 热部署问题
  7. 在线班课程-第10周 http基础知识、nginx网站服务
  8. Charles使用教程(Mac)
  9. python代码文件生成exe文件
  10. 基于SSM框架的生源地助学贷款管理系统的设计与实现
  11. 判断两条线段是否相交 java_判断两个线段是否相交02
  12. 个人项目——二柱子的生成小学生四则运算题程序
  13. graphql的调用
  14. ConstraintLayout中Chains和Guideline的使用
  15. 视频教程-嵌入式读图基础-智能硬件
  16. Zip4j 压缩包加密压缩与解压
  17. STK加载地图与高清影像图
  18. Python利用Scrapy爬取前程无忧
  19. python调用脚本后退出但是保持脚本运行_Python脚本后台运行的几种方式
  20. 超强综述 | 陈峰等纵论口腔菌群何以影响全身(全文翻译)

热门文章

  1. A卡如何自定义分辨率?AMD显卡自定义分辨率的方法
  2. ​(自适应手机端)自适应门窗定制pbootcms网站模板,铝合金门窗网站源码下载。(PC+WAP)​
  3. 深度学习常用激活函数
  4. win10远程桌面连接计算机密码错误,win10远程桌面连接提示身份验证错误怎么办?...
  5. java冒泡排序原理?
  6. ASP.NET 控件总结
  7. Dubbo面试题及答案整理,Dubbo面试题大全带答案(2021最新版)
  8. 微信小程序-显示自己发布的内容
  9. 携程、飞猪厮杀升级 OTA平台爆发“补贴”大战
  10. jquery 商品评论 星星点击 事件