1 2 3 try{ 4 5 }catch(Exception e){ 6 if(e.getMessage().contains("123456798")) //使用e.getMessage().contains("")表示你获取的报错信息中包含哪些内容就进行if操作 7 { 8 9 } 10 else{ 11 e.printStackTrace();//否则直接输出异常信息 12 } 13 }
问题 :try里面return a , catch里面return b , finally里面return c ,最后结果怎么样?
猜测:在java 中 finally代码一定会执行 ,但是fun()方法只能返回一个变量 ,于是猜测最终执行finally中的return 语句。
测试代码1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
public class demo { public static void main(String[] args) { int number = 1 ; int fun = fun(number); System.out.println(fun); } public static int fun(int number){ try { return 1/0; } catch (ArithmeticException e){ number = 2; return number; } finally { number = 3; return number; } } } 输出结果: 3
上述代码貌似满足猜测结论
但是若把代码换成:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
public class demo { public static void main(String[] args) { int number = 1 ; int fun = fun(number); System.out.println(fun); } public static int fun(int number){ try { return 1/0; } catch (ArithmeticException e){ //number = 2; return number; } finally { //number = 3; return number++; } } } 输出结果: 1
上述代码中的finally代码块 编译器一直提示:
“finally”块不能正常完成。
“return”在“finally”块内被阻止。
从未使用在’number ++’处更改的值找到原因:return number++ 等效于 int x = number++; return x; 因此编译器提示’number++’未使用。因此测试代码2 依旧符合猜测。
查找资料可以做出以下总结:
可以参考http://www.2cto.com/kf/201010/76754.html这篇文章,也可以参考《深入Java虚拟机:JVM高级特性与最佳实践》第6章中对属性表集合的讲解部分。对于含有return语句的情况,这里我们可以简单地总结如下:
try语句在返回前,将其他所有的操作执行完,保留好要返回的值,而后转入执行finally中的语句,而后分为以下三种情况: 情况一:如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。 情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。 情况三:如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况,: 1)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。 2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
————————————————
参考链接:https://blog.csdn.net/ns_code/article/details/17485221赏谢谢你请我吃糖果
支付宝
微信
1 2 3 try{ 4 5 }catch(Exception e){ 6 if(e.getMessage().contains("123456798")) //使用e.getMessage().contains("")表示你获取的报错信息中包含哪些内容就进行if操作 7 { 8 9 } 10 else{ 11 e.printStackTrace();//否则直接输出异常信息 12 } 13 }
转载于:https://www.cnblogs.com/zzzzw/p/4945922.html
数据库连接池中关闭连接其实就是把连接归还给数据库连接池当中
1、不管是否出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
代码片段:public String CreatOrder(Cart cart, Integer userId) { Connection conn=null; String orderId=null; try { conn= DButil.getConnection(); //每次生成一个订单就会同时生成一个商品项同一个id //订单号是唯一的:时间戳+userId orderId=System.currentTimeMillis()+""+userId; //生成一个订单对象 Order order =new Order(orderId,new Date(),cart.getTotalPrice(),0,userId); //订单保存在数据库中 orderDao.saveOrder(conn,order); //遍历购物车中每一个商品项转化为订单项 for (Map.Entry<Integer, CartItem>entry: cart.getItems().entrySet()){ CartItem cartItem =entry.getValue();//拿到每一个商品项 OrderItem orderItem =new OrderItem(null,cartItem.getName(),cartItem.getCount(),cartItem.getPrice(),cartItem.getTotalPrice(),orderId); orderItemDao.saveOrderItem(conn,orderItem); Book book = bookDao.queryBookById(conn,cartItem.getId()); book.setSales(book.getSales()+cartItem.getCount()); book.setStock(book.getStock()-cartItem.getCount()); bookDao.updateBook(conn,book); } cart.clear(); return orderId; } catch (SQLException e) { e.printStackTrace(); }finally { //此时关闭连接, DButil.close(conn,null); } return orderId; }
在使用swift的时候可能会出现异常,对异常的接触比swift要早,在学java的时候就使用过了。现在swift中也出现。这里说明一下载swift中怎么使用,通常有三种,这里只说一下最常见的一种。
func Try_Catch(){
// 1 获取资源
guard let path = (Bundle.main).path(forResource: "Info", ofType: ".plist") else{
return
}
print("-----\(path)")
// 2 获取Data
// 异常处理
// 系统帮助我们处理异常,如果该方法出现了异常,则该方法则返回nil。反之返回对应的对象
guard let jsonData = try? (Data(contentsOf: URL(fileURLWithPath: (path))))else {
return
}
print("--------\(jsonData)")
// 解析Data
guard let anyObject = try? (JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)) else {
return
}
print("------\(anyObject)")
}