在程序设计和运行的过程中,程序员也是尽可能规避错误,但使程序被迫停止的错误仍然不可避免。Java提供了异常处理机制来帮助程序员检查可能出现的错误,提高了程序的可读性和可维护性。Java中将异常封装到一个类中,出现错误就会抛出异常。

目录

  • 异常概述
  • 捕捉处理异常
  • 在方法中抛出异常
    • 使用throws关键字抛出异常
    • 使用throw关键字抛出异常
  • 难点解答
    • throws关键字和throw关键字的区别
    • 异常使用原则

异常概述

异常就是在程序运行时产生的错误,例如,向一个不存在的文本文件写入数据时,就会产生FileNotFoundException异常。

由于0不能当除数,所以在执行到这一行代码直接报错,然后程序直接就被中断了,以至于后面的代码也并未执行。Java中有很多异常,如空指针异常、数组下标越界异常、文件找不到异常等等。在java中,把上述异常都称为异常对象。当程序执行到某一个方法处产生异常时,Java虚拟机就会产生与已产生的异常相匹配的异常对象。如果不对异常处理,就会出现上述情况。

捕捉处理异常

什么是捕捉异常?通俗的理解,就是我可以通过try catch来进行抓异常,也就是我使用这个之后,即使出现错误,也可以让他程序继续执行以下的代码。

try {// 可能出现异常的代码块
} catch (Exception e) {// 对Exception的处理,可以打印异常,也可以做一些别的事情
}finally {// 无论成功与否都会执行的代码块,一般用于关流
}

通过下面例子会发现,程序虽然发生了错误,但是我最下面的语句依然执行了。这就是捕捉异常的作用。

使用try-catch代码捕捉并处理异常时,不会因为产生异常影响程序的执行。

如果遇到需要处理多种异常信息的情况下,可以在一个try代码块后面跟多个catch代码块,如果使用了多个catch代码块,则catch代码块的异常类顺序一定是先子类后父类,否则直接编译时异常。

由于ArithmeticException是Exception的子类,但是却放在了他的下面,这就会直接报错。

其次还需要注意的是finally也会有不执行的情况:

1、在finally代码块产生了异常
2、在前面的代码块使用了System.exit()退出程序
3、程序所在的线程死亡

在方法中抛出异常

如果某个方法可能会产生异常,但不想在当前方法中处理这个异常,则可以使用throws和throw关键字在方法中抛出异常。

使用throws关键字抛出异常

throws关键字常用于方法上,表示方法可能抛出异常,当方法抛出多个异常时,可用逗号分隔异常类型名。语法如下:

返回值类型 方法名(参数)throws 异常类型名{}

Java异常有Runtime(运行时异常)和Checked(编译时异常),其中,所有RuntimeException类及其子类的实例被称为Runtime异常,不是RuntimeException类及其子类的异常实例都被称为Checked异常。

只有Java语言提供了Checked异常,就是必须在编译前处理,否则不予通过编译。即:没有完善处理的带啊根本就不会被执行。也就是说Java中除了RuntimeException及其任何子类,其他异常类都被Java异常强制处理机制强制异常处理。这些被强制异常处理的必须进行异常处理。否则就会提示 Unhandled exception type Exception 错误警告。而提示这个错误信息的方法,一定是这个方法所在的类用throws抛出了异常,所以在使用这个方法时候必须处理这个异常。

上图我故意在方法上抛出了一个SQLException异常,所以只要用这个方法,那就得处理异常,因为他不是运行异常,而是编译异常,至于是抛异常处理,还是try-catch处理,这个可以自行决定。

使用throw关键字抛出异常

throw关键字虽然可以用于抛出Exception类中的子类异常,但更重要的用途是抛出自定义异常。语法如下:

throw new 异常类型名(异常信息)

创建自定义异常时,需继承RuntimeException类或者Exception类。

public class PriceException extends RuntimeException{public PriceException(String message) {super(message);}
}

自定义异常的两种用法:
1、直接终止线程运行
需要注意的是throw new完异常之后,不能直接跟业务代码,否则运行异常。

2、只是记录打印一下日志,但是并不想终止程序

难点解答

throws关键字和throw关键字的区别

1、throws用在方法声明后,表示抛出异常,由方法调用者处理,而throw用在方法体内,用来制造异常,由方法体内的语句处理。
2、throws是声明这个方法会抛出这种类型的异常,让调用者知道使用的话需要捕捉这个异常,而throw是直接抛出异常实例。
3、throws是表示出现异常的可能性,而throw是一定产生异常。

异常使用原则

1、不要过度使用异常,虽然通过异常可以增强代码健壮性,但是使用过多不必要的异常处理,会影响效率。
2、不要使用过于庞大的try-catch块,过于庞大,业务过于复杂,会增加try块中出现异常的几率,从而增加分析产生异常原因的难度。
3、避免使用catch(Exception e)如果所有异常都采用相同的处理方式,将导致无法对不同异常进行分类处理。
4、异常既可以使用try-catch处理,也可以使用throws关键字处理,根据实际情况来判断使用哪种方式,两种关键的点就是,使用try-catch发生错误之后可以不影响线程继续执行下面代码,而throws代码抛出异常,也就是不管他,发生异常线程直接终止。
5、如果父类抛出多个异常,则覆盖方法只能抛出和基类方法相同或者更少的异常,异常类也可以抛出该异常类的子类(切记是子类,否则编译报错)。

