经过长时间的差距后,我回到用Java编写代码 - 过去几年我的大部分编码工作都是在PHP& JavaScript - 并且我发现我必须更加努力地满足Java编译器,这对于诸如变量范围和异常处理之类的问题要严格得多。导致我遇到麻烦的一段代码如下所示
File file = new File(path, fname);
FileOutputStream stream = null;
try
{
stream = new FileOutputStream(file);
stream.write(tosave.getBytes());
}
finally
{
try
{
if (null != stream) {stream.close();}
return true;
}
catch(Exception e){return false;}
}
这是编译器接受的。但是,在我到达这里之前,我遇到了几个问题。
stream
块中声明并创建了try
变量。编译器再次摇摆不定 - stream
变量超出finally
块的范围。正如您将看到我通过在stream
块上方声明try
并将其初始化为null来解决此问题。
这很有效。但是,鉴于我的Java技能多么生疏,我想我会问:是否有正确的方法来编写这样的代码?
答案 0 :(得分:3)
在现代Java版本中处理此类场景的惯用方法(自Java 7开始)将使用try-with-resource块来处理所有丑陋的关闭“逻辑”。您仍然需要捕获异常或向上传播它,但这是一个相对较小的问题。请考虑以下事项:
public static boolean writeToFile(String path, String fname) {
File file = new File(path, fname);
try (FileOutputStream stream = new FileOutputStream(file)) {
stream.write(tosave.getBytes());
} catch (IOException e) {
// Should probably log the exception too
return false;
}
return true;
}
答案 1 :(得分:1)
您只需使用以下代码段:
try (FileOutputStream stream = new FileOutputStream(file)){
stream.write(tosave.getBytes());
}catch(IOException e) {
e.printStackTrace();
return false;
}
return true;
这是Java 7中引入的一个新功能(try-with-resources Statement)。
答案 2 :(得分:1)
我认为你对那些不重要的事情感到困惑。是的,在某些情况下,编写try / catch / finally非常重要,因为您实际上需要做一些事情来修复错误。
但是对于打开/关闭文件,你不想让自己陷入困境只是为了满足编译器。代码可读性更重要。
怎么样:
window.mozRTCPeerConnection
答案 3 :(得分:0)
“正确”的方式是使用Java 7的using the $in with the regular expression。它已经很长时间了,但它很好地清理了这种样板代码。
如果你被困在早期的Java版本上,那就太好运了:)