Java之异常处理

  Java 中有两种错误类型:1、错误。对应的是 java.lang.Error ;2、异常。对应 java.lang.Exception 。它们都继承自 java.lang.Throwable 。区别是: Error 一般指的是一些非常严重的错误,程序是无法处理的。比如说虚拟机堆栈溢出,这样的错误程序无法去处理。而 Exception 则是指一些可以使用程序控制的异常,也就是说如果程序按常理走的话可以避免的错误。比如说,空指针异常,只要程序员注意不调用指向null的引用的方法就可以避免。

  因此,我们很有必要知道什么时候会出异常,怎么处理它,而对于错误,现在则可以先不用关心太多。

  我们先说说当程序出了异常,我们如何处理它。老师举的那个申请加薪的例子很好,结合起来会很容易理解异常处理过程。
  1、发生异常。可能是虚拟机产生,可能是有程序员手动抛出(throw)。这是一个提交加薪申请的过程。异常抛出肯定是在一个方法里抛出的,我们假设是 methodA 。
  2、首先接收到被抛出的这个异常的是调用 methodA 的方法 methodB 。 methodB 可以有两种方式来处理它:捕获(try catch)、抛出(throw)。这两种方式对应的就是处理加薪、交给上司处理。上司就是调用 methodB 的方法 methodC 。

  接收到异常,不捕获它,而是把它抛出,这个过程可以一直进行下去,直到这个异常被抛给最终 Boss ,也就是虚拟机。如果异常最终被抛给了虚拟机,那虚拟机就只能对它进行处理了(停止运行程序,打印异常信息)。这就是为什么我们在运行程序的时候,出现NullPointerException 时,程序停止运行,控制台打印异常信息。
  异常抛出的过程很像冒泡,一层一层的往上抛。这个可以从我们出异常时,控制台的异常信息能看出来。

  注意:错误(Error)也可以被捕获(catch)。但一般不这么做,因为出现错误(Error)时,我们处理不了,既然处理不了那么我们捕获它就没有意义了。而异常是程序运行时不按常理走的时候,出现的问题,这个我们是可以处理的。
  另外,虽然我们说异常处理有两种方式:捕获和抛出。但是由于抛出不像是”处理“异常,而捕获则更像是”处理“异常。所以,以后看书听课之类的,听到处理异常一般都可以理解成捕获异常。

RuntimeException 和 Exception 的区别:
  RuntimeException (及其子类)无须显示处理(捕获 or 抛出);而 Exception (及其子类)需要显示的处理。这点非常诡异,因为 RuntimeException 是继承自 Exception ,那这样的区别就有点不太好理解了,但这区别却又是真的存在的。可以把上课写的 AgeException 改成继承自 RuntimeException 试试,会发现所有的 try catch 和 throws 都可以删掉不用写了。
  RuntimeException 是指运行时异常,是非检测异常,不检测(也就是捕获或者抛出)可以通过编译。但是好的习惯是要想到可能出现的 RuntimeException ,并捕获处理之,不让它最终抛给虚拟机。因为如果不捕获处理的话,最后会抛到虚拟机,虚拟机处理它的方式就是停止程序,这肯定是我们不想要的结果。

  异常和错误不一样,异常不是错误。错误是不好的,我们应该尽量避免。但异常不一定是不好的。一些语法性的异常,例如 NullPointerException、ArrayIndexOutofBoundsException ,我们应该尽量避免这类异常的出现。但有时,我们甚至可以利用异常来优化我们的程序。
  比如说,我们的那个栈(讲集合时写的)。当我们要取得栈里的元素时,调用 pop 方法。首先,我们要判断栈是否为空,不为空则取元素;为空则打印一句话出来。但是栈为空的话,只是打印一句话,这样好吗?我们打印一句话的目的是通知调用方法的程序员栈为空。但这种通知方式显然不好,我们应该用更强硬的方式来通知调用pop方法的程序员。这个时侯,我们就可以手动抛出一个异常,这个异常可以是我们自定义的异常(StackEmptyException)。这就是老师所说的“业务异常”,业务异常一般都继承自 RuntimeException 。回忆一下我们使用 List 时,调用 get(int) 方法时,如果我们传入的索引不存在,那么就会抛出 IndexOutOfBoundsException ,这和我刚说的 Stack 为空时处理的原理是一样的。这么看来,有时候,异常像是一个可以在类之间传递的信息载体。我们可以使用这种载体来优化我们的程序

  P.S. 控制台打印除了提示相关信息,没有其他的任何意义。而且我们开发的软件不可能是控制台界面的,只会是桌面程序(Swing)或者 Web 程序。但是,控制台打印有一个非常有用的好处,也是非常常用的,就是便于我们调试程序,通过控制台打印,我们能看到正在运行的程序中的某些信息(字段值之类的)。这个调试程序的基本技能要有。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值