在Eclipse中创建此类函数时
public static void writeToFile() throws FileNotFoundException {
try (PrintWriter out = new PrintWriter("filename.txt")) {
out.println("Hello world");
}
}
我被迫将throws FileNotFoundException
添加到方法。
现在,我的理解是正确的:
答案 0 :(得分:1)
我不知道你是否找到了问题的答案。我最近才遇到这个问题。
问题1。
当使用try with resources块时,如果正在使用的资源抛出一个已检查的异常(如上例所示),则必须捕获/处理异常。 throws关键字指示编译器抛出的任何异常都将由调用方法处理,因此不会抛出任何错误。
问题2。
尝试使用资源将表现得像最后只在未经检查的异常情况下尝试,对于已检查的异常,您希望在使用catch或use的同一方法中处理异常,如问题1的响应中所述抛出它。
//this works
public static void writeToFile() throws FileNotFoundException {
try (PrintWriter out = new PrintWriter("filename.txt")) {
out.println("Hello world");
}
}
//this works
public static void writeToFile() {
try (PrintWriter out = new PrintWriter("filename.txt")) {
out.println("Hello world");
}
catch(FileNotFoundException e) {
//handle the exception or rethrow it
}
finally {
//this is optional
}
}
//this works
public static void writeToFile() {
try (Scanner out = new Scanner(System.in)) {
out.println("Hello world");
}
}
//this does not work
public static void writeToFile() {
try (PrintWriter out = new PrintWriter("filename.txt")) {
out.println("Hello world");
}
}
//compiler error: Multiple markers at this line
- Unhandled exception type IOException thrown by automatic close()
invocation on out
- Unhandled exception type IOException
问题3。
要在Java中使用try-with-resources块中的资源,必须实现AutoCloseable接口。在C#的情况下,IDisposeable接口由资源实现。一个这样的例子是StreamReader。 using块将在范围结束时自动关闭资源,但它不会处理错误。为此,你必须在使用块中使用try-catch。
public virtual void Print()
{
using (StreamWriter reader = new StreamWriter(@"B:\test.txt"))
{
try
{
throw new Exception("Hello Exception");
}
catch(Exception ex)
{
throw;
//or throw ex;
}
}
}
如果没有捕获异常,您将看到IDE引发的异常,并在catch块中显示消息“发生了'System.Exception'类型的未处理异常。”
将来,如果您需要C#中的Java等价物,this link会有所帮助。