2

我正在尝试从文件中读取 ObjectOutputStream 并将其转换为数组列表。整个事情发生在一个应该读取文件并返回数组列表的方法中:

public static List<Building> readFromDatabase(){
    String fileName="database.txt";
    FileInputStream fileIStream=null;
    ObjectInputStream in=null;
    List<Building> buildingsArr=null;
    try
     {
        fileIStream = new FileInputStream(fileName);
        in = new ObjectInputStream(fileIStream);
        buildingsArr=(ArrayList<Building>)in.readObject();
     }
     catch(IOException e)
     {
        e.printStackTrace();
     }
     catch(ClassNotFoundException e)
     {
        Console.printPrompt("ArrayList<Building> class not found.");
        e.printStackTrace();
     }
    finally{
        Console.printPrompt("Closing file...");
        close(in);
        close(fileIStream);
        return buildingsArr;
    }
}

Java 告诉我这很危险。有哪些替代方案?我不能将 return 放在“try”块中,因为它不会这样做/它不会关闭“finally”块中的文件。我需要确保文件将被关闭,并返回我创建的数组列表。有任何想法吗?

4

3 回答 3

10

我不能将 return 放在“try”块中,因为它不会这样做/它不会关闭“finally”块中的文件。

错了,如果你把 return 放在 try 块中,finally 块仍然会执行。因此,您可以在 try 块中返回。

try
     {
        //your code
        return buildingsArr;
     }
     catch(IOException e)
     {
        e.printStackTrace();
     }
     catch(ClassNotFoundException e)
     {
        Console.printPrompt("ArrayList<Building> class not found.");
        e.printStackTrace();
     }
    finally{
        Console.printPrompt("Closing file...");
        close(in);
        close(fileIStream);
    }
于 2013-01-03T21:44:56.223 回答
1

我建议开始使用 Java 7 和 try with resources 子句。http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

前任:

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}
于 2013-01-03T21:50:50.943 回答
0

您必须抛出异常或返回值:

return "File Not Found"您需要证明这一点的只是在块之后注释掉finally它并查看它不会编译。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class ReturnFinallyExample
{
    public static void main(final String[] args)
    {
        returnFinally();
    }

    private static String returnFinally()
    {
        try
        {
            final File f = new File("that_does_not_exist!");
            final FileInputStream fis = new FileInputStream(f);
            return "File Found!";
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        finally
        {
            System.out.println("finally!");
        }
        return "File Not Found!";
    }
}

你必须有return之后finally或者你必须:

声明方法throws FileNotFoundExceptoin并重新抛出FileNotException

或者

FileNotFoundException用_throw new RuntimeException(e)

于 2014-10-20T16:39:45.457 回答