为什么会出现编译错误?
val autoClosable = MyAutoClosable()
var myVar: MyType
autoClosable.use {
myVar= it.foo()
}
println(myVar) // Error: Variable 'myVar' must be initialized
Run Code Online (Sandbox Code Playgroud)
也许编译器只是看作{ myVar= it.foo() }
是一个传递给另一个函数的函数,并且不知道何时甚至是否会被执行?
但是,既然use
不仅仅是一个函数,而且Kotlin取代了Java的资源尝试,那么关于它的一些特殊知识将是合适的,不是吗?现在,我被迫myVar
用一些虚拟值初始化,这根本不符合Kotlin的精神.
当Stream
在try-with-resources中使用a 时,应该关闭阅读器.
鉴于这种:
try(Stream<String> lines = new BufferedReader(reader).lines()) {
return lines.map(it -> trim ? it.trim() : it)
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
......读者没有被关闭?
此测试失败:
AtomicBoolean closed = new AtomicBoolean(false);
Reader r = new StringReader(" Line1 \n Line2") {
@Override
public void close() {
super.close();
closed.set(true);
}
};
try(Stream<String> lines = new BufferedReader(r).lines()) {
lines.map(it -> trim ? it.trim() : it)
.collect(Collectors.toList());
}
assertTrue("Reader was not closed.",closed.get());
Run Code Online (Sandbox Code Playgroud) 我有一个Map<Key, Closeable>
,如果从地图上删除了一个键,我想关闭该Closeable
。通常我有类似的东西:
Closeable c = map.remove(key);
c.close();
Run Code Online (Sandbox Code Playgroud)
我的 Eclipse 警告我“资源 'c' 应该由 try-with-resource 管理”,那么编写以下内容是否更好?
try (Closeable c = map.remove(key)) {}
Run Code Online (Sandbox Code Playgroud)
在我的特殊实现中,我有一个 的子类Closeable
,其中close()
不会抛出IOException
,因此不需要异常处理。
只需将应用程序转换为JAVA 7,并想知道是否有人遇到过使用资源和c3p0连接池的问题.
我想现在,如果你使用try with resources,JAVA会自动关闭数据库,准备好的语句和语句.
这是否意味着诸如JDBC驱动程序和c3p0之类的底层API必须实现AutoClosable?
我使用的是c3p0 0.9.2.1和jtds 1.3.0
从 Java 9 开始,我们可以在 try-with-resources 中有效地使用最终变量。
下面的示例展示了一种资源初始化引发异常的情况。
public static void main(String[] args) {
Resource1 r1 = new Resource1();
Resource2 r2 = new Resource2(); // exception will be thrown
try (r1; r2) {
System.out.println("TryWithResources.main() try");
} catch (Exception e) {
System.out.println("TryWithResources.main() catch");
}
}
static class Resource1 implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("TryWithResources.Resource1.close()");
}
}
static class Resource2 implements AutoCloseable {
public Resource2() {
throw new RuntimeException();
}
@Override
public void close() throws Exception {
System.out.println("TryWithResources.Resource2.close()"); …
Run Code Online (Sandbox Code Playgroud) I\xe2\x80\x99m 是 Java 库的作者,该库提供对我们公司销售的 C++ 库的 Java 访问。类 \xe2\x80\x9cown\xe2\x80\x9d C++ 对象之一的实例,具有以下意义:该类具有一些long
由某些方法设置的私有字段native
,并且具有指向C++ 堆。由于 C++ 堆不会被垃圾回收,因此当拥有的 Java 对象不再需要它们时,特别是当拥有的 Java 对象本身不再需要时,必须手动释放内存,因此该类实现AutoClosable
并close()
释放实例拥有的所有 C++ 内存。理想情况下,用户将try
在该类的实例上使用 -with-resources。
一位客户抱怨 SonarQube 警告他们, \xe2\x80\x99t 不会调用释放资源,并建议在对象上close()
使用-with-resources,但该对象由变量或等效对象保存,并且一直存在,直到应用程序关闭(如据我了解)。我想帮助他们,但删除(按照他们的建议)根本就是\xe2\x80\x99不正确。问题与内存有关:当应用程序结束并且 C++ 库被卸载时,内存资源无论如何都会被释放(由操作系统)。try
static
AutoClosable
那么,理想情况下,如何AutoClosable
以 SonarQube 检测到的方式关闭静态变量所持有的对象呢?Java 似乎没有可以使用的与类初始值设定项相反的类型。
我不\xe2\x80\x99t 有权访问SonarQube 来玩玩并看看什么可以工作,即当SonarQube 识别出close()
将被调用时。我\xe2\x80\x99m 想要告诉他们应该适当地重新配置SonarQube 或抑制警告。问这个问题,我想确保它\xe2\x80\x99本质上是最好的行动方案。\xe2\x80\x9c是的,如果这是真的,\xe2\x80\x9d 将是一个合适的答案。当然,不使用全局状态,即没有 astatic
AutoClosable
是理所当然的,但我想他们已经知道了。
似乎没有人遇到过static
AutoClosable
对象的问题,因为 Stack Overflow 上没有关于它的问题。\n我认为这与.NET (C#) 中AutoClosable
的类似,并且我发现这个问题非常询问这个问题,但是答案特定于用例和 .NET,并且 …
在try-with-resources [autoclosable]块中使用GZipOutputStream时,我在处理完资源finish()
后是否需要显式调用?
我有这段代码:
public class Resource implements AutoCloseable{
private String s = "I am resource.";
private int NuberOfResource;
public Resource(int NuberOfResource) {
this.NuberOfResource = NuberOfResource;
System.out.println(s + " My number is: " + NuberOfResource);
}
@Override
public void close() throws Exception {
System.out.println("Closing...");
}
public void print(){
System.out.println("Hello");
}
Run Code Online (Sandbox Code Playgroud)
主要课程:
public class Main {
public static void main(String[] args) {
int a, b = 0;
a = 5;
try {
Resource first = new Resurs(1);
Resource second = new Resurs(2);
System.out.println("I will …
Run Code Online (Sandbox Code Playgroud) 是否有任何主要的 Java 库提供AutoCloseable
类似的接口,其 close 方法不会抛出异常?我的关闭实现非常简单,我想避免捕获异常的样板