异常类

所有的异常类都是Exception的子类或者子孙类,所以如果你要自定义一个异常类,继承Exception类或者其子类就好了。
下面,我们来自定义一个异常类

//新建一个异常类
public class TestException extends Exception{
    public void say(){
        System.out.println("没错我是故意的,我的名字叫做测试异常, TestException");
    }
}

在新建的异常类中我们可以自定义方法,新建异常类后就可以使用这个异常类了,下面来试试吧!

public class Test {
    public static void main(String args[]){
        try{
            throw new TestException();
        }catch (TestException e){
            e.say();
        }
    }
}

注意:我们使用try{}catch(){}来捕捉异常,throw用来抛出一个异常对象,注意,这里抛出的是异常对象。当try语句块中抛出异常后,停止执行try语句块,转而执行catch语句块,catch语句块中如果捕捉多个异常,只要写父类异常即可,相当于是上转型对象了。

    public void sayHello(int a, int b) throws  TestException{
        System.out.println("Hello");
        if( a > b ){
            TestException testException = new TestException();
            testException.say();
            throw testException;
        }
    }

上面使用throw关键字直接抛出了一个异常对象,如果是要定义一个方法,这个方法可能会触发异常,要怎么定义这样的方法呢?使用throws关键字。
以后调用sayHello方法时需要使用try{}catch语句捕获可能的异常或者使用throws关键字定义一个可能抛出异常的方法

在使用中,我发现以下几个点:
在一个代码块中,throw抛出异常必须在代码块的最后;
在catch代码块中可以使用异常对象调用抛出异常类中的方法;
只要异常还没有是使用try……catch……捕获和解决,就会一直抛出下去。调用使用try……catch……解决了异常的方法就不用再处理异常了。
catch()中的参数可以是try捕获异常的父类对象,相当于上转型对象,但是上转型对象不能调用子类自定义方法。

明白四个概念
Exception类:异常类都是Exception类的子类。所以如果要定义一个异常类就要继承Exception类或者其子类。

try……catch……:try负责捕获异常,catch负责给出异常的解决方案。

throw:抛出一个异常对象,抛出异常对象后的两种解决方案。一,不管它,并在方法中申明,就是会抛出这个异常,方法会抛出异常;二,管他,使用try……catch……捕获到这个异常并在catch中做出解决,这样方法不会抛出异常。总而言之,使用throw抛出一个异常后,要么现在解决,或者在方法中throws关键字以后解决,通常是在对象调用这个方法时解决。所以,如果是在主方法中,建议使用try……catch来解决异常,就算打印出这个异常也好,不要使用throws关键字,这样异常就像没发生一样。

throws:定义一个方法,该方法会抛出throws带的异常,一个方法可以抛出多个异常。

总结:触发或者抛出异常的本质上是throw关键字和throws关键字。问题发生了都是要解决的trycatch,但是也可以推迟解决throws。

发现问题:

public class Test {
    public static void main(String args[])  {
        Test test = new Test();
        try {
            test.sayHello();
        } catch (TestException e) {
            e.printStackTrace();
        }
    }
    public  void sayHello() throws TestException {
        System.out.println("hello");
    }
}

在方法中没有throw语句抛出异常也可以使用throws定义方法抛出异常。
throws可以单独用来抛出异常,和throw一样。不过一个是在定义方法时,一个是在方法体中。但是通常throws和throw一起出现,直接使用throws毫不讲理的抛出异常,由于没有使用throw抛出一个对象(没有使用new),其实就是抛出了一个空对象。使用throws加throw方法会抛出throw抛出的异常对象。使用throws加throw加判断可以判断方法哪些情况下方法会抛出异常,哪些情况下不会,但是不管会不会抛出异常对象还是空对象,调用该方法都要做出应对异常的方法。

看下面的代码:

public class Test {
    public static void main(String args[]){
        Test test = new Test();
        try {
            test.sayHello();
        } catch (TestException e) {
            e.say();
        }
    }
    public  void sayHello() throws TestException{
        System.out.println("hello");
        try {
            throw new TestException();
        } catch (TestException e) {
            e.printStackTrace();
        }
    }
}

代码中sayHello()方法throw、throws、try……catch……一起用到了。主方法中调用了sayHello方法,sayHello方法中throw抛出的异常对象被try……catch……解决了。于是这个异常对象不会被方法sayHello的throws关键字抛出,throws抛出了一个空对象,相当于TestException testException = null;主方法也就没有捕捉到相应的异常对象,e.say()也就没有执行。

posted on 2021-12-17 11:34  小白成长变大神  阅读(65)  评论(0编辑  收藏  举报