输出为什么是0,而不是1

public static int foo() {
int x = 0;
try {
return x;
} finally {
++x;
}
}

public static void main(String[] args) {
int res = foo();
System.out.println(res);
}

JVM会将finally中代码块内容复制到try和catch中正常return和异常throw 之前 ,这也是finally一定会执行的原因,这样不应该先执行x++,后return x吗?

3个回答

return x;
表面上看是return x这个变量,但是实际上是return x的值。

不知道你是不是了解qbasic语言,大学或者高中都是教的。
在这种语言里,我们不使用return语句,而是用一个和函数名相同的隐含变量表示返回值
比如
Function Add(a, b)
x = a + b
Add = x
End Function
如果是下面的代码
Function Add(a, b)
x = a + b
Add = x
x = x + 1
End Function
显然函数返回的结果还是a+b,而不是a+b+1
在Java里,用了return语句,但是本质上,编译器还是会使用一个隐含变量作为返回值
而return语句才对这个隐含变量赋值
所以即便x++在return后执行,也无法改变返回值。

sinat_39397107
日狗少女小星星 回复贵阳开挖机的数马善福程序写得最好: 我好想理解错了,finally语句在try和catch语句中的return执行后、返回前执行
3 个月之前 回复
caozhy
贵阳老马马善福专门编写代码的老马就是我! 回复日狗少女小星星: 先执行了return,再执行的finally
3 个月之前 回复
sinat_39397107
日狗少女小星星 JVM会将finally中代码块内容复制到try和catch中正常return和异常throw 之前 吧,这是finally一定会执行的原因,这样不用改先执行x++,后return x吗?
3 个月之前 回复

因为try里边直接return x了,此时x 是 0

