龙空技术网

“全栈2019”Java异常第八章:throw关键字详解

人人都是程序员 294

前言:

今天小伙伴们对“java常见的异常捕获throw”大致比较着重,朋友们都想要分析一些“java常见的异常捕获throw”的相关资讯。那么小编也在网络上搜集了一些有关“java常见的异常捕获throw””的相关知识,希望看官们能喜欢,朋友们快快来了解一下吧!

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境JDK v11IntelliJ IDEA v2018.3友情提示本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。本章内容针对零基础或基础较差的同学比较友好,可能对于有基础的同学来说很简单,希望大家可以根据自己的实际情况选择继续看完或等待看下一篇文章。谢谢大家的谅解!1.抛砖引玉

请问大家一个问题,如果我写了一个方法,这个方法呢,它会产生异常,但是这个异常我自己不好处理,需要调用我这个方法的人来处理,该如何告诉调用者呢?

假如,这个方法是这样的:

功能是将文本中的字母转为大写,这个方法会产生异常吗?

会。text有可能为空:

为空之后会怎么样呢?

会产生空指针异常NullPointerException,然后程序会停止。怎么做才能程序去处理掉这个异常而不停止呢?

我们可以这样做:

这种做法可取,但如果能将这个潜在的隐患告诉调用者会更好,于是,我们这样做:

这样写了之后呢,还没完,当你使用了throw关键字之后,即意味着此处抛出了一个异常,那么,对于throw抛出的异常处理方式有两种:

第一种,使用try-catch捕获异常:

第二种,使用throws关键字将其声明在方法上,让调用者去处理:

throws关键字我们还没学,后面马上会讲到。

下面开始讲解什么是throw关键字和如何去处理throw抛出的异常。

2.什么是throw关键字?

throw关键字作用是抛出一个异常。

当抛出一个异常时,你要么try-catch,要么使用throws关键字声明在方法上,让调用者去处理这个异常。

3.throw关键字用在何处?

throw关键字用在作用域里面需要抛出异常的地方。

4.怎么使用throw关键字?

在需要抛出异常的地方,使用throw关键字,加上new关键字,再加上异常类型即可。可以看到的是它实际上是抛出了一个异常对象。

5.抛出的异常处理方式一:捕获异常,自行处理

当我们使用throw关键字抛出异常时,我们可以有两种处理方式,第一种是捕获抛出的异常,自行处理。

演示:

请抛出一个异常,然后使用try-catch进行处理。

请观察程序运行结果。

代码:

Main类:

结果:

错误信息:

文字版:

捕获抛出的异常,自行处理。

Exception in thread "main" java.lang.NullPointerException

at main.Main.toUpperCase(Main.java:31)

at main.Main.main(Main.java:11)

从运行结果来看,程序怎么还是有错?我们来看看代码。

首先,我们判断text是否为null:

如果为null,我们将其抛出异常:

对于抛出的异常,我们自行处理了:

好像这一切都挺完美的,但程序依然出错了,看看错误信息:

Exception in thread "main" java.lang.NullPointerException

是一个空指针异常,在哪里发生的呢:

at main.Main.toUpperCase(Main.java:31)

原来是在Main.java文件的31行:

这个错误很好解释,明明我们对text进行了null判断,怎么还会出现空指针异常呢?

那是因为我们在上面对text为null情况做出了抛出异常的处理,这个被抛出的异常又被我们自行捕获处理了,也就是说程序不会停止而是继续往下执行,执行到31行时,这里的text还是null,那么对于null对象去调用方法时就会产生空指针异常。

经过这个事件,我们明白了,有些异常不建议自行处理,建议声明在方法上,由调用者进行处理。

下面就来看看调用者如何处理抛出的异常。

6.抛出的异常处理方式二:声明在方法上,由调用者处理

上一小节,我们将异常抛出,然后自行捕获处理,效果不是特别好,这次我们将由调用者处理被抛出的异常。

演示:

请抛出一个异常,然后在方法上声明方法内可能产生的异常,再由调用者进行处理。

请观察程序运行结果。

代码:

Main类:

结果:

从运行结果来看,程序没有问题。我们回顾程序代码。

首先,我们来看看toUpperCase()方法:

检查text是否为null:

当text为null时,抛出异常:

对于抛出的异常,我们选择的处理方式是在方法上进行声明,交由调用者处理:

我们在main()方法里面调用了toUpperCase()方法,同时也处理了该异常:

执行结果:

我们发现toUpperCase()方法在抛出异常的地方就没再往下执行了:

怎么看出的?根据执行结果可以看出来,如果方法内部抛出异常还继续往下执行的话,那么该方法会产生一个空指针异常。所以,在方法内部抛出异常会导致方法立即跳出。

7.抛出的异常对象类型

我们throw可以抛出哪些异常对象类型?

只要是Throwable类或子类对象都可以。

我们知道单词“throw”是抛的意思,而单词“Throwable”是可抛的意思,所以大家应该能明白throw抛出的异常对象是什么类型的了。

演示:

请抛出Throwable类型对象。

请观察程序运行结果。

代码:

Main类:

结果:

从运行结果来看,这是一个正确的执行结果。

而我们知道Throwable下面有两个子类Error和Exception,它们两个也能被抛出,展示如下:

抛出Exception

抛出Error

我们就不运行它们了。

8.抛出运行时异常

抛出运行时异常?难道还有非运行时异常和运行时异常之分?

是的,有非运行时异常和运行时异常之分。(后面马上会讲解到运行时异常)

什么是非运行时异常?

继承自Exception的异常。

什么是运行时异常?

继承自RuntimeException的异常。

RuntimeException和Exception之间有什么关系?

RuntimeException是Exception的子类。

抛出一个非运行时异常有什么特点?

当我们抛出一个非运行时异常时,我们要么对其try-catch,要么使用throws声明出去。(上面几个小节已经演示的很清楚了)

抛出一个运行时异常有什么特点?

当我们抛出一个运行时异常时,我们可以不对其try-catch,也不必使用thorws声明出去。

这里我们就来演示一下抛出一个运行时异常。

演示:

请抛出一个运行时异常。

请观察程序运行结果。

代码:

Main类:

结果:

从运行结果来看,程序演示了运行时异常不必try-catch和throws。但是这个例子一点实用性都没有,一点也不接地气,我们来看一个实际开发中遇到的运行时异常。

改写我们的Main类:

这就写完了?从代码中一点也看不出运行时异常的痕迹啊,程序执行完你看结果就知道了。

程序报了一个ArithmeticException算术异常,我们来看看ArithmeticException异常类:

大家看到了吗?ArithmeticException继承自RuntimeException,它是一个运行时异常,这也就是为什么我们明明知道这里有可能发生异常,编译器却没有提醒我们对其try-catch或thorws,仍然编译通过,因为它是一个运行时异常,不强制你try-catch或thorws。

总结throw关键字作用是抛出一个异常。throw关键字可抛出Throwable类或子类对象。throw关键字抛出的异常处理方式有两种:try-catch和throws。

至此,Java中throw关键字相关内容讲解先告一段落,更多内容请持续关注。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

“全栈2019”Java异常第七章:try-catch-finally组合方式

下一章

“全栈2019”Java异常第九章:throws关键字详解

学习小组

加入同步学习小组,共同交流与进步。

方式一:关注头条号Gorhaf,私信“Java学习小组”。方式二:关注公众号Gorhaf,回复“Java学习小组”。全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

版权声明

原创不易,未经允许不得转载!

标签: #java常见的异常捕获throw