问题描述
public static void main(String[] args) {System.out.println(test(null)+","+test("")+","+test("1"));}@SuppressWarnings("finally")private static int test(String str) {try{return str.charAt(0)-'0';}catch(NullPointerException e){e.printStackTrace();return 1;}catch(RuntimeException e){e.printStackTrace();return 2;}catch(Exception e){e.printStackTrace();return 3;}finally{//finally 永远被执行return 4;}} 求输出结果及解释,本人菜鸟,见笑了!
解决方案
java.lang.NullPointerExceptionat com.dream.model.ExceptionTest.test(ExceptionTest.java:17)at com.dream.model.ExceptionTest.main(ExceptionTest.java:11)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:601)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)java.lang.StringIndexOutOfBoundsException: String index out of range: 0at java.lang.String.charAt(String.java:695)at com.dream.model.ExceptionTest.test(ExceptionTest.java:17)at com.dream.model.ExceptionTest.main(ExceptionTest.java:11)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:601)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)4,4,4第一个方法调用会报NullPointerException第二个方法调用会报StringIndexOutOfBoundsException第三个方法运行正常因为有finally块,所以不论前面的运行结果是什么,都会返回4,所以会看到4,4,4这样的输出结果。
解决方案二:
finally是在其他return之前执行的,报不报错很容易看懂,既然在其他return之前都已经return了,那么值就全是4了。
解决方案三:
@SuppressWarnings("finally") 都有警告了,估计平时也没人会写这样的代码,很是蛋疼!
解决方案四:
对于try/catch/failly的执行过程是不管是否有异常能会执行failly里面的语句,也就是说当try/catch中有return时,failly中的语句会在return之前执行;即在你的程序中会在try/catch中没有return之前,却先执行了failly中的return,当return之后就结束当前域的操作,而try/catch中的return也就不会执行,所以看到的结果都是failly返回的数值
解决方案五:
那方法三test(“1”)没有错应该先return str.charAt(0)-'0';调用结果是1,再执行finally中的4啊,,,为什么不是4,4,14呢???