Java异常时的返回值

先来看一个小程序:

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中有return时test()的返回值是1,而不是2,finally中明明已经给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的作用就是让程序继续执行,直到下一个断点重新被挂起

时间: 2024-10-11 11:26:31

Java异常时的返回值的相关文章

mybatis查询结果为空时的返回值问题

先贴出配置文件 <select id="queryUserGroupByName" resultType="UserGroupModel"> select * from user_group where roleName='user' and groupName=#{groupName} </select> 对应的mapper List<UserGroupModel>queryUserGroupByName(String grou

Java线程中带有返回值的线程Callable

在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.现在Java终于有可返回值的任务(也可以叫做线程)了. 可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口. 执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了. 下面是个很简单的例子: package com.lyc import java.util.co

Ajax详解及使用Ajax时的返回值类型有哪些?

Ajax详解 Ajax = 异步 JavaScript 和 XML. Ajax 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的网页(不使用 Ajax)如果需要更新内容,必需重载整个网页面. (注:图片来自网络) 如何使用Ajax技术 首先,需要获取XMLHttpRequest对象: var xhr; xhr = new XMLHttpRequest(); XMLH

JAVA finally字句的异常丢失和返回值覆盖解析

转载:http://blog.csdn.net/sureyonder/article/details/5560538 Java虚拟机在每个try语句块和与其相关的catch子句的结尾 处都会“调用”finally子句的子例程.实际上,finally子句在方法内部的表现很象“微型子例程”.finally子句正常结束后-指的是finally子句中最后一条语句正常执行完毕,不包括抛出异常,或执行return.continue.break等情况,隶属于这个finally子句的微型子例程执行“返回”操作.

Java Callable接口——有返回值的线程

实际开发过程中,我们常常需要等待一批线程都返回结果后,才能继续执行.<线程等待--CountDownLatch使用>中我们介绍了CountDownLatch的使用,通过使用CountDownLatch,可以实现线程等待. JDK 1.8实现了一种更好的方式,实现线程等待与获取线程返回值,那就是Callable接口,下面我们来看看具体代码. package com.coshaho.learn; import java.util.Random; import java.util.concurren

&lt;Java&gt; 类 方法 参数传递 返回值类

类 用class关键字可以传建一个类. 类中可以设置两种类型的元素:字段(有时被称为数据成员),方法(有时被称为成员函数) 字段  字段即数据成员 字段可以是任何类型的对象(可以是是引用类型,也可以是基本类型) (3) 每个对象都有用来存储其字段的空间,普通字段是不可以在对象间共享的 两个对象都各自有他们自己的字段,虽然字段是同名的,但是这两个对象对这个字段的操作都是对自己的字段的操作,不能操作另一个对象的. 但是static修饰的字段,是在对象内共享的,他只有一份空间,不管是那个对象,对这个字

Java基础---Java中带参数返回值方法的使用(四十)

Java 中带参带返回值方法的使用 如果方法既包含参数,又带有返回值,我们称为带参带返回值的方法. 例如:下面的代码,定义了一个 show 方法,带有一个参数 name ,方法执行后返回一个 String 类型的结果 调用带参带返回值的方法: 运行结果: 代码: import java.util.Arrays; public class HelloWorld {    public static void main(String[] args) {  HelloWorld hello = new

jquery的ajax方法在无返回值时的返回值类型设定

2013-12-07 19:15:29|  分类: Web前端 |  标签:html  |举报|字号 订阅 $.ajax({ type: "post", url: "index.php", data: "id="+uid, dataType:"json", success : function(){ alert(1); }, error: function(){ alert(0); } }); 在jquery的ajax方法中,

java调用shell获取返回值

转自:http://blog.csdn.net/tengdazhang770960436/article/details/12014839 1.shell文件return.sh echo 1 echo 2 echo 3 2.java文件Test.java [java] view plain copy import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStreamReader