Java 为什么我会得到一个“;“潜在资源泄漏”;使用包装编写器对象发出警告?
下面是一个简化的示例,它将导致Eclipses Java系统发出警告Java 为什么我会得到一个“;“潜在资源泄漏”;使用包装编写器对象发出警告?,java,eclipse,resources,warnings,Java,Eclipse,Resources,Warnings,下面是一个简化的示例,它将导致Eclipses Java系统发出警告表达式new BufferedWriter(…)的潜在资源泄漏:''可能无法关闭: 这是假阳性吗?我对作家这件事的理解是,任何作家都会关闭其潜在的作家。在我的例子中,writer将封装新的缓冲写入程序(这反过来又封装了一个文件写入程序),因此关闭writer不应该泄漏与缓冲写入程序或其底层写入程序相关的任何资源 我在这里遗漏了什么?根据更新的问题编辑了答案: 这是一个虚假的警告-基于三元运算符的使用。如果操作的右侧未触发,则不会
表达式new BufferedWriter(…)
的潜在资源泄漏:''可能无法关闭:
这是假阳性吗?我对作家这件事的理解是,任何作家都会关闭其潜在的作家。在我的例子中,writer
将封装新的缓冲写入程序(这反过来又封装了一个文件写入程序),因此关闭writer
不应该泄漏与缓冲写入程序或其底层写入程序相关的任何资源
我在这里遗漏了什么?根据更新的问题编辑了答案:
这是一个虚假的警告-基于三元运算符的使用。如果操作的右侧未触发,则不会创建BufferedWriter
,并且不会发生资源泄漏。因此,警告所描述的情况实际上是不可能的。但是,如果您想“处理”它,只需将writer的创建移动到try块中即可
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())));
writer.write("Hello World!");
} finally {
if (writer != null)
writer.close();
}
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())));
writer.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null)
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())))) {
writer.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
}
根据更新的问题编辑答案:
这是一个虚假的警告-基于三元运算符的使用。如果操作的右侧未触发,则不会创建BufferedWriter
,并且不会发生资源泄漏。因此,警告所描述的情况实际上是不可能的。但是,如果您想“处理”它,只需将writer的创建移动到try块中即可
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())));
writer.write("Hello World!");
} finally {
if (writer != null)
writer.close();
}
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())));
writer.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null)
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())))) {
writer.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
}
如果writer.write(“你好,世界!”)
引发异常,writer.close()
从未被调用
尝试将其包装到Try-catch块中(可能使用自动关闭功能,请参阅)。如果writer.write(“Hello World!”)
引发异常,writer.close()
从未被调用
尝试将其包装到一个Try-catch块中(可能使用自动关闭功能,请参见)。是否可以检查此代码是否向您发出警告?若并没有,那个么您可能在创建writer时并没有处理IOException,这也应该在try块中完成
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())));
writer.write("Hello World!");
} finally {
if (writer != null)
writer.close();
}
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())));
writer.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null)
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())))) {
writer.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
}
您还可以使用try with resources,它将在try块之后自动关闭资源流
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())));
writer.write("Hello World!");
} finally {
if (writer != null)
writer.close();
}
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())));
writer.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null)
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())))) {
writer.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
}
你能检查一下这个代码是否给了你警告吗?若并没有,那个么您可能在创建writer时并没有处理IOException,这也应该在try块中完成
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())));
writer.write("Hello World!");
} finally {
if (writer != null)
writer.close();
}
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())));
writer.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null)
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())))) {
writer.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
}
您还可以使用try with resources,它将在try块之后自动关闭资源流
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())));
writer.write("Hello World!");
} finally {
if (writer != null)
writer.close();
}
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())));
writer.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null)
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
: new BufferedWriter(new FileWriter(new File(
askUserForFilename())))) {
writer.write("Hello World!");
} catch (IOException e) {
e.printStackTrace();
}
谢谢,但实际上,我忘了在我的示例中添加try
和catch
,因为它们在原始代码中。该警告与IOException无关。我仍然得到警告,你看..如果你的代码运行的线程在执行finally块之前被终止,finally块可能永远不会被执行,而你的应用程序仍在继续运行。不知道try with resource是否涵盖了这种情况,但似乎很有可能。谢谢,但实际上,我忘了在我的示例中添加try
和catch
,因为它们在原始代码中。该警告与IOException无关。我仍然得到警告,你看..如果你的代码运行的线程在执行finally块之前被终止,finally块可能永远不会被执行,而你的应用程序仍在继续运行。不知道try with resource是否涵盖了这种情况,但似乎很有可能。谢谢,但实际上,我忘了在我的示例中添加try
和catch
,因为它们在原始代码中。该警告与IOException无关。我仍然收到了警告,你看..谢谢你,但实际上,我忘记在我的示例中添加try
和catch
,因为它们在原始代码中。该警告与IOException无关。我还是得到了警告,你看。。