Error与Exception的区别:
都继承Throwable类
Error:
总是不可控制的(unchecked)。
经常用来用于表示系统错误或低层资源的错误。
如何可能的话,应该在系统级被捕捉。
Exception:
可以是可被控制(checked) 或不可控制的(unchecked)。
表示一个由程序员导致的错误。
应该在应用程序级被处理。
Java 中定义了两类异常:
Checked exception: 这类异常都是Exception的子类 。异常的向上抛出机制进行处理,假如子类可能产生A异常,那么在父类中也必须throws A异常。
可能导致的问题:代码效率低,耦合度过高。
Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们不能通过client code来试图解决,所以称为Unchecked exception 。
常见的几种 RuntimeException如下:
常见的CheckedException异常:
我们在编写程序过程中try——catch捕获到的一场都是CheckedException。
io包中的IOExecption及其子类,都是CheckedException。
抛出异常:如果程序中出现了异常,没有办法将具体的异常打印出来,不做任何处理
捕获异常:如果程序出现了异常,就能够详细的打印是什么原因导致了异常并且能够做出相应的处理,能够显示详细的Log
如果异常出现的话,会立刻终止程序,所以我们得处理异常:
该方法不处理,而是声明抛出,由该方法的调用者来处理(throws)。
在方法中使用try-catch的语句块来处理异常
Java异常机制用到的几个关键字:try、catch、finally、throw、throws。
try -- 用于监听。
将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
catch -- 用于捕获异常。
捕获try语句块中发生的异常。
finally(可以不要) -- finally语句块总是会被执行。
它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
throw -- 用于抛出异常。
throws -- 用在方法签名中,用于声明该方法可能抛出的异常。
主方法上也可以使用throws抛出。如果在主方法上使用了throws抛出,就表示在主方法里面可以不用强制性进行异常处理,如果出现了异常,就交给JVM进行默认处理,则此时会导致程序中断执行。
throw 是语句抛出一个异常;throws 是方法抛出一个异常;
异常类可以声明多个,用逗号分割就可以了。但是要冲小到大捕获,否则会报错
int a = 0; int b = 1; try{ //try监控区域 if (a==0) { //为下面的b/做准备,如果a==0,那么必有异常,就不会执行后面的语句了 throw new ArithmeticException();//主动抛出的异常 } int c = b/a; } catch(Error error){//catch(想要捕获的异常类型) System.out.println("error"); }catch(Exception e){//catch(想要捕获的异常类型) System.out.println("exception"); }catch(Throwable throwable){//catch(想要捕获的异常类型) System.out.println("throwable"); }finally {//异常善后处理,可以不要 System.out.println("finally"); }
//年龄异常,和其它异常一样用就完了 public class AgeException extends Exception{ public AgeException() { } public AgeException(String msg) { super(msg); } }