大聪明教你学Java | throw 和 throws 的区别你知道吗

3,398 阅读4分钟

前言

我们在开发的过程会会遇到各种各样的异常,在 Java 中通常是把异常当作对象来处理。同时在开发中我们要求应用程序需要进行完整的异常处理,以给用户友好的提示,或者修正异常后可以让程序继续执行。我们都知道可以借助 try-catch 来捕获异常,那如何抛出异常呢?没错,就是借助 throw 和 throws 这两个关键字来处理,这两个关键字很像,那它们之间有什么区别呢?下面就听小弟娓娓道来⏩~

throw 和 throws

我们还是先举两个例子👇

🍎🍎示例一:throws🍎🍎

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * @description: Test
 * @author: 庄霸.liziye
 * @create: 2022-03-25 10:23
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        File file=new File("C:\\text.txt");
        FileInputStream fis=new FileInputStream(file);
        byte []b=new byte[10];
        while(fis.read(b)!=-1){
            System.out.println(new String(b));
        }
    }
}

在这里插入图片描述 🍎🍎示例二:throw🍎🍎

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * @description: Test
 * @author: 庄霸.liziye
 * @create: 2022-03-25 10:23
 **/
public class Test {

    public static void main(String[] args) throws MyException {
        File file=new File("C:\\text.txt");
        FileInputStream fis;
        try {
            fis = new FileInputStream(file);
            byte []b=new byte[10];
            while(fis.read(b)!=-1) {
                System.out.println(new String(b));
            }
        } catch (IOException e) {
            //处理捕获到的异常,并抛出一个异常对象
            throw new MyException("这里是自定义异常:" + e.getMessage());
        }
    }
}

/**
 * 自定义异常
 * @description: MyException
 * @author: 庄霸.liziye
 * @create: 2022-03-25 10:23
 **/
class MyException extends Exception{
    private static final long serialVersionUID = 1L;
    public MyException(String info){
        super(info);
    }
}

在这里插入图片描述 通过上面两个例子我们就可以很清晰的看出二者的区别了,对于 throws 而言,当前程序不会对异常进行任何处理,如果出现异常的话,仅仅抛出异常而不会处理异常,对应的异常处理工作则需要上层调用者来负责,如果上层调用者也犯懒的话,那么就继续向上抛出对应的异常,咱们可以通过一个比喻来理解其中的含义👇

用户在使用XXX系统的时候发现了一个Bug,于是用户就给程序员反馈了问题,但是程序员是个小懒蛋,他什么也不想干,就直接跟项目经理反馈了(也就是把这个异常向上抛出了🔝),项目经理也是个懒蛋(内心独白:反正这个问题肯定有人解决,我才不干呢),于是项目经理就把这个问题反馈给了总经理(上层调用者也不解决,继续向上抛出🔝)...

下面我们再看看 throw,它可以自己处理一个异常,处理异常的方式有两种,第一种是自己通过 try-catch 来捕获处理异常;第二种则是抛出一个异常(throws 异常)。老规矩,我们还是做个比喻来帮助大家理解含义👇

用户在使用XXX系统的时候发现了一个Bug,于是用户就给程序员反馈了问题,程序员就开始尝试解决问题(try-catch 来捕获异常),后来发现这个问题有点棘手,自己好像搞不定了,于是就把这个问题以及问题原因跟项目经理反馈了(也就向上抛出了一个具体的异常对象🔝)...

🥝🥝最后我们总结一下 throw 和 throws 的异同🥝🥝

⭕相同点⭕

两者在抛出异常时,他们只管把异常抛出,并不处理异常,由调用者负责处理。

❌不同点❌

① throw 总是出现在方法体里面,用来抛出一个异常,表示在这个地方就有一个异常出现,同时 throw 后面的语句将不再执行;而 throws 是出现在方法名的后面,表示这个方法可能抛出某种异常,就需要由方法的调用者进行异常处理。

② throw 只能抛出一个异常对象;而 throws 可以在方法名后面一次性抛出多个异常,多个异常对象以逗号分隔。

③ throw 抛出异常时,方法的调用者可以不声明或不捕获异常,虽编译器不会报错,但是从开发角度说还是要使用 try-catch 来处理这个异常;而 throws 抛出异常时,方法的调用者需要声明抛出异常或者进行 try-catch 捕获,否则编译会报错。

小结

本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇‍

希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●'◡'●)

如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。

爱你所爱 行你所行 听从你心 无问东西