(36)RuntimeException和创建自定义的RuntimeException子异常类和一些例子

来源:互联网 发布:软件项目汇报 模板 编辑:程序博客网 时间:2024/06/11 07:52

一、Exception中有一个特殊的子类异常Runtime运行时异常。

①如果在函数内部抛出该异常,函数上可以不用声明,编译一样通过。

②如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。

之所以不用再函数上声明,是因为不需要让调用者处理。

当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码修正

①举个栗子

函数定义的没有问题,是调用者乱传参数造成的,就不会有return a/b;更不会执行调用处之后的语句,程序就此停掉,让调用者自己修改参数去。


public int div(int a,int b)    {     if(b<0) {   throw new ArithmeticException();   }   return a/b;   }public static void main(String[] args) {        Demo4 d=new Demo4();         int x=d.div(4, 0);        System.out.println("x="+x);        }


②举个栗子

若在函数上声明异常,就是希望调用者能够处理这个异常,如果调用者给了处理方式,相当于这个问题就被隐藏(这段程序相当于没执行,就继续后面的程序)

不声明,就不会进行异常处理,说明调用者只要传值错误,就会程序停止,自己改去,必须让调用者知道发生了什么事!!

还有IndexOutOfBoundsException异常,根本就没这个下标,函数就无法继续进行,停掉,调用者自己改去

  public int div(int a,int b)   throws ArithmeticException   {        return a/b;   }public static void main(String[] args) {        Demo4 d=new Demo4();         int x=d.div(4, 0);        System.out.println("x="+x);        }


二、空指针异常


public class Demo5 {public String name;public void checkName(String name)                {if(name.equals("lisi")) //  new NullPointerException() 都没有传入值,根本无法比较,程序应该停掉                {                       //若对程序修改,防止异常的发生,可以这样修改if(name!=null&&name.equals("lisi"))System.out.println("Yes");}else System.out.println("No");}  public static void main(String[] args) {         Demo5 d=new Demo5();         d.checkName(null);// java.lang.NullPointerException}}


自定义异常:如果该异常的发生,无法再继续进行运算,就让自定义异常继承RuntimeException类。


三、自定义RuntimeException子类异常例子

这样创建异常对象,但没声明,就是b<0,之后根本就没法算,程序停掉,调用者自己改去


public class ExceptionFuShu extends RuntimeException{ExceptionFuShu(String message ){     super(message);}}public class Demo4 {   public int div(int a,int b)     {         if(b<0) {            throw new ExceptionFuShu("除数不能为负数啊!!");            }       return a/b;   }    public static void main(String[] args) {                Demo4 d=new Demo4();         int x=d.div(4, -9);        System.out.println("x="+x);        }    }


四、Object类方法异常例子:

wait

public final void wait(long timeout)                throws InterruptedException【只抛出一个异常】
抛出:
IllegalArgumentException - 如果超时值为负。
IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。
InterruptedException - 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态 被清除。
若调用wait方法,则必须抛出或者用trycatch方法来解决,否则编译失败。而其他两个异常直接停止(RuntimeException类的子类)


五、异常分为两类:

①编译时被检测的异常(抛,trycatch或者抛)

②编译时不被检测的异常(运行时异常:RuntimeException)