throw
throw 语句用于抛出异常,例如 throw new EOFException()。
 
throws
当使用throw 语句抛出checked 异常后,可以不用捕获异常并处理,而是使用throws 语句传递异常给本方法的调用者,调用者根据自身情况对异常进行捕获或者继续传递异常给它的调用者,如下:
public void read () throws IOException(
xxx
throw new IOException();
}
当调用了包含throws checked 异常语句的方法后,可以用同样方式处理。
 
try/catch
如果打算捕获并处理异常,那么可以使用 try/catch 语句块,一般格式如下:
try{
xxx
}
catch (IOException e){
xxx
}
catch (Exception e){
xxx
}
在Java SE 7中,也可以合并多个catch语句,如下:
try{
xxx
}
catch (IOException e | Exception e){
xxx
}
如果在 try 语句块中的任何代码抛出了一个在 catch 语句块中捕获的异常类,那么程序将跳过 try 语句块的其余代码并且执行对应 catch 语句块中的代码。如果方法中的任何代码拋出了一个在 catch 语句块中没有声明的异常类型,那么这个方法就会立刻退出。
catch 语句块在处理异常时,可以对异常进行包装后重新抛出,如下:
try{
xxx
}
catch (SQLException e){
throw new ServletException ("xxxx") ;
}
 
finally
不管try 语句块是否抛出异常,甚至在try 语句块里有return 语句,finally 语句块中的代码最后都会被执行。它通常用来回收系统资源,如下:
InputStream in = ..
try{
xxx
}
finally{
in.close();
}
也可以带有catch 语句块,如下:
InputStream in = ..
try{
xxx
}
catch (IOException e){
xxx
}
finally{
in.close();
}
注意,当执行了System.exit()、JVM崩溃、当前线程被其他线程中断或者杀死,那么finally 语句块不会执行。
 
return
return 是用来退出当前方法,并返回一个值给调用者。
 
综合
看一个例子:
public class Demo {
public static int test() {
int x = 1;
try {
return ++x;
} catch (Exception e) {
e.printStackTrace();
} finally {
++x;
}
return x;
}
 
public static void main(String[] args) throws Exception {
int y = test();
System.out.println(y);
}
}
 
以上例子中,最终输出2。
 
原因是什么?
翻看官方的jvm规范就会把一切的谜团解开了:
If the try clause executes a return, the compiled code does the following:
Saves the return value (if any) in a local variable.
Executes a jsr to the code for the finally clause.
Upon return from the finally clause, returns the value saved in the local variable.
简单翻译下:
如果try语句里有return,那么代码的行为如下:
1.如果有返回值,就把返回值保存到局部变量中
2.执行jsr指令跳到finally语句里执行
3.执行完finally语句后,返回之前保存在局部变量表里的值
根据上面的说明就可以轻易地解释为什么是2了。
当执行到return ++x;时,jvm在执行完++x后会在局部变量表里另外分配一个空间来保存当前x的值。
注意,现在还没把值返回给y,而是继续执行finally语句里的语句。等执行完后再把之前保存的值(是2不是x)返回给y。所以就有了y是2不是3的情况。
其实这里还有一点要注意的是,如果你在finally里也用了return语句,比如return +xx。那么y会是3。因为规范规定了,当try和finally里都有return时,会忽略try的return,而使用finally的return。
 
查看Test.class的字节码我们同样也可以很轻松地知道为什么是2而不是3:
大概讲讲指令操作顺序:
iconst_1: 把常数1进栈 ---> istore_1: 栈顶元素出栈并把元素保存在本地变量表的第二个位置里(下标为1的位置里) ---> iinc 1, 1 : 本地变量表的第二个元素自增1 --->iload_1:第二个元素进栈 ---> istore_2:栈顶元素出栈并把元素保存在本地变量表的第2个位置里 ---> iinc 1, 1 : 本地变量表的第二个元素自增1 ---> iload_2:第二个元素进栈 (注意,此时栈顶元素为2)---> ireturn:返回栈顶元素。
后面的指令是要在2-7行出现异常时在跳到12行的,这个例子没出现异常,不用关注。
上面流程栈和本地变量表的情况如下图:
 
 
 
参考
https://www.cnblogs.com/averey/p/4379646.html