Function Add(a, b)
x = a + b
Add = x
End Function
如果是下面的代码
Function Add(a, b)
x = a + b
Add = x
x = x + 1
End Function
显然函数返回的结果还是a+b,而不是a+b+1
在Java里,用了return语句,但是本质上,编译器还是会使用一个隐含变量作为返回值
而return语句才对这个隐含变量赋值
所以即便x++在return后执行,也无法改变返回值。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
为什么是0,不是1
int i=0; rni=i++; rnSystem.out.println(i); rnrn打印出来的是0,为什么不是1,不是要先赋值后自加1吗?
为什么是0不是1
int i = 0; i = i++; System.out.println(i); 代码如上,为什么输出的i是0而不是1呢? 来一起看一下上面那段代码都做了什么: int oldValue = i; i = i + 1; i = oldValue; 换句话说,这是一个普遍的误解,增量是最后发生的,表达式赋值之后自增才会立即执行。
为什么空类的大小是1而不是0?
试想,如果一个类的大小是0,那还可以初始化吗?有什么意义呢?为此编译器就自动给空类加了一个字节,让其可以实例化成具体的对象。
为什么输出是1, 而不是实际的地址
#include rnusing namespace std;rnclass Arnrnpublic:rn int fun1();rn int fun2();rn;rnint main(int argc, char **argv)rnrn cout<<"abc.fun1 " << &A::fun1 <<&A::fun2<
为什么是1而不是12?
一程序rn#include "stdio.h"rnrnstruct Vecrnrn float x, y, z;rn;rnrnint main()rnrn Vec t[10];rn printf("%d\n",&(t[1]));rn printf("%d\n",&(t[0]));rn printf("%d\n",&(t[1])-&(t[0]));rnrn return 0;rnrnrn结果为rn-1075565480rn-1075565492rn1rnrn根据前两行来看,第3行不应该是12么,为什么结果是1?rnPS:本人无分,只有感谢。
为什么显示的是1而不是walker
DataTable dt = new DataTable("walker");rn rn //////////////////////////////////////////////////rn dt.Columns.Add("id",Type.GetType("System.String"));rn dt.Columns.Add("name",Type.GetType("System.String")); rn dt.Columns["id"].AllowDBNull = true;rn dt.PrimaryKey = new DataColumn[] dt.Columns["id"]; rn ///////////////////////////////////////////rn DataRow dr = dt.NewRow();rn DataRow dr1 = dt.NewRow();rn dr["id"]="1";rn dr["name"]="walker";rn dr1["id"]="2";rn dr1["name"]="sdsds";rn dt.Rows.Add(dr);rn dt.Rows.Add(dr1);rn ////////////////////////////////////////////rn DataSet ds = new DataSet();rn ds.Tables.Add(dt);rn string strExpr;rn strExpr = "name='walker'";rn DataRow[] foundRows;rn foundRows = ds.Tables[0].Select(strExpr); rn for(int i = 0; i < foundRows.Length; i ++)rn rn MessageBox.Show(foundRows[i][0].ToString());rnrn
为什么输出结果不是0
#include rn#include rnusing namespace std;rnstruct CLSrnrn int m_i;rn CLS( int i ) : m_i(i) rn CLS()rn rn CLS(0);rn rn;rnint main()rnrn CLS obj;rn cout << obj.m_i << endl;rn return 0;rnrnrn输出结果为一个奇怪的数字,为什么不是0?rn希望各位指教!谢谢!
[转贴]为什么输出不是0?
class CLSrnrnpublic:rn int m_i;rn CLS( int i ) m_i = i;rn CLS()rn rn CLS(0);rn rn;rnrnint main(int argc, char* argv[])rnrn CLS obj;rn cout << obj.m_i << endl;rnrnrn为什么输出不是0呢??rnrn----转自南大小百合*CPlusPlus版----
为什么输出不是0呢????
class CLS rn rn public: rn int m_i; rn CLS( int i ) : m_i(i) rn CLS() rn rn CLS(0); rn rn; rnrnvoid main() rnrnCLS obj; rncout << obj.m_i << endl; rn rn rn小弟是超级初学者,很迷惑!!!!!!!
为什么C语言中printf("%d",x-->(x+y));输出的是1呢,而不是0?
最近我在做练习的时候遇到了这样一个问题,请大家帮忙!rn题目是这样:rnint x=1,y=0;rn求x-->(x+y)的值?rn我用printf("%d",x-->(x+y));rn在VC++6.0,输出的是0;rn但是在Tubor c2.0下,确是1,不知道为什么?rnrn还有的问题就是C语言是怎样解析表达式的!rn麻烦大家了!
i=i++;后输出i为什么是0而不是1?(高分请教)
i=i++;后输出i为什么是0而不是1?谢谢!
为什么这段程序输出是18而不是是17?
为什么这段程序输出是18而不是是17?rnrnrnclass J_SuperClassrnrn int m_data;rn rn J_SuperClass()rn rn mb_add(1);rn rn rn public void mb_add(int i)rn rn m_data += i;rn rn rn public void mb_print()rn rn System.out.println(m_data);rn rnrnrnclass J_SubClass extends J_SuperClassrnrn J_SubClass()rn rn mb_add(2);rn rn rn public void mb_add(int i)rn rn m_data += i*2;rn rnrnrnpublic class J_TestClassrnrn public static void mb_method(J_SuperClass a)rn rn a.mb_add(6);rn a.mb_print();rn rn rn public static void main(String args[])rn rn mb_method(new J_SubClass());rn rn
为什么输出结果不是1
enum orientation : byte rn rn north=1,rn south=2,rn east=3,rn west=4rn rn class Programrn rn static void Main(string[] args)rn rn orientation myDirection = orientation.north;rn Console.WriteLine("myDirection=0",myDirection);rn Console.ReadKey();rn rn rnrn
ROUND(1.905,2)为什么是1。9而不是1。91
如题rnround(1.905*1,2)=1.9 rn为什么不是1。91呢!!rnrn有什么办法,可以实现出1。91的结果,请大家帮帮忙,谢谢!!
为什么数组下标要是0到N-1,而不是1到N?
为什么数组下标是0到N-1而不是1到N?rn这样可以避免一些不小心的错误和方便记忆啊。rn
1/5为什么会等于0?而不是0.2?郁闷
decimal days;rn days = 1 / 5;rn days等于0,而不是0.2,这是为什么?rn我把decimal 换成float,double都是0,我也没有什么int,为什么不是0.2?急呀
为什么输出的是0呢
mov ecx,1100rn invoke RtlZeroMemory,addr szBuffer,sizeof szBufferrn invoke wsprintf,addr szBuffer,addr szFormat, ecxrn invoke MessageBox,0, addr szBuffer,addr AppName,MB_OK
select count(*) 返回值为什么是空而不是0??
select count(*) from [forum-master]rnwhere forumid=9rngroup by forumidrnrnrnrnrn数据表forum-master为:rnForumID Master rn----------- -------rn8 yanrn
重写hashCode() 问题,结果为什么是0而不是17?
public class LabelValue rn private String label;rn private String value;rnrn public LabelValue(final String label, final String value) rn this.label = label;rn this.value = value;rn rnrn public String getLabel() rn return this.label;rn rnrn public void setLabel(String label) rn this.label = label;rn rnrn public String getValue() rn return this.value;rn rnrn public void setValue(String value) rn this.value = value;rn rnrn public int hashCode() rn return (this.getValue() == null) ? 17 : this.getValue().hashCode();rn rnrn public boolean equals(Object obj) rn if (obj == this) rn return true;rn rn if (!(obj instanceof LabelValue)) rn return false;rn rn LabelValue bean = (LabelValue) obj;rn int nil = (this.getValue() == null) ? 1 : 0;rn nil += (bean.getValue() == null) ? 1 : 0;rn if (nil == 2) rn return true;rn else if (nil == 1) rn return false;rn else rn return this.getValue().equals(bean.getValue());rn rnrn rnrnrnrnpublic class MyResult rn public static void main(String[] args) rn LabelValue lv1 = new LabelValue("1","router");rn LabelValue lv2 = new LabelValue("2","switch");rn LabelValue lv3 = new LabelValue("3","router");rn LabelValue lv4 = new LabelValue("4","");rn System.out.println(lv4.hashCode());rn rnrnrn
下面运行结果为什么是6,而不是0?谢谢!
下面运行结果为什么是6,而不是0?谢谢!rnrn#include"stdio.h"rn#define HDY(A,B) A/Brn#define PRINT(Y) printf("y=%d\n",Y)rnmain()rnrnint a=1,b=2,c=3,d=4,k;rnk=HDY(a+c,b+d);rnPRINT(k);rn
CTime Ctime(0);的时间为什么是1970/1/1 8:0:0 ? 而不是MSDN上面说的1970/1/1 0:0:0 ?
CTime Ctime(0);腔奀潔峈妦繫岆1970/1/1 8:0:0 ˋ 奧祥岆MSDN奻醱佽腔1970/1/1 0:0:0 ˋ
为什么System.out.println(e.a)输出的是33,而不是3?求解
为什么System.out.println(e.a)输出的是33,而不是3?求解rnpublic class A extends Basern int a=3;rn public void b()rn System.out.println("A");rn rn public static void main(String[] args) rn Base e= new A();rn System.out.println(e.a);rn e.b();rnrn rnrnrnrnclass Basern int a=33;rn Base()rn b();rn rn public void b()rn System.out.println("base");rn rn
为什么输入法输出的是CP936而不是UNICODE?
我用 谷歌拼音、微软拼音2003、极点五笔测试,发现两个问题,比较困惑,望高手解答。rn1.输入法输出的字符是什么格式?在记事本、VC6的.cpp文件中输入字符通过ultraedit查看得到的都是CP936的代码,这是因为输入法直接输出的就是CP936还是因为编辑器改的?rnrn2.在如下程序中,rnint main ()rnrn unsigned short* str = L"ÎÒû×í!";rn //char* str = "ÎÒû×í!";rn return 0;rnrn注:这是直接从VC6贴进来的 乱码处为“我没醉!”,最后一个感叹号用英文输入法输入的。rnrn我看了str的汇编,rn在str为unsigned short*和char*时,汇编代码是一样的,但是内存却不一样:rnrn在str为unsigned short*时:rn asm:rn 40: unsigned short* str = L"ÎÒû×í!";rn 00401668 mov dword ptr [ebp-4],offset string L"\x6211\x6ca1\x9189!" (0042f020) //UNICODErn memory:rn 0042F020 11 62 A1 6C 89 91 21 .b¡l‰‘! //UNICODErn 0042F027 00 00 00 00 00 50 08 .....P.rnrn在str为char* 时:rn asm:rn 41: char* str = "ÎÒû×í!";rn 00401668 mov dword ptr [ebp-4],offset string L"\x6211\x6ca1\x9189!" (0042f020) //UNICODErn memory:rn 0042F020 CE D2 C3 BB D7 ED 21 ÎÒû×í! //CP936rn 0042F027 00 00 00 00 00 50 08 .....P.rnrnrn在1中我说过.cpp里面也是CP936,可是这里在asm里面都是UNICODE了,为什么?内存为什么又会是这样?rnrn谢谢!!
输入enter键为什么是换行而不是输出结果
代码哪里有错误,可以怎么改?![图片](https://img-ask.csdn.net/upload/201602/06/1454749060_34641.jpg)
为什么cout << "1.good\x00D\x00A2.good" 输出的是?good ,而不是...
为什么cout << "1.good\x00D\x00A2.good" 输出的是?good ,而不是rn1.goodrn2.goodrnrn为什么???
第三个输出为什么是101而不是5050呢?
public class CycleSum rn public static void main(String [] args) rn int sum = 0, sum2=0; rn for (int i=1;i <=100 ;i++ ) rn sum += i; rn rn System.out.println("使用for语句从一到一百相加结果"+sum); rnrn int i=1; rn while (i <=100) rn sum2 += i;i++; rn rn System.out.println("使用while语句从一到一百相加结果"+sum2); rnrn int sum3=0;rn dorn sum3 += i; i++;rn rn while (i <=100);rn System.out.println("使用do-while语句从一到一百相加结果"+sum3); rn rnrn rn
为什么输出的是1234而不是“welcome”呢?
public class Test rn public static void changeStr(String str)rn str="welcome";rn rn public static void main(String[] args) rn String str="1234";rn changeStr(str);rn System.out.println(str);rn rn
WideString索引输出的为什么是编码而不是字符?
我想将WideString中的字符逐个输出,结果输出的是字符的编码.哪的问题呢?rnrnWideString juzi ;rnjuzi ="宽字符索引输出的为什么是编码?";rnfor(int j=1;jLines->Add(juzi[j] );rn结果:rn23485rn23383rn31526rn32034rn24341rn36755rn20986rn30340rn20026rn20160rn20040rn26159rn32534rn30721rn63rnrn我用的cb6.0 build 10.175
为什么输出是Hello?而不是Hello World?
public class Test rn public static StringBuffer doSomething(StringBuffer buff) rn buff = new StringBuffer(); rn buff.append("Hello World"); rn return buff; rn rn rn public static void main(String[] args) rn StringBuffer buff = new StringBuffer(); rn buff.append("Hello"); rn doSomething(buff); rn System.out.println(buff); rn rn rn
为什么输出的是sum is d%而不是sum is 579?
main()rnint a,b,sum;rna=123;b=456;rnsum=a+b;rnprintf("sum is d%\n",sum);rnrnrn这个程序在TC里没有错,但为什么输出时是sum is d% 而不是sum is 579?
为什么是1不是3??
[code=Java]rnpublic class Test rnrn public static void main(String[] args) rn ClassA c = new ClassA(); rn Test cm = new Test(); rn c.i=1; rn cm.revalue(c); rn System.out.println(c.i);rn rn public void revalue(ClassA c) rn ClassA d = new ClassA(); rn d.i=2; rn c=d; rn d.i=3; rn rnrnclass ClassA rn int i=0; rnrn[/code]rn请帮忙解释下吧。。谢谢了
为什么是false不是1
cure = new Ext.ux.RadioGroup(rn fieldLabel : '是否进行治疗',rn name : 'cure',rn xtype : 'radiogroup',// 表单文本框rn horizontal : true,rn maxLength : 2,rn defaultValue : '1',rn radios : getRadios(cureStore)rn );rn rn //不知道为什么cure.getValue()的值就是falsern if (cure.getValue() == false) rn cureProject.on('select', function() rn if (cureProject.getValue().indexOf("9") >= 0) rn otherCure.setDisabled(false);rn else rn otherCure.setValue('');rn otherCure.setDisabled(true);rn rn );rn rnrn为什么 cure.getValue() 不是1而是false。
( C# )定义char a='1';int b=convert.toint16(a);为什么输出的是49而不是1?
MSDN里convert.toint16里有一项是convert.toint16(char)说明括号里可以是字符的形式,为什么这里出错呢?
JSP获取IPv4的解决方案 而不是IPv6:0:0:0:0:0:0:0:1 !!!!
我的工具:eclipse JEE 从今天上午11:30到今天下午17.40:终于解决了一个心头大患;脑壳痛 问题来源:只要电脑和手机连得是同一个网络,我的手机就能访问我本机服务器上面的网络页面,也就是局域网。但是每次用eclipse运行jsp程序的时候,因为我是自己电脑做服务器,url用的是localhost例如【http://localhost:8080/secondary_market_...
一个SCJP试题,为什么答案是1,而不是10???
class ABC implements Runnablernrn public int i=1;rn public void run()rn rn this.i=10;rn rnrnrnpublic class Dominicrnrn public static void main(String args[])rn rn ABC a=new ABC();rn new Thread(a).start();rn int j=a.i;rn System.out.println(j);rn rnrn
select 12/7 的结果为什么是1,而不是1.71428
如标题
输出 scoped_ptr , 为什么是1?
[code=C/C++]rn scoped_ptr pStr(new string("Ding Ding"));rn cout << pStr << endl;[/code]
为什么是自动加2,而不是自动加1
我想浏览一个页面,然后自动加1,可以不防止刷新,但为什么老是自动加2啊?代码如下,高手,请指教rn SqlConnection con1=DB.CreateCon();rn con1.Open();rn SqlCommand cmd1=new SqlCommand();rn cmd1.Connection=con1;rn cmd1.CommandText="update CataLogContent set Countpeople=Countpeople+1 where NewsID="+ContentID;rn cmd1.ExecuteNonQuery();rn con1.Close();
怎么让数字1的输出01而不是 1
[code=Java]for(int i=1;i<41;i++)rn System.out.printf("\'t_00%2d.gif\',",i);rn 怎么让数字1的时候输出01而不是 1,我那样换会变成空格+1[/code]
为什么是Form_load而不是Form1_load呢
在VB中,事件过程名都是 对象名_事件名的形式,如Command1_clickrn可是对于窗体来说:rn为什么是Form_load而不是Form1_load呢rnrn难道VB不把窗体当成对象吗。
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview

相似问题

1
由于存储会损失精度,0.1的存储直接输出还是0.1而不是0.099999呢
1
Python绘制词频统计图,怎么输出到GUI,而不是输出到控制台?
2
为什么我自己写的max函数只能输出输入的第一个数而不是最大的
1
题目内容: UTC是世界协调时……输入样例: 803 输出样例: 3(请问我下面的代码有什么漏洞?)
1
如何用C++理想地输出复数(更符合人们的书写习惯)
4
c语言输入输出非常简单问题
1
C语言新手问题scanf函数将字符串指针用%c的格式输出结果是什么?
3
python中用循环对列表中元素加减操作,输出操作列表为什么还是原列表
3
关于指针数组输出时如何显示分别显示 地址,元素,
4
下面的代码为什么输出不是1000?
3
关于生成器的这段代码为何输出的是这个值
1
求大佬解决一下为什么调用函数函数后输出为地址,而不是变量的值呢?
1
不同类型的error应该怎么输出呢
0
请问这个程序用c怎么写?什么时候输出的序列不是单调递增?
0
神经网络的M均方差向1收敛而不是向0收敛是什么原因?
2
MATLAB的max函数的问题?
1
用C语言判断亲和数,如果A和B是亲和数的话输出YES,否则输出NO
2
为什么每个线程输出的counter大小不一,先输出的可能比后输出的要大?
1
【新手提问】单链表输出首行字符串末尾出现乱码?
1
一个循环而不是三个循环去统计给定的n个数中,负数、零和正数的个数,怎么用C语言的程序代码的编写技术