尝试使用java中的资源和例外

时间:2016-05-25 20:53:53

标签: java c#

在Eclipse中创建此类函数时

public static void writeToFile() throws FileNotFoundException {

    try (PrintWriter out = new PrintWriter("filename.txt")) {
        out.println("Hello world");
    }
}

我被迫将throws FileNotFoundException添加到方法。

现在,我的理解是正确的:

  • 即使我尝试使用资源,如果try块内有异常,它也不会被吞没,而是冒泡了?这就是我被迫添加throws关键字的原因?
  • 尝试使用资源就像在try和finally中包含代码一样 - 并且省略了catch子句吗?那么内部发生的任何异常都会冒泡?
  • 在C#using?
  • 中的行为也相同

1 个答案:

答案 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会有所帮助。