首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

浅谈 Java 中的 AutoCloseable 接口

一个资源类实现了该接口close方法,在使用try-with-resources语法创建的资源抛出异常后,JVM会自动调用close 方法进行资源释放;没有抛出异常正常退出try代码块也会自动调用...翻译如下: 此方法用于关闭资源,放弃任何底层基础资源。使用try-with-resources语法管理对象,close方法将在try代码块逻辑结束后自动被调用。...虽然AutoCloseable中的close方法被声明为抛出Exception这个异常,但是强烈建议实现类声明更加具体的异常,或者close操作不允许失败声明为不抛出任何异常。...更一般的情况下,一个异常的不当处理会导致题,AutoCloseable.close方法就不应该抛出这个异常。...注意,一个异常引发另一个异常,通常会捕获第一个异常,然后在响应中抛出第二个异常(就是抛出最上层的异常)。换句话说,这两个异常之间存在因果关系。

1.9K30

【Kotlin 协程】协程取消 ③ ( finally 释放协程资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消的协程任务 | 构造超时取消的协程任务 )

} } }catch (e: Exception) { Log.i(TAG, "协程抛出异常...22:06:06.508 I 协程抛出异常 22:06:06.509 W kotlinx.coroutines.JobCancellationException: StandaloneCoroutine...对象释放资源操作 ---- 使用 use 函数 可以在 程序结束 , 执行实现了 Closeable 对象的的 close 方法 , 该操作适合文件对象关闭文件使用 ; use 函数原型如下 : /...** * 在这个资源上执行给定的[block]函数,然后正确关闭它,不管是否异常 * 是否被抛出。...NonCancellable) 代码块包裹 , 所有的代码执行完毕 ; 23:12:31.014 I 协程任务执行开始 23:12:31.029 I 取消协程任务 23:12:31.033 I 协程抛出异常

1.3K10
您找到你想要的搜索结果了吗?
是的
没有找到

与面试官聊try-catch-finally关闭资源,你的答案还是10年前的?

有编程经验的朋友都知道,在程序运行中如果打开了一些资源,那么发生异常或程序结束都需要进行资源的关闭,不然会造成内存溢出的问题。...因为无论程序是否发生异常,finally代码块是必然会被执行的,这也就保证了资源的关闭。...自定义关闭实现 既然实现java.io.Closeable接口的类可以享受自动关闭资源的好处,那我们自定义类是否同样享受这个福利呢?...可以看到在调用hello方法之后,JVM自动调用了close方法,完美的关闭了资源。 底层实现 了解我写文章风格的读者都会知道,在写一个知识点我们不只会停留在表面,还要看一下它的底层实现。...本来是hello方法先抛出异常,然后执行close方法又抛出异常,但后面的异常信息将前面真正的异常信息给“隐藏”了。此时你去排查bug,是不是很困惑?最关键的异常信息被覆盖了。

65310

Android面试题之Kotlin协程一文搞定

,无法追踪,会导致内存、CPU、磁盘等资源浪费,甚至发送一个无用的网络请求,这种称为任务泄漏 为了避免,引入了结构化并发机制 结构化并发 可以取消任务、追踪任务、协程失败发出错误信号 协程作用域CoroutineScope...事实上await()也不一定导致协程会被挂起,await() 只有在 async 未执行完成返回结果,才会挂起协程。...包括主动调用协程的start、join或者await等函数才会开始调度,如果调度前就被取消,那么该协程将直接进入异常结束状态 @Test fun `test start mode`() = runBlocking...waiting") job.cancelAndJoin() println("main: i can quit") } 超时任务 withTimeout()方法可以开启超时任务,默认超时会抛出异常...repeat(1000){ println("job: sleeping $it") delay(500L) } } } 如果不想抛出异常

9210

撸了一个 Feign 增强包 V2.0 升级版

为了在 feign-plus 中实现该功能需要几个步骤: 自定义一个通用异常。 服务提供方需要实现一个全局拦截器,发生异常统一对外响应数据。 服务消费方需要自定义一个异常解码器的 bean。...然后在 provider 中定义全局异常处理: 出现异常便会返回一个 http_code=500 的数据: 到这一步又会出现一个引战话题:HTTP 接口返回到底是全部返回 200 然后通过 code...=200 才会认为发生了异常。...---- 这样服务提供方抛出异常,消费者便能成功拿到该异常: 实现原理 实现原理其实也比较简单,了解 rpc 原理的话应该会知道,服务提供者返回异常调用方是不可能接收到的,这和是否由一种语言实现也没关系...= 200 的方式来抛出异常的,所以采用 http_code=200, code message 的方式响应数据将不会传递异常,依然会任务是一次正常调用。

19010

Java异常处理

访问异常信息: Java程序可以通过访问catch块后的异常形参来获得异常对象的相关信息,Java运行时决定调用某个catch块来处理该异常对象,会将异常对象赋给catch块后的异常参数,程序即可通过该参数来获得异常的相关信息...Java7允许在try关键字后面紧跟一对圆括号,圆括号可以声明、初始化一个或多个资源,这里的资源指的是那些必须在程序结束显示关闭的资源(数据库连接,网络连接等),try语句在该语句结束自动关闭这些资源...为了保证try语句可以正常关闭资源,这些资源实现类必须实现AutoCloseable或Closeable借口,实现这两个接口就必须事先close()方法。...一旦用throws抛出异常,就不用try{}catch{}处理异常。 方法重写声明抛出异常要注意: 子类方法声明抛出异常类型应该是父类方法声明抛出异常类型的子类或者相同。...使用throw抛出异常: 程序中可以使用throw自行抛出异常Java运行时接收到开发者自行抛出异常,同样会终止当前的执行流,跳到该异常对应的catch块,由该catch块来处理该异常

68910

SpringBoot系列(九)统一异常处理与统一结果返回

总结 引言:  日常开发过程中,难免有的程序会因为某些原因抛出异常,而这些异常一般都是利用try ,catch的方式处理异常或者throw,throws的方式抛出异常不管。...Springboot对于异常的处理也做了不错的支持,它提供了一个 @ControllerAdvice注解以及 @ExceptionHandler注解,前者是用来开启全局的异常捕获,后者则是说明捕获哪些异常...这里我们就定义好了统一的结果返回,其中里面的静态方法是用来程序异常的时候转换成异常返回规定的格式。  然后我们需要自定义异常处理类。...默认情况下,SpringBoot是不会抛出404异常的,所以**@ControllerAdvice**也不能捕获到404异常。我们可以通过以下配置来让这个注解能捕获到404异常。...404异常直接抛出异常

2.2K30

【Android 应用开发】BluetoothServerSocket详解

继承关系 public final class BluetoothServerSocket extends Object implements Closeable 继承了Object类, 实现了Closeable...接口; Closeable是可以关闭的数据源或者目标, 实现该接口必须重写close()方法, 调用close()方法可以释放该对象保存的资源; 2....该类简介 使用BluetoothServerSocket可以创建一个监听服务端口, 使用accept()方法阻塞, 该方法监测到连接的时候, 就会返回一个BluetoothSocket对象来管理这个连接...端口是最常用的蓝牙端口, 该端口是面向连接的, 通过这个连接进行数据传输要遵守串口行为规范(Serial Port Profile, SPP); 该类用法 : BluetoothServerSocket对象BluetoothAdapter...连接; (3)关闭端口 public void close () 作用 : 关闭端口, 释放该端口占用的资源; 注意 : 如果这个端口在其它线程中accept()阻塞, 那么就会跑出异常, 关闭这个端口不会关闭

47320

不是吧,阿Sir啊,可不可以不用再写finally?

2、繁荣表面下的隐患 有些老司机可能一眼就看出这段代码的问题了——输入输出流没有关闭。单论这段代码:没有合理的关闭 GZIPInputStream 流会导出内存溢出。那么如何解决呢?...阿Sir啊——你说的我都懂,要是系统能自动帮我关闭输入输出流就好了! 实际上自从 jdk 1.7 开始,try-with-source 语法糖就已经支持了类似功能,先看优化后的代码: ?...我猜你现在可能在想:为啥这段代码的不需要我们写 finally 代码来保障输入输出流的正确关闭呢?直接看编译后的 class 文件: ?...如果要借助 try-with-souce 来实现资源的自动回收,在编写代码的时候,针对有资源释放的类需要实现 Closeable 接口。 ?...那么问题就来了,各位大佬仔细看,这里的 finish 方法是可以抛出 IO 异常的,如果在执行 finish() 方法抛出了 IO 异常,那么下面的 out.close() 方法实际上不会被执行的。

42720

招银网络二面:Exception 和 Error 有什么区别?

String getMessage(): 返回异常发生的简要描述 String toString(): 返回异常发生的详细信息 String getLocalizedMessage(): 返回异常对象的本地化信息...finally 块 :无论是否捕获或处理异常,finally 块里的语句都会被执行。当在 try 块或 catch 块中遇到 return 语句,finally 语句块将在方法返回之前被执行。... try 语句和 finally 语句中都有 return 语句,try 语句块中的 return 语句会被忽略。...这是因为 try 语句中的 return 返回值会先被暂存在一个本地变量中,执行到 finally 语句中的 return 之后,这个本地变量的值就变为了 finally 语句中的 return 返回值...不要把异常定义为静态变量,因为这样会导致异常栈信息错乱。每次手动抛出异常,我们都需要手动 new 一个异常对象抛出抛出异常信息一定要有意义。

52210

SpringBoot系列教程web篇之全局异常处理

当我们的后端应用出现异常,通常会将异常状况包装之后再返回给调用方或者前端,在实际的项目中,不可能对每一个地方都做好异常处理,再优雅的代码也可能抛出异常,那么在 Spring 项目中,可以怎样优雅的处理这些异常呢...NoHandlerFoundException 处理(404 异常捕获) 右键查看原文: SpringBoot系列教程web篇之全局异常处理 <!...织入增强方法 @ExceptionHandler标记在方法上,表示出现对应的异常抛出到上层(即没有被业务捕获),这个方法会被触发 下面我们通过实例进行功能演示 a....测试说明 实例测试如下,上面我们声明捕获的两种异常被拦截并输出对应的堆栈信息; 但是需要注意 404 和未捕获的 500 异常则显示的 SpringBoot 默认的错误页面; 此外我们捕获返回的 http...@ResponseStatus 上面的 case 中捕获的异常返回的状态码是 200,但是在某些 case 中,可能更希望返回更合适的 http 状态码,此时可以使用ResponseStatus来指定

84720

如何利用InputStream类实现文件读取与处理?

InputStream类定义了一个Closeable接口,该接口表示此输入流已经完成输入操作,并且可以关闭此流。InputStream类的子类需要实现这个方法。...如果已经到达输入流的末尾,则返回-1。此方法可能会阻塞,直到输入数据可用、检测到文件结束或抛出异常为止。  ...下面是它们的详细介绍:read()方法:读取一个字节的数据,并返回该字节的值。如果已经到达输入流的末尾,则返回-1。此方法可能会阻塞,直到输入数据可用、检测到文件结束或抛出异常为止。...每次调用read()方法都会读取一个字节,并返回其对应的ASCII码值。使用while循环不断地读取文件,读取到文件末尾,read()方法会返回-1。...最后关闭InputStream对象,释放资源。  需要注意的是,在使用输入流读取文件,需要处理异常,因此代码中使用了throws Exception来抛出可能的异常

45861
领券