Java Try Catch Finally块没有Catch

时间:2010-12-30 02:52:07

标签: java try-catch finally try-catch-finally try-finally

我正在审核一些新代码。该程序只有一个try和一个finally块。由于catch块被排除在外,如果遇到异常或任何可抛出的东西,try块如何工作?它只是直接进入finally块吗?

11 个答案:

答案 0 :(得分:117)

如果try块中的任何代码都可以抛出一个已检查的异常,则它必须出现在方法签名的throws子句中。如果抛出未经检查的异常,则会将其冒出方法。

始终执行finally块,无论是否抛出异常。

答案 1 :(得分:87)

关于try / finally的小注释:除非

,否则将始终执行
  • System.exit()被召唤。
  • JVM崩溃。
  • try{}块永远不会结束(例如无限循环)。

答案 2 :(得分:36)

Java语言规范 (1) 描述了try-catch-finally的执行方式。 没有捕获相当于没有捕获能够捕获给定的Throwable。

  
      
  • 如果由于抛出值V而突然完成try块的执行,则可以选择:      
        
    • 如果V的运行时类型可分配给try语句的任何catch子句的参数,则...
        ......
    •   
    • 如果V的运行时类型不能分配给try语句的任何catch子句的参数,则执行finally块。然后有一个选择:      
          
      • 如果finally块正常完成,那么try语句因为抛出值V而突然完成。
      •   
      • 如果finally块由于原因S而突然完成,则try语句突然完成原因S(并且丢弃并抛弃值V的抛出)。
      •   
    •   
  •   

(1)Execution of try-catch-finally

答案 3 :(得分:14)

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

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

答案 4 :(得分:6)

在try块结束后总是运行finally块,无论是由于异常,er,throwable,是否正常结束或异常结束。

如果try块中的任何代码抛出异常,则当前方法只会重新抛出(或继续抛出)相同的异常(在运行finally块之后)。

如果finally块抛出异常/错误/ throwable,并且已经存在挂起的throwable,则会变得难看。坦率地说,我完全忘记了发生了什么(多年前我的认证)。我认为两个throwable都链接在一起,但是你需要做一些特殊的伏都教(即 - 我必须查询一个方法调用)才能在“最终”barfed之前得到原始问题,呃,吐了。

顺便说一句,try / finally对于资源管理来说是很常见的事情,因为java没有析构函数。

E.g。 -

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

“最后”,还有一个提示:如果你懒得放入一个catch,要么捕获特定的(预期的)throwable子类,要么只捕获“Throwable”, not “Exception”,用于一般的全部错误陷阱。太多的问题,比如反思蠢事,抛出“错误”,而不是“异常”,而那些将被任何“全部捕获”编码为:

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

改为:

catch ( Throwable t) ...

答案 5 :(得分:3)

版本7之前的Java版本允许 try-catch-finally 的这三种组合......

use nom::Offset;

impl Offset for str {
    fn offset(&self, second: &Self) -> usize {
        let fst = self.as_ptr();
        let snd = second.as_ptr();

        snd as usize - fst as usize
    }
}
无论try - catch try - catch - finally try - finally 或/和finally块中发生了什么,

try块都将始终执行。因此,如果没有catch块,则不会在此处理异常。

但是,您仍然需要在代码中的某处使用异常处理程序 - 除非您希望应用程序完全崩溃。它取决于应用程序的体系结构与处理程序的确切位置。

  
      
  • Java try block必须后跟catch或finally块。
  •   
  • 对于每个try块,可以有零个或多个catch块,但只有一个finally块。
  •   
  • 如果程序退出(通过调用System.exit()或导致导致进程中止的致命错误,则不会执行finally块。)
  •   

答案 6 :(得分:2)

  

try块如何工作?   遇到异常或任何事情   抛出对象

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

无论try块是如何退出的,都会执行finally块 - 无论是否有任何捕获,无论是否有匹配的catch。

catch块和finally块是try块的正交部分。你可以有其中一个或两个。使用Java 7,您将无法使用它!

答案 7 :(得分:1)

你不试试那个节目吗?它将最终阻止并执行finally块,但是,不会处理异常。但是,在finally块中可以推翻该异常!

答案 8 :(得分:1)

在try块完成后执行finally块。如果在try块中离开finally块时抛出了某些东西。

答案 9 :(得分:0)

try块中,我们编写了可能引发异常的代码。 catch块是我们处理异常的地方。 无论是否发生异常,finally块始终执行。

现在,如果我们使用try-finally块而不是try-catch-finally块,则不会处理该异常,并且在try块而不是控制要捕获的块之后,它将进入finally块。 当我们不希望发生任何异常时,可以使用try-finally块。

答案 10 :(得分:0)

无论const ComputedCounter = { name: "ComputedCounter", template: ` <span>{{ value }}</span> `, computed: { value() { const current = this.value || 0; return current + 1; } } } 块中是否引发异常,都将执行public void StartDownload(string url) { client.Options.FilesystemOptions.Output = @"C:\Users\Admin\Desktop\test\testasync.mp4"; client.Options.PostProcessingOptions.ExtractAudio = true; client.VideoUrl = url; client.YoutubeDlPath = Directory.GetCurrentDirectory() + @"\lib\dl.exe"; client.PrepareDownloadAsync(); client.DownloadAsync(); client.Info.PropertyChanged += delegate { DownloadInfo info = new DownloadInfo(); progressBar1.Value = info.VideoProgress; }; } 块。不会捕获异常。