在程序设计和运行的过程中,为了尽可能规避错误,但使程序被迫停止的错误仍然不可避免。Java提供了异常处理机制来帮助程序员检查可能出现的错误,提高了程序的可读性和可维护性。Java中将异常封装到一个类中,出现错误就会抛出异常。
异常就是在程序运行时产生的错误,例如,向一个不存在的文本文件写入数据时,就会产生FileNotFoundException异常。
由于0不能当除数,所以在执行到这一行代码直接报错,然后程序直接就被中断了,以至于后面的代码也并未执行。Java中有很多异常,如空指针异常、数组下标越界异常、文件找不到异常等等。在java中,把上述异常都称为异常对象。当程序执行到某一个方法处产生异常时,Java虚拟机就会产生与已产生的异常相匹配的异常对象。如果不对异常处理,就会出现上述情况。
输出
使用try-catch代码捕捉并处理异常时,不会因为产生异常影响程序的执行。
如果遇到需要处理多种异常信息的情况下,可以在一个try代码块后面跟多个catch代码块,如果使用了多个catch代码块,则catch代码块的异常类顺序一定是先子类后父类,否则直接编译时异常。
由于ArithmeticException是Exception的子类,但是却放在了他的下面,这就会直接报错。
其次还需要注意的是finally也会有不执行的情况:
1、在finally代码块产生了异常
2、在前面的代码块使用了System.exit()退出程序
3、程序所在的线程死亡
throws关键字和throw关键字的区别
1、throws用在方法声明后,表示抛出异常,由方法调用者处理,而throw用在方法体内,用来制造异常,由方法体内的语句处理。
2、throws是声明这个方法会抛出这种类型的异常,让调用者知道使用的话需要捕捉这个异常,而throw是直接抛出异常实例。
3、throws是表示出现异常的可能性,而throw是一定产生异常。
异常使用原则
1、不要过度使用异常,虽然通过异常可以增强代码健壮性,但是使用过多不必要的异常处理,会影响效率。
2、不要使用过于庞大的try-catch,过于庞大,业务过于复杂,会增加try-catch中出现异常的几率,从而增加分析产生异常原因的难度。
3、避免使用catch(Exception e)如果所有异常都采用相同的处理方式,将导致无法对不同异常进行分类处理。
4、异常既可以使用try-catch处理,也可以使用throws关键字处理,根据实际情况来判断使用哪种方式,两种关键的点就是,使用try-catch发生错误之后可以不影响线程继续执行下面代码,而throws代码抛出异常,也就是不管他,发生异常线程直接终止。
5、如果父类抛出多个异常,则覆盖方法只能抛出和父类方法相同或者更少的异常,异常类也可以抛出该异常类的子类(切记是子类,否则编译报错)。
首先子类继承父类重写方法,重写之后,父类发生的异常,子类不一定有,这个时候就可以确定一点,子类异常可以比父类异常少,但是他又是重写关系,所以又不能比父类异常多。
注意:如果有些代码发生异常之后没必要继续执行下去了,可以直接抛出异常,没必要try-catch来处理,如果发生异常还想让他继续执行下面代码,那么就try-catch处理。