异常处理机制
1、 种类:
(1) 错误: 与虚拟机有关的,无法恢复或捕获,将导致程序中断。例如系统崩溃、 JVM错误、 动态链接失败。
(2) 异常: 因编码或外在因素导致,能被处理或者捕获。
(3) 关系图: Throwable
Error Exception
VitualMechineError RunTimeException - - - NullPointerException
OutOfMemoryError ArrayOutofBoundException
ThreadDeath ArithneticException
ClassCastException
IOException
SQLException
2、 异常分类:
(1) 非检查型异常: 编译器不要求强制处理,因编码/设计不当引起。RunTimeException及其子类均是。
(2) 检查型异常: 程序运行时因外界因素导致的,除RunTimeExcepiton外的其它异常。
3、异常处理机制的种类:
(1) try...catch 捕获异常: 将可能产生异常的代码块放入try中,有错误则跳到catch块中处理。
(2) throws声明抛出异常,将异常交给上一级调用处理(则交给虚拟机处理)
4、 try....catch相关的捕获异常:
(1) try...catch:
单catch : try{
}catch(Exception e){
}
多catch: try{
}catch(异常1){}
catch(异常2) {}
(2) try...catch...finally:
finally块相当于资源回收语句,必须被执行,一般用来回收物理资源。
(3) 多异常捕获:
try{
}catch(异常1|异常2|... e){
}
该异常变量默认为常量,程序不能对该异常重新赋值,多catch时异常可以为父子关系或者是同级别关系。
(4) 自动回收资源try语句:
try(声明|初始化资源){}
(5) 异常对象常用的方法:
getMessage() //返回该异常的详细描述字符串(获取错误性质)
printStackTrace() //该异常的跟踪栈信息输出到标准错误输出(指出异常的类型、性质、栈层次和出现的位置)
printStackTrace(PrintSteam s) // 输出到指定输出流
getStackTrace() //返回跟踪栈信息
toString() //给出异常的类型与性质
5、抛出异常:
(1) throw : 真正抛出。 抛出一个异常实例对象且每次一个 多重异常抛出时是先子类再父类
throw new 异常();
(2)throws : 声明抛出。 抛出一个异常序列,只在定义方法内使用
public void run() throws IOException,Exception{}
如果某个方法调用了声明抛出异常的方法,也要声明其声明的异常。
(3) 子类重写父类的方法时,如果父类的方法有声明(throws)异常,子类的方法可以不声明;也可以声明同一个类型或者是异常的子类型。
6、自定义异常:
public class MyException extends Exception{
public MyException(String ErrorMessage){
super(ErrorMessage);
}
public AgeException(String msg){ super(msg);}
}
调用: throw new MyException();
自定义异常抛出的例子:
public class MyExceptionDemo{
public void f() throws MyException{
System.out.println("Throwing MyException from f());
throw new MyException();
}
public static void main(String[] args){
MyExceptionDemo sed = new MyExceptionDemo();
try{
sed.f();
}catch(MyException e){
System.err.println("Caught it");
}
}
}
输出:Throwing MyException from f()
Caught it
一个常用的空指针异常NullPointerException:
当变量内没有地址信息时,也就是这个变量没有指向任何对象,所以,当访问变量的属性和方法时,相当于在运行代码时出现了null属性、null方法,就会出现异常(null是引用类型的默认值)。
在编写程序时,判断两个字符串是否相等时,应将不确定存在值的一项放在后面,避免空指针异常。
if(this.getPassword().equals(Pad.trim())) 当password确定存在而Pad不一定确定时,应该把确定的放在前面