java,麻烦深入讲解为什么结果是1?而不是2。

问题描述

public class Test {public static void main(String[] args) {System.out.println(new Test().test());}static int test() {int x = 1;try {return x;}finally {++x;}}}

解决方案

昨天没时间,今天继续补全,既然是深入,就深入点咯 记得给我加分哈~~写了个简单的类 static int test() { int x=5; try { return x; } finally { x=10; } } 编译后的字节码为这里说一下,对于try catch finally的编译,编译器会把finally里的代码附在每一个分支的后面 static int test(); 0 iconst_5 1 istore_0 [x] //存在局部变量表0位置 2 iload_0 [x] //读取0位置到操作数栈//下边是finally代码块,附在成功分支后面 3 istore_2 //另存在2位置 4 bipush 10 //10放入操作数栈 6 istore_0 [x] //存在0位置,所以,这时候0位置的变量为10 7 iload_2 //读取2号位置,这时是5 8 ireturn //返回5//下面是异常分子处理 9 astore_1 10 bipush 10 12 istore_0 [x] 13 aload_1 14 athrow
解决方案二:
因为在运行到return时,该返回值/地址就已经被记录所以finally里的改变不会起作用但假如返回值为引用类型,finally块是可以改变其内容的如下例子~ 想想会返回什么public class Test { public static void main(String[] args) { System.out.println(new Test().test().toString()); } static StringBuffer test() { StringBuffer x = new StringBuffer("hi"); try { return x; } finally { x.append("hello"); } } }

时间: 2024-09-22 19:07:46

java,麻烦深入讲解为什么结果是1?而不是2。的相关文章

Java 多线程实例讲解(一)_java

Java多线程(一) 多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌握了.主要包括: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的

google maps-我怎么能够从Java的keytool中获得 MD5 fingerprint,而不仅仅是SHA-1?

问题描述 我怎么能够从Java的keytool中获得 MD5 fingerprint,而不仅仅是SHA-1? 因为我正在我的应用程序中使用google地图,我需要测试证书的MD5 fingerprint.我是像下边这么做的: (我从bin文件中的C:Documents and SettingsAdministrator.android复制了debug.keystore文件) C:Program FilesJavajdk1.7.0bin>keytool -list -alias androidde

java 删除文件夹中的所有内容而不删除文件夹本身的实例_java

实例如下: package com.xx; import java.io.File; public class Test { public static void main(String[] args) { String fileRoot = "C:/Users/xx/Desktop/xx/xxx"; delFolder(fileRoot); System.out.println("deleted"); } // // 删除完文件后删除文件夹 // // param

java发送邮件示例讲解_java

本文实例讲解了java发邮件的详细过程,供大家参考,具体内容如下 1.邮件协议 发邮件的:SMTP (Simple Mail Transport  Protocal) 收邮件的协议:pop3 (Post Office Protocal 3) IMAP 新协议 发邮件也可以收邮件. (一步步的与服务器交互) SMTP : 2.收发邮件的过程: 一般情况下,smtp和pop3是两个服务器(主机). Smtp邮件的端口为25. POP3 端口 为110. 发邮件示例 1).安装foxmail: 2).

"Java:comp/env/"讲解与JNDI

 我们在使用JNDI调用某个对象时,会有下述两种方式,那么       context.lookup("java:comp/env/XXX")和直接context.lookup("XXX")的有什么区别呢?        其实说得简单点:context.lookup("java:comp/env/XXX")只能用在J2EE环境,即是如果你自己写一个main函数,想通过context.lookup("java:comp/env/XXX&q

java,麻烦详细告诉为什么结果是'B and A', 而不是‘B and B’ ?????????

问题描述 public class Cons {public static void main(String[] args) {A a1 = new A();A a2 = new B();B b = new B();C c = new C();D d = new D();System.out.println(a2.show(b)); // ????????????}}class A {public String show(D obj) {return ("A and D");}publ

实例讲解Java批量插入、更新数据_java

Java的批量添加数据,多个字段同时添加多条数据,我不知道你遇到过没有.今天我们就以一个具体的实例来说一下Java的批量添加数据,面向的是Oracle数据库. 前台页面: <span style="font-size:14px;"><body class="main_body" scroll="no"> <div class="employee_gun_dong"> <form nam

Java Web应用程序实现基础的文件下载功能的实例讲解_java

基础思路:之前的思路一直是弹出一个框问用户想要存放文件的位置,然后我再生成个文件放到那.然而我这个想法并没有成功. 点击链接来下载文件的方式很简便,后台把文件流输出来,通过浏览器实现下载功能,包括询问位置与文件存放,大多数浏览器会配置一个固定位置,不一定每次都问. 前端就非常简单了,一个<a>标签,href="后台方法地址",如果你的需求不能直接用超链接方式,可以在js里写 window.location.href ="后台方法地址". 这样跳转到后台方

Java ArrayList 实现实例讲解_java

 ArrayList概述:  ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存.     ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类.     ArrayList实现了Serializable接口,因此