我在复习一些新的代码。该程序只有一个try和finally块。由于catch块被排除在外,如果遇到异常或任何可丢弃的情况,try块如何工作?它是直接去最后一个街区吗?

Try Finally和Try Catch之间的差异可能重复

@MP每个人都应该做代码审查,向他们提问是如何学习和改进的。

如果try块中的任何代码都可以引发选中的异常,则它必须出现在方法签名的throws子句中。如果抛出未经检查的异常,则会从方法中冒泡出来。

无论是否引发异常,都始终执行finally块。

第一段不一定是真的。Try块可以嵌套。未选中或未选中的任何未捕获异常都将冒泡出该方法。

Try块可以嵌套,但我不建议这样做。我不是这样写代码的。

@达菲莫:"冒泡出方法"是什么意思?

@Anand只是一些"抛出异常"的稍微非技术性的语言。

答案很好,有人能解释一下"冒泡出来的方法"是什么意思吗?它被忽略了,还是传递了方法链?

不忽略;传递方法链。

关于try/finally的一个小提示:最后一个总是执行,除非

调用System.exit()。

JVM崩溃。

try{}块永远不会结束(例如,无限循环)。

那么try{..} catch{ throw ..} finally{..}呢?我想最终不会被处决

在这种情况下,最终仍将调用。只有原始异常丢失。

如果您之前调用System.Exit(),则也不会执行finally。

@JYW这就是我在上面列表中第一个项目的意思。

我不得不说,这涵盖了所有的基础!

案例4:机器模具/手动关闭

Java语言规范(1)描述了如何执行EDCOX1×4的执行。没有捕获等价于没有能够捕获给定的可丢弃项的捕获。

If execution of the try block completes abruptly because of a throw of a value V, then there is a choice:

If the run-time type of V is assignable to the parameter of any catch clause of the try statement, then …

If the run-time type of V is not assignable to the parameter of any catch clause of the try statement, then the finally block is executed. Then there is a choice:

If the finally block completes normally, then the try statement completes abruptly because of a throw of the value V.

If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and the throw of value V is discarded and forgotten).

(1)最后执行try catch

内部最终在将异常抛出到外部块之前执行。

public class TryCatchFinally {
public static void main(String[] args) throws Exception {
try{
System.out.println('A');
try{
System.out.println('B');
throw new Exception("threw exception in B");
}
finally
{
System.out.println('X');
}
//any code here in the first try block
//is unreachable if an exception occurs in the second try block
}
catch(Exception e)
{
System.out.println('Y');
}
finally
{
System.out.println('Z');
}
}
}

结果在

A

B

X

Y

Z

最后一个块总是在try块结束后运行,无论try是正常结束还是异常结束,都是由于异常、er、可丢弃。

如果try块中的任何代码引发了异常,那么当前方法只需重新引发(或继续引发)相同的异常(在运行finally块之后)。

如果finally块抛出一个异常/错误/可丢弃,并且已经有一个挂起的可丢弃,那么它会变得很难看。坦白地说,我完全忘记了发生了什么(多年前我的认证经历就是这样)。我认为两个被抛弃的人都联系在一起了,但是在"最终"呕吐物,呃,呕吐物吐出来之前,有一些特殊的巫术需要你去做(也就是说,我必须查找一个方法调用)。

顺便说一下,尝试/最后是一个非常常见的事情做的资源管理,因为Java没有析构函数。

例如

r = new LeakyThing();
try { useResource( r); }
finally { r.release(); }  // close, destroy, etc

"最后一点",还有一个提示:如果您真的要放入catch,要么捕捉特定的(预期的)可丢弃的子类,要么只捕捉"可丢弃的",而不是"异常",对于一般的catch all错误陷阱。太多的问题,例如反射错误,抛出"错误",而不是"异常",这些问题将被任何代码为以下内容的"全部捕获"直接忽略:

catch ( Exception e) ...  // doesn't really catch *all*, eh?

改为这样做:

catch ( Throwable t) ...

见下面卡洛斯·海伯杰的回答,了解难看的部分。

版本7之前的Java版本允许这三个组合的尝试catch最后…

try - catch

try - catch - finally

try - finally

无论try或/和catch块中发生了什么,都将始终执行finally块。因此,如果没有catch块,则不会在这里处理异常。

但是,在代码中的某个地方仍然需要一个异常处理程序——当然,除非您希望应用程序完全崩溃。它完全取决于应用程序的体系结构,即处理程序所在的位置。

Java try block must be followed by either catch or finally block.

For each try block there can be zero or more catch blocks, but only one finally block.

The finally block will not be executed if program exits(either by calling System.exit() or by causing a fatal error that causes the process to abort).

"在版本7允许之前",是否意味着Java 7和Java 8不允许这三个组合?我怀疑这就是你的意思,但这就是你的答案的含义。

如果try块中有返回语句,是否执行finally块?

@拉胡尔是的,最后会被召唤。参考:stackoverflow.com/questions/65035/…

@aron-用于try-with-resource的新语法,在try关键字后parens中构建的任何内容上自动调用.close()。

how does the try block work if it

encounters an exception or anything

throwable

异常被抛出到块之外,就像在任何其他未被捕获的情况下一样。

不管try块是如何退出的,都会执行finally块——不管是否有任何捕获,不管是否有匹配的捕获。

catch块和finally是try块的正交部分。你可以两者兼得。用Java 7,你就不可能拥有!

在try块完成后执行finally块。如果在try块离开finally块时有东西被抛出,那么将执行finally块。

你不试试那个节目吗?它将转到finally块并执行finally块,但不会处理异常。但是,这个例外可以在finally块中被否决!