草庐IT

finalizer

全部标签

java - 关于嵌套 Java try/finally 代码三明治的建议

我想要一些关于我碰到的技术的建议。通过查看代码片段可以很容易地理解它,但我会在下面的段落中更多地记录它。使用“代码三明治”习语来处理资源管理是司空见惯的。习惯了C++的RAII习语后,我切换到Java,发现我的异常安全资源管理导致代码深度嵌套,在其中我很难掌握常规控制流。显然(javadataaccess:isthisgoodstyleofjavadataaccesscode,orisittoomuchtryfinally?、Javaiouglytry-finallyblock等等)我并不孤单。我尝试了不同的解决方案来解决这个问题:显式维护程序状态:resource1aquired、f

java - 为什么 Java 编译器复制 finally block ?

当使用简单的try/finallyblock编译以下代码时,Java编译器会生成以下输出(在ASM字节码查看器中查看):代码:try{System.out.println("Attemptingtodividebyzero...");System.out.println(1/0);}finally{System.out.println("Finally...");}字节码:TRYCATCHBLOCKL0L1L1L0LINENUMBER10L0GETSTATICjava/lang/System.out:Ljava/io/PrintStream;LDC"Attemptingtodivide

java - 为什么 Java 编译器复制 finally block ?

当使用简单的try/finallyblock编译以下代码时,Java编译器会生成以下输出(在ASM字节码查看器中查看):代码:try{System.out.println("Attemptingtodividebyzero...");System.out.println(1/0);}finally{System.out.println("Finally...");}字节码:TRYCATCHBLOCKL0L1L1L0LINENUMBER10L0GETSTATICjava/lang/System.out:Ljava/io/PrintStream;LDC"Attemptingtodivide

java - 是否可以在我进入 finally block 之前检测是否发生异常?

在Java中,是否有一种优雅的方法可以在运行finallyblock之前检测是否发生异常?在处理“close()”语句时,通常需要在finallyblock中处理异常。理想情况下,我们希望维护两个异常并将它们向上传播(因为它们都可能包含有用的信息)。我能想到的唯一方法是在try-catch-finally范围之外有一个变量来保存对抛出异常的引用。然后将“已保存”异常与finallyblock中发生的任何异常一起传播。有没有更优雅的方式来做到这一点?也许API调用会揭示这一点?这是我所说的一些粗略代码:Throwablet=null;try{stream.write(buffer);}c

java - 是否可以在我进入 finally block 之前检测是否发生异常?

在Java中,是否有一种优雅的方法可以在运行finallyblock之前检测是否发生异常?在处理“close()”语句时,通常需要在finallyblock中处理异常。理想情况下,我们希望维护两个异常并将它们向上传播(因为它们都可能包含有用的信息)。我能想到的唯一方法是在try-catch-finally范围之外有一个变量来保存对抛出异常的引用。然后将“已保存”异常与finallyblock中发生的任何异常一起传播。有没有更优雅的方式来做到这一点?也许API调用会揭示这一点?这是我所说的一些粗略代码:Throwablet=null;try{stream.write(buffer);}c

java - "final"在运行时是最终的吗?

我一直在玩ASM,并且我相信我成功地将final修饰符添加到类的实例字段中;但是,然后我继续实例化所述类并在其上调用setter,这成功地更改了now-final字段的值。我的字节码更改是否有问题,还是最终仅由Java编译器强制执行?更新:(7月31日)这里有一些代码供您引用。主要部分是一个带有privateintx和privatefinalinty的简单POJO,MakeFieldsFinalClassAdapter,它使得它访问的每个字段都是最终的,除非它已经是最终的,和AddSetYMethodVisitor,它会导致POJO的setX()方法也将y设置为与设置x相同的值。换句话

java - "final"在运行时是最终的吗?

我一直在玩ASM,并且我相信我成功地将final修饰符添加到类的实例字段中;但是,然后我继续实例化所述类并在其上调用setter,这成功地更改了now-final字段的值。我的字节码更改是否有问题,还是最终仅由Java编译器强制执行?更新:(7月31日)这里有一些代码供您引用。主要部分是一个带有privateintx和privatefinalinty的简单POJO,MakeFieldsFinalClassAdapter,它使得它访问的每个字段都是最终的,除非它已经是最终的,和AddSetYMethodVisitor,它会导致POJO的setX()方法也将y设置为与设置x相同的值。换句话

java - finalize() 在 Java 8 中调用强可达对象

我们最近将消息处理应用程序从Java7升级到了Java8。升级后,我们偶尔会遇到异常,即在读取流时已关闭它。日志显示终结器线程正在对保存流的对象调用finalize()(进而关闭流)。代码基本大纲如下:MIMEWriterwriter=newMIMEWriter(out);in=newInflaterInputStream(databaseBlobInputStream);MIMEBodyPartattachmentPart=newMIMEBodyPart(in);writer.writePart(attachmentPart);MIMEWriter和MIMEBodyPart是本地MI

java - finalize() 在 Java 8 中调用强可达对象

我们最近将消息处理应用程序从Java7升级到了Java8。升级后,我们偶尔会遇到异常,即在读取流时已关闭它。日志显示终结器线程正在对保存流的对象调用finalize()(进而关闭流)。代码基本大纲如下:MIMEWriterwriter=newMIMEWriter(out);in=newInflaterInputStream(databaseBlobInputStream);MIMEBodyPartattachmentPart=newMIMEBodyPart(in);writer.writePart(attachmentPart);MIMEWriter和MIMEBodyPart是本地MI

java - 了解此警告 : The serializable class does not declare a static final serialVersionUID

我有一些静态初始化代码:someMethodThatTakesAHashMap(newHashMap(){{put("a","value-a");put("c","value-c");}});由于某种原因,我收到了来自Eclipse的警告:可序列化类未声明静态最终serialVersionUID。这是在提示匿名类吗?我能做些什么呢,或者我应该压制它。 最佳答案 您使用的语法称为double-braceinitialization-这实际上是一个“instanceinitializationblock是anonymousinnercl