异常概述
在程序中,错误可能产生于程序没有预料到的各种情况,或者是超出了程序员可控范围的环境因素,如用户的坏数据,试图打开一个不存在的文件夹等。在java中这种在程序运行时可能出现的一些错误称为异常。异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常的指令流。
处理程序异常错误
在java中,如果某个方法抛出异常,既可以在当前方法中捕获异常,也可以将异常向上抛出,由方法调用者来处理。
错误
1 | String s="xhy"; |
在本段代码中,实现将非字符型数值转换为int型,程序会报出异常。
可以看出,本实例报出的是NumberFormatException(字符串转换为数字异常)。提示信息“xhy年龄是”已经输出,而变量age没有输出,可知程序在执行类型代码转换时已经终止。
捕捉异常
java语言的异常捕获结构是由try,catch和finally三部分组成,try语句存放的是可能发生异常的java语句;catch程序块在try之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句中的代码块如何退出,都将执行finally语句块。
语法如下:
1 | try{ |
利用try -catch语句对刚刚代码行进行修改
1 | try { |
可以看出,程序仍然输出最后的提示信息,没有因为异常而终止。当try代码块中的语句发生异常时,程序就会跳转到catch中执行,执行完catch中的代码块后,将继续执行catch后的代码块。由此可知,java的异常处理是结构化的,不会因为一个异常而影响整个代码的执行。
注意. Exception是try代码块传递给catch代码块的变量类型,e是变量名。 ↩
异常捕捉函数
这里介绍三个异常捕捉函数:
getMessage()函数:输出错误性质。
toString()函数:给出异常的类型与性质。
printStackTrace()函数:
见上图。
注意:前两个函数需要打印,而第三个不需打印。
finally语句块
完整的异常处理语句一定要包含finally语句,但以下四种情况finally语句不会被执行。
(1)在finally语句块中发生异常。
(2)在前面的代码中使用了System.exit(0)退出了程序。
(3)程序所在的线程死亡。
(4)CPU关闭。
自定义异常
用户只需要继承Exception类即可自定义异常类。
在程序中使用自定义异常类,大致可分为以下几个步骤:
(1)创建自定义异常类。
(2)在方法中通过throw关键字抛出异常类。
(3)若在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常。
创建自定义异常,在项目中创建类MyException,该类继承Exception。
1 | public class MyException extends Exception { |
在项目中创建类Tran,该类中创建一个带有int型参数的方法avg(),该方法用来检测参数中是否有数小于0,如果存在,则通过throw关键字抛出MyException异常对象,并在main函数中捕捉。
1 | public class Tran { |
运行结果如图
运行时异常
Java类库的每个包都定义了异常类,所有这些类都是Throwable类的子类。Throwable类派生了两个子类,分别是Exception和Error类。Error类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,这类错误一般比较严重。Exception类称为非致命类,可以通过捕捉处理使程序继续执行。
异常的使用原则
(1)在当前方法声明中使用try-catch语句捕获异常。
(2)一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。
(3)如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常。
建议:不要将异常抛出,应该编写异常处理语句。