异常的概述
代码在运行时期发生的问题就称之为异常。在java中,异常被封装成为了一个类,当程序出现了异常类中的问题时,异常的信息(如位置和原因)就会被抛出。
在java中用Exception来描述异常,public class Exception extends Throwable 则是异常的继承体系。 Throwable是所有错误或异常的超类。
错误和异常的关系就相当于艾滋和感冒的关系。人得了艾滋几乎不可治愈,而得了感冒却还可以继续正常生活。所以出现错误就意味着代码一定要被修改,而出现异常程序还是可以继续运行下去的。
异常的实例
这是很常见的一个数组越界异常,即arr[3]没有索引。整个异常的处理过程如下:①JVM检测到getarray()方法存在数组越界异常,然后将之抛给调用者main()方法。②main()方法发现自己无法处理该异常,于是最后返回给JVM。③JVM将异常的信息 索引“3”和代码位置打印在控制台上。
在这个过程中,getarray()方法里面的 arr[3]出现异常,于是它后面的 return语句不再执行;main()方法里面的int i=getarray(arr)出现异常,于是后面的打印语句不再执行。
异常的处理格式 throw 、 try和catch
在编写程序的时候,我们不能等到控制台告诉你出现了哪些异常,而是要自己提前将可能出现问题给写出来,这就要用到throw关键字。例如对于数组,除了越界,也可能会出现为空的情况。
这时我们便在方法里面,提前判断,然后用throw关键字创建异常对象,即new Exception(.....),当出现问题的时候,控制台就会将出现的问题,括号中的内容打印出来给我们。
要注意的是,使用这种异常格式的时候,main方法和被调用的方法都需要thorws Exception。因为方法里面可能抛出多个异常,所以用throws,而创建异常对象的时候,只会有一个,所以用throw。
当运用 了try和catch语句之后,就不需要再让主函数去继承异常。而是用try和catch语句去处理异常。基本的格式是 try {..........}检测括号内语句是否出现异常,catch(异常+ 变量名){........}捕获异常并用变量接收,{......}写处理异常的方法 。
这里就是用 try 语句检测getarray()方法是否有异常,然后用catch语句捕获异常。因为异常是NullPointerException所以就(NullPointerException ex),即用ex去接收异常,然后处理异常就是将ex打印出来。
final{......} 必须要执行的代码
这个很好理解了,就不多赘述。
*运行时异常
当你创建的异常是RuntimeException时,方法不需要再抛出异常,即不需要再写throws Exception,调用者也不需要再去处理。
原因很简单:运行异常原本就不能发生,但是如果发生了,需要你的程序人员停止程序然后修改源代码。
方法重写时异常的处理
当继承父类的方法后,如果父类抛出异常,子类可以抛出异常也可以不抛出异常。但如果子类抛出异常,异常的继承关系不能比父类高。
如果父类不抛出异常,子类则不能抛出异常。但如果子类调用的方法抛出了异常,这时子类只能选择try和catch。
自定义异常
自定义异常大部分都是RuntimeException,因为这些异常是真正使用的时候,不能出现的。
int...source是可变参的意思,即可以接收多个科目的成绩。
这里定义了FuShuException,然后(String s)是构造器,super(s)则是将参数s传回去。