想学 面向对象程序设计:来浙江安防职业技术学院找小曹老师
1.什么是异常?
生活中的异常:例如感冒发烧,工作时电脑蓝屏、死机等。 程序中的异常:在程序运行的过程中,也会发生这种非正常状况,例如程序运行时磁盘空间不足、网络连接中断、被加载的类不存在等。
程序异常解决方法:针对程序中的非正常情况,Java语言中引入了异常,以异常类的形式对这些非正常情况进行封装,并通过异常处理机制对程序运行时发生的各种问题进行处理。
示例:
如图可知能告诉什么错误
java.long.ArithmeticException:错误类型与信息 表示错误类型信息
YC.java:5 : 错误位置
程序在运行过程中,先运行main方法,然后执行到1/0时,程序就会报错,程序先会创建一个错误对象,然后把这个错误对象丢出来,JVM会把错误信息给你打印出来。 总结: 上例中出现的异常是运行时异常(异常是错误) 程序会创建一个错误对象,然后把错误对象丢出来(抛异常) 默认由JVM把错误信息进行捕获,打印出来(捕获异常)
但是为什么能编译通过?
2.异常分类
RuntimeException:运行时异常,一般不手动处理,出问题了再处理。
Error:一般指的是系统级错误。
(异常捕获)
使用try…catch对异常进行捕获
给用户看的信息
当某些代码需要在异常的情况下也输出时,需要用到finally
3.异常捕获处理
private static void testException2() {
try {
//1、对可能产生异常的代码进行检视
//2、如果try代码块的某条语句产生了异常, 就立即跳转到catch子句执行, try代码块后面的代码不再执行
//3、try代码块可能会有多个受检异常需要预处理, 可以通过多个catch子句分别捕获
} catch (异常类型1 e1) {
//捕获异常类型1的异常, 进行处理
//在开发阶段, 一般的处理方式要么获得异常信息, 要么打印异常栈跟踪信息(e1.printStackTrace())
//在部署后, 如果有异常, 一般把异常信息打印到日志文件中, 如:logger.error(e1.getMessage());
} catch (异常类型2 e1) {
//捕获异常类型2的异常, 进行处理
//如果捕获的异常类型有继承关系, 应该先捕获子异常再捕获父异常
//如果没有继承关系, catch子句没有先后顺序
} finally {
//不管是否产生了异常, finally子句总是会执行
//一般情况下, 会在finally子句中释放系统资源
}
}
代码示例
private static void testException2() {
try {
//1、对可能产生异常的代码进行检视
//2、如果try代码块的某条语句产生了异常, 就立即跳转到catch子句执行, try代码块后面的代码不再执行
//3、try代码块可能会有多个受检异常需要预处理, 可以通过多个catch子句分别捕获
} catch (异常类型1 e1) {
//捕获异常类型1的异常, 进行处理
//在开发阶段, 一般的处理方式要么获得异常信息, 要么打印异常栈跟踪信息(e1.printStackTrace())
//在部署后, 如果有异常, 一般把异常信息打印到日志文件中, 如:logger.error(e1.getMessage());
} catch (异常类型2 e1) {
//捕获异常类型2的异常, 进行处理
//如果捕获的异常类型有继承关系, 应该先捕获子异常再捕获父异常
//如果没有继承关系, catch子句没有先后顺序
} finally {
//不管是否产生了异常, finally子句总是会执行
//一般情况下, 会在finally子句中释放系统资源
}
}
结果
4.throws关键字
如果不确定或者并不急于处理异常,怎么办?
一般在程序开发中,开发者通常会意识到程序可能出现的问题,可以直接通过try...catch对异常进行捕获处理。但有些时候,方法中代码是否会出现异常,开发者并不明确或者并不急于处理,为此,Java允许将这种异常从当前方法中抛出,然后让后续的调用者在使用时再进行异常处理。
throws关键字抛出异常的基本语法格式:
[修饰符] 返回值类型 方法名([参数类型 参数名1...]) throws 异常类1,异常类2,... { // 方法体... }
注:throws关键字需要写在方法声明的后面,并在后面需要声明方法中发生异常的类型
示例:
此段代码是否会有异常? 使用throws Exception丢出异常
但是Arr()方法开始出现报错? 对main方法再次抛出异常
那么在写代码时,如何抛出异常?
说明:通过throw关键字抛出异常后,还需要使用throws关键字或try…catch对异常进行处理。
注意:如果throw抛出的是Error、RuntimeException或它们的子类异常对象,则无需使用throws关键字或try…catch对异常进行处理。
5.自定义异常:
Java中定义了大量的异常类,虽然这些异常类可以描述编程时出现的大部分异常情况,但是在程序开发中有时可能需要描述程序中特有的异常情况,例如在设计divide()方法时不允许被除数为负数
解决方法:Java允许用户自定义异常,但自定义的异常类必须继承自Exception或其子类。
举例: 公共澡堂分为男澡堂与女澡堂,若是男性进入女澡堂,或是女性进入男澡堂则会引起巨大异常。
创建Person 类,含姓名(name)与性别(gender)
创建ZaoTang类,以男澡堂为例 所以此类性别异常需要自己定义
创建异常类GenderException 自定义的异常必须继承Exception或者RuntimException
创建构造方法,调用父类构造方法,传入参数
修改方法,抛出异常。
参考public void nan,完成public void nv,即女澡堂的异常