Tag: try catch finally

finally块中的关闭文件不起作用

try { FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String line = null; } catch (FileNotFoundException fnf) { fnf.printStackTrace(); } finally { fr.close(); } fr.close()显示错误: fr无法解决 我曾经读过在finally块中关闭一个文件是一个很好的做法。 那是做错了什么的?

最后块是否真的需要清理代码(如关闭流)?

我很困惑为什么我需要将清理代码放在finally块中关闭流。 我已经读过finally块中的代码无论什么都会运行(是否存在exception); 并且在finally块运行之后,该方法的其余部分继续。 我的问题是:如果方法的其余部分必须继续,那么为什么我不在函数中的try / catch块之后放入清理代码?

未捕获的RuntimeException和finally子句:哪个先来?

在try块中抛出RuntimeException而不被捕获,而finally子句调用System.exit() 。 public static void main(String[] args) { try { Integer.valueOf(“NotANumber”); } finally { System.out.println(“finally”); System.exit(0); } } 输出是 finally 如果从finally中删除System.exit(0) ,则输出为 finally Exception in thread “main” java.lang.NumberFormatException: For input string: “NotANumber” at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:449) at java.lang.Integer.valueOf(Integer.java:554) at exception.MyExcepTest.main(MyExcepTest.java:20) 其中“finally”可能出现在NumberFormatException的meesage之前,之后或之间。 任何人都可以解释一下吗?

理解try catch最后返回它返回的值和值

我有以下代码。 public static void main(String[] args) { System.out.println(returnString()); } private static String returnString(){ try { System.out.println(“Executing try”); return “Return try value”; } catch (Exception e){ System.out.println(“Executing Catch”); return “Return catch value”; } finally { System.out.println(“Executing finally”); return “Return finally value”; } } 这个输出是 Executing try Executing finally Return finally value 如果我改变我的finally块而不返回任何类似的东西 public static void main(String[] […]

在java中尝试catch-finally

在Java中,如果我们在try-catch-finally的try块中插入一个return语句,那么finally块是否会被执行?

我们可以在finally块中使用“return”

我们可以在finally块中使用return语句。 这会导致任何问题吗?

在try \ finally块中是否存在这样的情况,finally将不会被执行?

我正在攻读面向对象编程的测试,我想知道是否有任何案例,考虑以下代码: try { do something } catch (someException e) { } finally { do something } finally块不会执行?

终于回来“发生了吗?”

我试图说服自己, finally子句中的操作发生在函数返回之前 (在内存一致性意义上)。 从JVM规范中可以清楚地看出,在一个线程中,程序顺序应该在关系之前驱动发生 – 如果在程序顺序中发生b则在 b 之前发生 。 但是,我还没有看到任何明确说明在返回之前最终发生的事情 ,那么它呢? 或者,编译器是否可以通过某种方式重新排序finally子句,因为它只是记录日志。 激励示例:我有一个线程从数据库中取出对象并将它们放入ArrayBlockingQueue,另一个线程将它们取出。 我有一些try – finally用于事件计时的块,我看到在log语句之前返回的影响 线程1: public Batch fetch() { try { log(“fetch()+”); return queryDatabase(); } finally { log(“fetch()-“); } … workQueue.put(fetch()); 线程2: log(“take()+”); Batch b = workQueue.take(); log(“take()-“); 令我惊讶的是,这是以意想不到的顺序打印出来的。 虽然,是的,不同线程中的日志记录语句可能无序出现,但存在至少20毫秒的时间差。 124 ms : take()+ 224 ms : fetch()+ 244 ms : take()- 254 […]

finally {}块不会执行的情况是什么?

在Java try{} … catch{} … finally{}块中, try{} … catch{} … finally{}代码通常被认为是“保证”运行,无论try / catch中发生了什么。 但是,我知道至少有两种情况不会执行: 如果调用System.exit(0) ; 要么, 如果exception被抛出到JVM并且发生默认行为(即printStackTrace()并退出) 是否有任何其他程序行为会阻止finally{}块中的代码执行? 代码在什么具体条件下执行? 编辑:正如NullUserException指出的那样,第二种情况实际上并非如此。 我认为这是因为标准错误中的文本在标准输出之后打印出来,防止文本在没有向上滚动的情况下被看到。 :) 道歉。

finally块总是在Java中执行吗?

考虑到这段代码,我可以绝对确定 finally块总是执行,无论是什么something() ? try { something(); return success; } catch (Exception e) { return failure; } finally { System.out.println(“i don’t know if this will get printed out.”); }