运行时异常和一般异常_异常代码c0000005

运行时异常和一般异常_异常代码c0000005说到异常,大家都熟悉,只要程序出错了,那么肯定会说:“哎呀,我的程序出错啦~它抛出异常啦”。但单单以“异常”的名称来称呼它们,未免也太粗糙了。我们毕竟是一个精致的程序员,当然得知道他们到底都有哪些种类啦。这就好比一个优质的男朋友(比如本帅博主)必须能够精准地区分女朋友的口红色号一般。那Java到底有哪些异常呢?其实也不多,Java提供了两种错误的异常类,分别是Error和Excepti…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

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

那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 stub
		ExceptionTypeTest ett=new ExceptionTypeTest();
		ett.doSomething();
	}
}

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

我们来试一试。

运行时异常和一般异常_异常代码c0000005

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

运行时异常和一般异常_异常代码c0000005

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

运行时异常和一般异常_异常代码c0000005

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

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

方法一:

运行时异常和一般异常_异常代码c0000005

方法二:

运行时异常和一般异常_异常代码c0000005

运行结果如下:

运行时异常和一般异常_异常代码c0000005

3.总结

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

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

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

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

 

Biu~~~~~~~~~~~~~~~~~~~~宫å´éªé¾ç«è¡¨æå|é¾ç«gifå¾è¡¨æåä¸è½½å¾ç~~~~~~~~~~~~~~~~~~~~~~pia!

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188383.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • springmvc的工作流程

    springmvc的工作流程1、springmvc工作原理图2、springmvc工作流程1、用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)3、DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controlle

    2022年6月4日
    25
  • win7默认共享(win7开启默认共享)

    访问win7默认共享:HEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\SystemDWORD值LocalAccountTokenFilterPolicy设置16数据值数据为1安全选项”,在右侧找到“网络安全:LAN管理器身份验证级别”,–选中“发送LM和NTLM响应(&)”

    2022年4月17日
    156
  • 如何求最长回文子串

    如何求最长回文子串回文字符串,就是像“12321”这种轴对称形式的字符串,系不系很简单呀(狗头)。但并不是所有的字符串都是这种整个串都是回文串的。有些计算机问题就是在一个字符串中找出一段最长的回文字符子串,这个时候时候,我们会很自然的想到一种暴力的方法来解决。1975年,一位叫Manacher的人发明了一个算法,这个算法是用来查找一个字符串的最长回文子串的方法。…

    2022年5月8日
    53
  • Android模拟器开发_安卓模拟器开发

    Android模拟器开发_安卓模拟器开发更多例子:https://code.google.com/p/playn/wiki/DemoLinksgameplay–http://gameplay3d.org/index.php旨在帮助独立游戏开发的生态系统,开源的跨平台的3D引擎支持BlackBerry10、PlayBook、AppleiOS5+、AndroidNDK2.3+、MicrosoftWindows7、AppleMacOSX、Linux完整着色系统,基于节点的场景图形系统,粒子系统,Fullfeatured

    2022年9月19日
    4
  • 监督学习、无监督学习、半监督学习、强化学习、自监督学习

    监督学习、无监督学习、半监督学习、强化学习、自监督学习一文读懂监督学习、无监督学习、半监督学习、强化学习四种方式 青烟王国 图:pixabay「机器人圈」导览:一般说来,训练深度学习网络的方式主要有四种:监督、无监督、半监督和强化学习。在接下来的文章中,机器人圈将逐个解释这些方法背后所蕴含的理论知识。除此之外,机器人圈将分享文献中经常碰到的术语,并提供与数学相关的更多资源。本文编译自硅谷著名的风险投资机构安德森霍洛维茨基金,作…

    2022年9月14日
    4
  • modelsim-win64-10.4-se 破解攻略

    modelsim-win64-10.4-se 破解攻略在实验室换了新的win10系统,原来的quartus9.0在win10上安装不成功,没办法只能换成13.1版本,已经安装可用,下面是与其配合的modelsim-win64-10.4-se的破解攻略,安装教程可以去看正点原子的FPGA开发手册,写的很详细,但是没有讲破解方法,下面是可用的破解方法:软件安装好了却不能用,想必大家都有过这样的痛苦和无奈。这款软件的破解花了我整整一个下午的时间…

    2022年5月24日
    163

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号