文档章节

Java异常时的返回值

trayvon
 trayvon
发布于 2015/11/09 20:43
字数 896
阅读 1286
收藏 4

先来看一个小程序:

public class JavaException
{
         public static void main(String[] args)
         {
                   System.out.println(test());
         }
         public static int test()
         {
                   int i=0;
                   try
                   {
                            i = 1/0;//抛出非受检异常
                            i=100;
                            System.out.println("in try 抛出异常后不会执行到这里!");
                   }
                   catch(Exception e)
                   {
                            i=1;
                            System.out.println("in catch i="+i);
                            return i;     //注释1
                   }
                   finally
                   {
                            i=2;
                            System.out.println("in finally i="+i);
                   }
                   i=3;
                   return i;
         }
}

首先来思考一个问题,当我们把注释1那一行也就是catch中的return 语句注释掉和不注释掉程序的输出最后的返回结果分别是什么?

如果不把catch中的return注释掉,返回结果是1,而注释掉catch中的return语句返回结果是3

为什么呢?我们来调试一下程序,在抛出异常的地方也就是1/0那一行打上断点,然后debug

我用的是eclipse,所以直接快捷键F6(跳过函数,把函数当做一个整体执行,不进入函数),直接跳到了catch,所以的确是1/0这里出了问题。

继续F6,直到catch中的return语句。

继续单步执行,发现直接跳过了return语句,继续执行finally语句块,继续F6单步执行,发现执行完finally块就直接执行catch块中的return了。

现在我们把catch块中的return语句注释掉来重新调试看一看程序是怎样执行的。

程序还是在1/0的地方抛出异常,然后执行catch块中的语句,再执行finally块中的语句。不过当catch块中没有return语句是,就会执行finally块后面的语句直到遇到return语句。

 

所以当catch中有return时,test()返回值是1,在catch块中没有return语句时,test()的返回值是3

那么问题来了,为什么当catch中有returntest()的返回值是1,而不是2finally中明明已经给i赋值为2了,为什么没有返回2

在回答这个问题之前,我们先来了解一下java中两种退出方法的方式,

1. 遇到一个返回的指令(return语句)

2. 遇到一个异常,并且没有搜索到异常处理器,不会给调用返回任何值。

所以当catch中有return时,程序遇到return时就被标记了,finally块中只是执行最后的清理工作,如数据库连接的释放等。但是并不会修改return这个语句。

注意:不要在finally块中加入return语句,如果你在finally加入return就会改变你的return语句。如果你使用eclipse这样的IDE,当在finally中有return就会提醒你的代码不正常。

ps:eclipse中常用的调试快捷键的作用

F5(Step Into):就是单步进入,进入是指当代码遇到一个调用方法时进入调用方法的方法体中

F6(Step Over):单步跳过,就是当这一步是一个方法时就把它当做一个整体执行,不进入方法中

F7(Step Return):跳出,就是直接跳出当前正在执行的方法体,返回到调用

F8(Resume):重新开始,当执行到断点的时候,程序被挂起,F8的作用就是让程序继续执行,直到下一个断点重新被挂起


© 著作权归作者所有

trayvon
粉丝 16
博文 141
码字总数 214168
作品 1
程序员
私信 提问
Java自定义Exception

这里总结一下Java的Exception,并实现一个自定义Exception类。 总结: Throwable对象分为两种类型:Error(表示编译时和系统错误);Exception(在Java类库、用户方法以及运行时故障中抛出的异常...

Triangle23
2014/12/02
1K
1
Java8的CompletableFuture详解

Java5中,Future以及相关使用方法提供了异步执行任务的能力,但对于结果的获取却不是很方便,只能通过get()方法阻塞住调用线程直至计算完成返回结果或者isDone()方法轮询的方式得到任务结果,...

hensemlee
01/29
222
0
Java编程中那些再熟悉不过的知识点(持续更新)

本文来自于我的慕课网手记:Java编程中那些再熟悉不过的知识点,转载请保留链接 ;) 1. 面向对象和面向过程的区别 2. Java 语言有哪些特点 3. 关于 JVM JDK 和 JRE 最详细通俗的解答 4. Oracl...

小码哥的freestyle
04/11
0
0
Android JNI学习(四)——JNI的常用方法的中文API

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
2018/05/09
0
0
Java的OutOfMemoryError和StackOverflowError

Java的OutOfMemoryError和StackOverflowError Java Virtual Machine定义了两种异常:OutOfMemoryError与StackOverflowError。 OutOfMemoryError:Java启动一个线程时,JVM没有足够的内存空间...

开开心心过
2017/10/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Leetcode PHP题解--D118 350. Intersection of Two Arrays II

D118 350. Intersection of Two Arrays II 题目链接 350. Intersection of Two Arrays II 题目分析 返回给定两个数组的交集。 思路 从数量较多的那个数组开始去另一个数组寻找是否元素存在,...

skys215
10分钟前
1
0
从源码上分析Android View保存数据状态

在Android开发旅途中,经常会遇到系统控件无法满足我们的视觉,交互效果,这个时候我们常常需要自己自定义控件来满足我们的需求。在这个开发探索过程中,我们不可避免得遇到View要保存状态信...

shzwork
11分钟前
2
0
请问AD603AQ和AD603AR有什么区别?

  AD603AQ和AD603AR只是在封装上的区别,前者是双列直插式,后者是贴片式,AD603A系列的温度都是在—40摄氏度到+85摄氏度之间,AD603还有一个系列是AD603S,它的温度是在—55摄氏度到+125摄...

仙溪
12分钟前
1
0
Linux /etc/profile 配置文件修改

1. 执行命令: vi /etc/profile 去类似windows 配置环境变量, 2.修改完,立即生效命令: source /etc/profile

kuchawyz
13分钟前
2
0
对于小白来说素描怎么入门?怎么学习?

素描初学者怎样入门?初学者怎样才能画好素描绘画?画好素描绘画有哪些技巧?想必这些问题都是绘画初学者们比较伤脑筋的问题,那么初学者到底怎样才能画好素描绘画呢?今天收集整理了关于素描...

huihuajiaocheng
14分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部