前言
我们在开发的过程会会遇到各种各样的异常,在 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 捕获,否则编译会报错。
小结
本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇
希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●'◡'●)
如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。
爱你所爱 行你所行 听从你心 无问东西