异常分为:检查异常和非检查异常
检查异常
(不可避免,必须进行异常处理,否则无法通过编译)意思就是代码打出来以后,系统自动提示你要做异常处理。要么是对这段代码进行try.....catch,要么就是throws exception。除了RuntimeException和它的子类和错误(Error)以外其他的都是检查异常。
非检查异常
(可以避免,不强制必须处理)编译器不会提示你做异常处理,即使在运行时会出现错误,但是他不强制你进行异常处理。RuntimeException和它的子类,以及错误(Error)都是非检查异常。
也可以将异常分为运行时异常和非运行时异常
运行时异常:
RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是非检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时编译器不会检查它
非运行时异常:
RuntimeException以外的异常,类型上都属于Exception类及其子类,必须进行处理,和检查异常基本类似。一般有IOException、SQLException等以及用户自定义的Exception异常。
异常处理的方法
第一种方法:throws,抛出异常
第二种方法:try...catch
第三种方法:try..catch...catch...
第四种方法:try..catch...finally...(finally里面的代码是一定需要执行的代码)
方法覆盖中的异常:
子类的覆盖方法不能比父类的被覆盖方法抛出更多的异常
例如说
class Super{
public void m1() throws IOException{
}
}
class Sub extends Super{
public void m1() throws IOException{
}
}
子类Sub继承了父类并重写父类中的m1()方法,此时,如果如果把子类中的抛出异常改为Exception
如下所示:
class Sub extends Super{
public void m1() throws Exception{
}
则程序将报错。
也就是说子类的抛出异常范围应该比父类的小。
message属性与异常追踪:
Exception类中定义了一个message属性,并提供了一个getMessage()方法获得message属性的值,同时提供了一个构造方法对其属性赋值Exception
public class TestException {
public static void main(String args[]){
m2();
}
public static void m2(){
try{
throw new NullPointerException("this is null");
// this is null 就是信息的提示
}catch(NullPointerException e){
e.printStackTrace();
}finally{
System.out.println("this is finally");
}
}
}
可以查看一下Exception的源码,更清楚。
extends Exception 检测异常,当产生时需要异常处理
class MyException extends Exception{
public MyException(){
}
public MyException(String message){
super(message);
}
}
public class TestException {
public static void main(String args[]){
}
public static void m1() throws MyException{
throw new MyException();
}
}