一、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
- 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的 中断状态 被清除。
五、异常分为两类:
①编译时被检测的异常(抛,trycatch或者抛)
②编译时不被检测的异常(运行时异常:RuntimeException)