在API中可以查看long类下的继承分支类,当然还包括其他的,现在就搞一搞object类下面的子类:Throwable类!
首先谈谈Throwable类是什么意思:Throw是抛的意思able是可抛,类似于Runnable(可运行)的意思。
那么如图所示在Throwable类下面有两个直接已知子类:1.error 2.Exception.在谈异常之前我已经假设你能将异常和错误区分开了。那我废话不多说,重点是Exception这个类,我们再次打开API查看Exception类当中的一些类。
这里我们看到它的已知子类更多,那么到这一步你会发现,平时遇到的一些问题是不是感觉很眼熟,因为这里的已知子类就是平时遇到异常时直接抛出的。
但是,Java给我们用面向对象的思想封装了已知的一些异常,可它不可能将所有问题都考虑到,所以需要我们自己进行自定义异常类。
前面我说过所有已知异常子类的父类都是继承自Exception,所以要想创建一个类并且称为异常类,就必须继承自Exception或者RuntimeException。如下:
public class MyException extends Exception{//继承Exception类
public MyException(){....}
}
public MyException(String message){
super(message);//调用父类方法getMessage();是获取异常的消息字符串的意思
}
public class MyException extends RuntimeException{//继承RuntimeException类
}
这样就实现了自定义异常类了,可以再自己的方法中或者方法外试着抛出吧!
号外!!【异常注意事项】
1.子类在覆盖父类方法时,父类的方法如果抛出了异常。
那么子类只能抛出父类异常或者该异常类的子类(父亲坏了,儿子不能比父亲更坏)
2.如果父类抛出多个异常,那么子类只能抛出父类异常的子集
简单说:子类覆盖父类,只能抛出父类的异常或者父类异常的子类。
3.如果父类没有抛出异常,那么子类覆盖的时候,绝不能抛,只能try-catch处理
接着上面定义的异常类继续,异常类已经有了,所以,我需要在其他类中抛出自定义的具体异常。代码如下:
public class Exception02 {
public static void main(String[] args) throws Exception{
int[] arr=new int[3];
Demo d=new Demo();
d.method(arr, -10);
d.toString();
}
}
class FuShuIndexException extends Exception{//自定义异常类
FuShuIndexException(){}//空参构造
FuShuIndexException(String msg){
super(msg);调用父类message方法,该方法返回带有异常信息。
}
}
class Demo{
public void method(int[] arr,int index) throws Exception{
if(arr==null) {
throw new NullPointerException("数组的引用为空");//抛出空指针异常
}
if(index>=arr.length) {
throw new ArrayIndexOutOfBoundsException("数组角标越界啦,你是不是疯啦。");//抛出角标越界异常
}
if(index<0) {
throw new FuShuIndexException("角标负数");//抛出角标负数的自定义异常
}
}
}
运行结果如图: