Java异常处理(Java必备知识)
在程序设计和运行的过程中,程序员也是尽可能规避错误,但使程序被迫停止的错误仍然不可避免。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必备知识)相关推荐
- Java架构师必备知识体系
写给一名java开发的一段话: 最近公司在组织面试,并由我担任面试官,前前后后面了几天,大概有十来个人,基本都是五年以上开发经验的,我问的问题也都不是很困难,都是一些偏原理和场景解决方案. 如: 1. ...
- java工作面试必备知识 Java常用类库与技巧
Java异常体系: 问题1:谈谈java异常? java异常处理机制主要回答了三个问题. What:异常类型回答了什么被抛出 Where:异常堆栈跟踪回答了在哪抛出 Why:异常信息回答了为什么被抛出 ...
- 一.学习前的准备-java程序员必备知识
1.Markdowan学习 Markdown语法是博客书写的语法规范,写csnd就是用这种语法写的.了解即可. 详细文档 快捷键 功能 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 C ...
- 上机7 java异常处理,Java之异常处理【7】
异常:程序运行期(执行期)出现的错误[不是语法错误],是java提供的一种用于处理程序错误的机制.如:除0溢出,数组下标溢出.读文件不存在. Java程序执行过程中如出现异常事件,系统自动的生成异常类 ...
- Java异常处理-----java异常体系
再三思考后还是决定贴图,csdn的格式,我是真玩不转,对不起了各位,继续将就吧. 错误原因:内存溢出.需要的内存已经超出了java虚拟机管理的内存范围. 错误原因:找不到类文件. 错误(Error): ...
- Java华丽转身 —— 多线程(一)必备知识
本篇文章介绍Java多线程的必备知识,主要包括以下三个方面: 什么是线程,什么是进程? 线程和进程有什么区别? 线程启动(两种方式,并举例对比说明) 应用篇( 以考试系统为例) 什么是线 ...
- 简述java异常处理机制
引言: Hello,我的好朋友们,又到我们相聚的时间了,今天我要和大家分享一些有关java异常处理的相关 知识,也是通过老师的讲解和相关材料的借鉴之后的一个比较系统的总结,真心希望写完这篇文章的我和看 ...
- Java大神推荐,java编程基础必备(必看)
在没有以前的操作习惯的错误情况下,反而容易接受新知识,所以不要因为自己对java一无所知而自卑,相反,这是菜鸟们的优势,但是如何才能从一个菜鸟历练成大神呢,当然是需要学习了,不学习就想成为大神,就是在 ...
- java异常处理框架_深入探索 高效的Java异常处理框架(1)
摘要:本文从Java异常最基本的概念.语法开始讲述了Java异常处理的基本知识,分析了Java异常体系结构,对比Spring的异常处理框架,阐述了异常处理的基本原则.并且作者提出了自己处理一个大型应用 ...
- 简述java的异常处理机制_简述java异常处理机制
引言: Hello,我的好朋友们,又到我们相聚的时间了,今天我要和大家分享一些有关java异常处理的相关 知识,也是通过老师的讲解和相关材料的借鉴之后的一个比较系统的总结,真心希望写完这篇文章的我和看 ...
最新文章
- cocos2d-x开发中wstring和string的转换
- DNF安装MySQL_CentOS7使用dnf安装mysql
- 如何查看机器是否为vmware虚拟机
- Android之靠谱的Activity从底部向上弹出,finish从顶部向下消失(不黑屏)
- CF1322B:Present(异或、two pointers)
- 隐藏的iscroll元素显示后不能滚动问题
- bzoj2662:[BeiJing wc2012]冻结
- spring+struts2+mybatis
- Java集合Map(四)
- [EntLib]UAB(Updater Application Block)下载
- 【矩阵论】对称矩阵特征值的性质与直积
- html设置ie11兼容,ie11浏览器兼容性问题设置方法
- 信号与系统中的信号带宽理解
- Tomcat启动startup.bat一闪而过就消失的原因和解决方法
- 10个 安卓应用商店开发者公司账号注册(2022最新最全)
- ApplicationAware
- UVALive 6555 Playing Fair with Cryptography(细节处理)
- JS 删除对象中的某个属性
- 机器视觉技术的发展动态
- 从零开始之驱动发开、linux驱动(四十五、DM9000网卡驱动)