throw throws try catch finally return的更多相关文章

  1. 【Java】异常 —— throw, throws, try catch 相关内容

    嗯……面试考到了这个,又是一个如无意外 那么接下来就总结吧 一.什么是异常 程序运行过程中发生的异常事件. RuntimeException通常是因为编程员因为疏忽没有检查而引起的错误. 二.Exce ...

  2. Java throw throws try...catch区别

    java里的异常多种多样,这是一种非常有用的机制,它能帮助我们处理那些我们未知的错误,在java里,关于异常的有throw throws,还有一个try catch 程序块.接下来我们挨个看看这几个的 ...

  3. 异常处理(throw,throws,try,catch,finally)

    一.异常 1.定义:程序在运行时出现的不正确的情况. 2.由来:问题也是生活中的事物,也可以被Java描述,并被封装成对象. 其实就是Java对不正常情况进行描述后的对象体现. 3.划分:Java对于 ...

  4. final finalize finally throw throws try catch

    什么是finalize()方法 finalize()方法什么时候被调用 参见网址 析构函数(finalization)的目的是什么 final 和 finalize 的区别 final以下参见网址 f ...

  5. java异常处理之throw, throws,try和catch

    转自 http://blog.csdn.net/zhouyong80/article/details/1907799  程序运行过程中可能会出现异常情况,比如被0除.对负数计算平方根等,还有可能会出现 ...

  6. 顺平讲try catch finally throw throws(精华)

    try catch finally  有点像if else语句 还有像javascript的服务器执行成功后的回调函数,success:function(){ 进行处理 }; throws的意思是将异 ...

  7. throws、throw和try catch

    在学习代理模式的时候,编写动态生成代理类.java文件时,用try{}catch(){}捕获异常发现catch(Exception e)报错,得换成catch(Throwable e),然后又查了查两 ...

  8. java:异常机制(try,catch,finally,throw,throws,自定义异常)

    * String类中的格式化字符串的方法: * public static String format(String format, Object... args):使用指定的格式字符串和参数返回一个 ...

  9. try-catch和throw,throws的区别

    java里的异常多种多样,这是一种非常有用的机制,它能帮助我们处理那些我们未知的错误,在java里,关于异常的有throw throws,还有一个try catch 程序块.接下来我们挨个看看这几个的 ...

随机推荐

  1. LR与LR?

    目录 逻辑回归与线性回归 逻辑回归 1.建立目标函数 2. 梯度求解 3. 实现 线性回归 1. 建立目标函数 2. 求解 3. 实现 逻辑回归与交叉熵 逻辑回归与线性回归 逻辑回归 线性回归 目标函 ...

  2. [SCOI2013]摩托车交易 题解

    思路分析 为了让交易额尽量大,显然我们需要尽量多地买入.对于每个城市,到达这个城市时携带的黄金受到几个条件的影响:之前卖出的黄金,之前能买入的最多的黄金,前一个城市到当前城市的路径上的最小边权.既然不 ...

  3. 字段在class文件中的存在形式——FieldInfo

    每个字段(Field)都有field_info结构所定义,一个class文件中,不会有两个字段同时具有相同的名字和描述符 name_index:值为一个整数(常量池表中的有效索引),例如name_in ...

  4. oracle之回顾二

    TCL 1.  事务(Transaction) 事务(Transaction)是一个操作序列.这些操作要么都做, 要么都不做, 是一个不可分割的工作单元, 是数据库环境中的最小工作单元. 1.1 事务 ...

  5. idea创建mybatis的逆向工程:generator

    1在工程的目录下配置mybatis-generator插件 <build> <plugins> <!-- mybatis逆向工程 --> <plugin> ...

  6. synchronized的实现原理——对象头解密

    前言 并发编程式Java基础,同时也是Java最难的一部分,因为与底层操作系统和硬件息息相关,并且程序难以调试.本系列就从synchronized原理开始,逐步深入,领会并发编程之美. 正文 基础稍微 ...

  7. 力扣Leetcode 560. 和为K的子数组

    和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...

  8. 力扣leetcode 56. 合并区间

    56. 合并区间 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: ...

  9. python练习 数字不同数之和+人名最多数统计

    数字不同数之和 描述 获得用户输入的一个整数N,输出N中所出现不同数字的和.‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬ ...

  10. Android开发,java开发程序员常见面试题,求100-200之间的质数,java逻辑代码

    public class aa{ public static void main (String args []){ //author:qq986945193 for (int i = 100;i&l ...