其实这一点还是挺难理解的,首先子类继承父类重写方法,重写之后,父类发生的异常,子类不一定有,这个时候就可以确定一点,子类异常可以比父类异常少,但是他又是重写关系,所以又不能比父类异常多。

注意:如果有些代码发生异常之后没必要继续执行下去了,可以直接抛出异常,没必要try-catch来处理,如果发生异常还想让他继续执行下面代码,那么就try-catch处理。

Java异常处理(Java必备知识)相关推荐

  1. Java架构师必备知识体系

    写给一名java开发的一段话: 最近公司在组织面试,并由我担任面试官,前前后后面了几天,大概有十来个人,基本都是五年以上开发经验的,我问的问题也都不是很困难,都是一些偏原理和场景解决方案. 如: 1. ...

  2. java工作面试必备知识 Java常用类库与技巧

    Java异常体系: 问题1:谈谈java异常? java异常处理机制主要回答了三个问题. What:异常类型回答了什么被抛出 Where:异常堆栈跟踪回答了在哪抛出 Why:异常信息回答了为什么被抛出 ...

  3. 一.学习前的准备-java程序员必备知识

    1.Markdowan学习 Markdown语法是博客书写的语法规范,写csnd就是用这种语法写的.了解即可. 详细文档 快捷键 功能 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 C ...

  4. 上机7 java异常处理,Java之异常处理【7】

    异常:程序运行期(执行期)出现的错误[不是语法错误],是java提供的一种用于处理程序错误的机制.如:除0溢出,数组下标溢出.读文件不存在. Java程序执行过程中如出现异常事件,系统自动的生成异常类 ...

  5. Java异常处理-----java异常体系

    再三思考后还是决定贴图,csdn的格式,我是真玩不转,对不起了各位,继续将就吧. 错误原因:内存溢出.需要的内存已经超出了java虚拟机管理的内存范围. 错误原因:找不到类文件. 错误(Error): ...

  6. Java华丽转身 —— 多线程(一)必备知识

    本篇文章介绍Java多线程的必备知识,主要包括以下三个方面: 什么是线程,什么是进程? 线程和进程有什么区别? 线程启动(两种方式,并举例对比说明)        应用篇( 以考试系统为例) 什么是线 ...

  7. 简述java异常处理机制

    引言: Hello,我的好朋友们,又到我们相聚的时间了,今天我要和大家分享一些有关java异常处理的相关 知识,也是通过老师的讲解和相关材料的借鉴之后的一个比较系统的总结,真心希望写完这篇文章的我和看 ...

  8. Java大神推荐,java编程基础必备(必看)

    在没有以前的操作习惯的错误情况下,反而容易接受新知识,所以不要因为自己对java一无所知而自卑,相反,这是菜鸟们的优势,但是如何才能从一个菜鸟历练成大神呢,当然是需要学习了,不学习就想成为大神,就是在 ...

  9. java异常处理框架_深入探索 高效的Java异常处理框架(1)

    摘要:本文从Java异常最基本的概念.语法开始讲述了Java异常处理的基本知识,分析了Java异常体系结构,对比Spring的异常处理框架,阐述了异常处理的基本原则.并且作者提出了自己处理一个大型应用 ...

  10. 简述java的异常处理机制_简述java异常处理机制

    引言: Hello,我的好朋友们,又到我们相聚的时间了,今天我要和大家分享一些有关java异常处理的相关 知识,也是通过老师的讲解和相关材料的借鉴之后的一个比较系统的总结,真心希望写完这篇文章的我和看 ...

最新文章

  1. cocos2d-x开发中wstring和string的转换
  2. DNF安装MySQL_CentOS7使用dnf安装mysql
  3. 如何查看机器是否为vmware虚拟机
  4. Android之靠谱的Activity从底部向上弹出,finish从顶部向下消失(不黑屏)
  5. CF1322B:Present(异或、two pointers)
  6. 隐藏的iscroll元素显示后不能滚动问题
  7. bzoj2662:[BeiJing wc2012]冻结
  8. spring+struts2+mybatis
  9. Java集合Map(四)
  10. [EntLib]UAB(Updater Application Block)下载
  11. 【矩阵论】对称矩阵特征值的性质与直积
  12. html设置ie11兼容,ie11浏览器兼容性问题设置方法
  13. 信号与系统中的信号带宽理解
  14. Tomcat启动startup.bat一闪而过就消失的原因和解决方法
  15. 10个 安卓应用商店开发者公司账号注册(2022最新最全)
  16. ApplicationAware
  17. UVALive 6555 Playing Fair with Cryptography(细节处理)
  18. JS 删除对象中的某个属性
  19. 机器视觉技术的发展动态
  20. 从零开始之驱动发开、linux驱动(四十五、DM9000网卡驱动)

热门文章

  1. java 多线程开发
  2. 机器学习中数据预处理方法
  3. windows安全中心
  4. java后端面试大全,java后端面试宝典
  5. MongoDB备份(mongodump)与恢复(mongorestore)工具实践
  6. 在 Apache Tomcat 服务器上启用 HTTPS 或 SSL 正确方式的分步指南 – 端口 8443
  7. 解决虚拟机黑屏的办法
  8. 模拟电子技术基础(一)半导体二极管及其基本电路
  9. springboot 中 mybatis configuration 配置失效问题
  10. 1u服务器怎么光驱重装系统,光盘重装系统步骤 光盘重装系统怎么做