11、异常处理
程序问题:
1、错误(Error):语法错误和运行时错误;
运行时错误指的是由于程序错误导致运行的环境崩溃或硬件出现问题。这样的错误是无法用代码解决问题的。
2、异常(Exception):编译期异常/检查异常(checked)和运行期异常/未检查异常(unchecket)。
异常能用代码解决问题。
异常的寻找:从上往下寻找自己写的第一行代码。
处理异常:
1、先验判定:在异常出现之前;
2、异常处理机制(后捕):在异常出现后(try(试一试)-catch(捕获)-finally(总会执行的代码))
Throwable类:
Thorwable是所有程序问题的父类,它有两个子类分别是:Error和Exception。
Error是所有错误的父类;
Exception是所有异常的父类。
而Exception里面又包括runtimeException(所有运行时异常的父类)和非runtimeException编译时异常。
由于所有异常都继承与Throwable类,所以我们还可以在任何被捕获的异常上调用Throwable类的方法。
1、public String getMessage():返回关于已发生的异常的详细信息。这个方法在Throwable类的构造方法中被初始化。
2、public Thowable getCause():返回Thowable对象所描述的异常产生的原因。这个原因由Throwable的构造方法或者initCause()方法进行初始化。
3、public String toString():返回Thorwable类的简短描述。
捕获异常:
编写try、catch快:
try不能单独存在,后面必须跟catch或者finally。
try{
有可能出现异常的代码书写在这里
}catch(异常变量声明,作用是判断这个catch出现的是那种异常){
}
一旦try出现异常后面的语句将不执行,跳到catch块处理异常,如没有异常则跳过catch代码块。
多个catch块:
多个catch是按顺序匹配的,谁的引用指向catch块就匹配谁。
当catch后面跟多个catch时,catch中捕获的异常有继承关系时子类写前面父类写后面。
finally关键字:
finally是不管怎么样总会执行的代码,在return和break之前执行。通常是资源的关闭动作和内存清理动作。input.next(); 取走缓冲区数据,处理语句。
代码级别只有System.exit(0);关闭虚拟机能阻止finally的动作。
异常处理及声明规则:
instanceof也可以用于判断异常。
throws关键字:
作用:警告方法调用者这个方法有可能出现异常。写在方法声明后面花括号前面,也可用于main方法。异常类型可以是多个的,中间用逗号分隔。
抛出异常:
使用throw关键字来抛出异常,这个异常可以是一个新的异常实例,也可以是一个我们刚刚捕获的异常。throw语句将导致当前代码立即停止执行,而且异常将被抛给方法调
用栈的前一个方法,也就是方法的调用者。
throww new ArrayIndexOutOfBoundsException(5);
方法遇到throw后会发生异常,不管try块,如果非runtimeException要写在throws里。
关键字throws用于声明异常,它只用在方法签名中。而关键字throw用于抛出异常,它可以用在任何我们想要抛出异常的地方。
方法重写与异常:
子方法不能抛出比父方法更多的异常。(其中更多包括了数量和范围)
异常抛出机制:
1、java虚拟机会产生该异常的对象;
2、然后交个报异常的方法;
3、如果该方法没有处理;
4、则抛给方法的调用者;
5、如果还没有处理则抛给调用者的调用者;
6、最终抛给虚拟机,终止程序。
用户自定义异常:
1.必须继承Exception类;
2、必须有3个带参构造(3个):1、Exception2、Throwable3、String(针对业务异常);
3、在一个方法中抛出异常;
4、在另一个方法中捕获并处理异常。