异常:异常就是Java程序在运行过程中出现的错误。
异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象。其实就是Java对不正常情况进行描述后的对象体现。
异常的体系
Throwable分三种
1,编译时异常
除了RuntimeException及其子类,Exception中所有的子类都是,这种异常必须要处理,要不编译通不过
2,运行是异常
RuntimeException及其子类都是,这种异常不用处理,编译会通过,不过这样的程序会有安全隐患,遇到这种异常是需要改代码的
3,严重错误问题
用Error进行描述,这个问题发生后,一般不编写针对代码进行处理,而是要对程序进行修正.通常都是由虚拟机抛出的问题
Throwable中的方法
String getMessage()
获取异常信息,返回字符串。
getMessage() :返回此 throwable 的详细消息字符串。 class Throwable { String detailMessage; Throwable(){} Throwable(String message) { this.detailMessage = message; } public String getMessage() { return detailMessage; } }
String toString()
获取异常类名和异常信息,返回字符串。
覆盖了object里的toString()方法
void printStackTrace()
获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
void printStackTrace(PrintStream s)
通常用该方法将异常内容保存在日志文件中
异常处理
try...catch...finally 格式: try { 需要检测的代码; } catch(异常类 变量) { 异常处理代码; } ... finally { 一定会执行的代码; } 可以有下面三种搭配形式: try...catch(...) try...finally try...catch(...)...finally
抛出 throws throw
throws:用于标识函数暴露出的异常。thorws用在函数上,后面跟异常类名(可以由多个,用,隔开)。
throw:用于抛出异常对象。throw用在函数内,后面跟异常对象。new Exception();
自定义异常
class MyException extends Exception{ MyException(){} MyException(Stirng message){ super(message); //将信息传递给父类,调用父类封装好的构造方法 } } class Student { public void giveAge(int age) throws MyException { if(age>40 || age<16) { //throw new MyExcetpion("A"); MyExcepiont my = new MyExcetpion("A"); throw my; } else { System.out.println("B"); } } }
Exception异常的分类
1,编译时被检测的异常,包括Exception子类RuntimeException以外的所有的异常,如果在函数上声明,调用时,没有处理方式,编译会报错,而且这种异常有针对性的处理方式,是可被处理的
2,编译时不被检测的异常:包括RuntimeException以及他的所有子类.该异常也称为运行时异常,如果功能声明了此异常,调用者可以不用任何处理方式.通过该异常不需声明,如果发生,就是需要程序停止,对代码进行修正
总结:
RuntimeException以及其子类如果在函数中被throw抛出,可以不用在函数上声明。
子类覆盖父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
如果父类抛出了多个异常,子类覆盖父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
如果被覆盖的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
当try对应多个catch时,最顶层的异常要放在最下面,反过来分析如果最顶层的异常放在第一行,那根据多态原理,后面的catch就没用了,一般面试的时候会这么问,开发的时候不会抛有继承关系的异常