0

在这里学习Java的家伙。我在学校有一个任务,我们用一些简单的 GUI 制作了一个小小的星球大战游戏。在我的SaveToFile()方法和ReadFromFile()方法中,我的方法抛出异常。这没关系,一切正常。

但在作业中它说:“某些方法可能会抛出异常。这些需要合理处理。” 我不明白这是什么意思。它显然与试图避免代码重复有关。有人有任何提示吗?是为错误制定一种可以重用的方法吗?

这是我的代码:

private void readFromFile()
{
    try{
        gui.makeInVisible();
        FileInputStream fis = new FileInputStream("Savegame.obj");
        ObjectInputStream ois = new ObjectInputStream(fis);

        Battleground battleground = (Battleground) ois.readObject();
        GUI gui = new GUI(battleground);
        BattleController bc = new BattleController(gui, battleground);
        ois.close();
    }
    catch (IOException e) {
        gui.updateActionField("Something went wrong... Did you delete the file Savegame.obj while playing?");
        e.printStackTrace();
    }
    catch (ClassNotFoundException f) {
        System.out.println("Woops. This game looks broken! Did you delete the whole battleground class?");
    }
}
private void saveToFile() {
    try{
        // Serialize data object to a file
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("Savegame.obj"));
        out.writeObject(battleground);
        Serialize data object to a byte array
        ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
        out = new ObjectOutputStream(bos) ;
        out.close();

        // Get the bytes of the serialized object
        byte[] buf = bos.toByteArray();
    } catch (IOException e) {
        gui.updateActionField("Something went wrong with saving the file. And we really don´t know what I am afraid!");
    }
}

谢谢。

4

5 回答 5

3

我认为您已经为学校作业做了一些“合理的异常处理”,但是您仍然应该在关闭输出流的地方添加一个 finally 块。如果现在发生异常,则流将永远不会关闭。

于 2013-05-16T10:44:30.137 回答
2

SaveToFile并且如果例如找不到文件ReadFromFile可能会抛出Exceptions,任务要求的是您不要让这些异常传播并在它们发生的情况下破坏您的程序。

从技术角度来看,这意味着你应该做这样的事情(假设这是你的ReadFromFile,我没有测试就写了它只是为了解释这一点):

try {
    String sCurrentLine;
    BufferedReader br = new BufferedReader(new FileReader(pathToFile));
    while ((sCurrentLine = br.readLine()) != null) {
    System.out.println(sCurrentLine);
    }
} catch (IOException e) {
    // here you should handle the IOException, maybe you want
    // to notify the user, or probably exit the program with 
    // a log in the console or whatever else
} 

一般来说,让Exceptions 传播不是一个好主意,您应该在代码中可以处理它们的位置立即处理它们;在不知道您的代码的情况下,我的假设是您应该立即在从文件中读取并立即通知用户的方法中执行此操作。

正如@cHao 在评论中所建议的那样,赋予ReadFromFile通知用户的责任并不是一个合适的解决方案,这取决于你如何构建你的代码,你可能希望让Exception传播进一步向上,直到你到达一个更广泛的类了解应用,可以选择做什么。

于 2013-05-16T10:23:21.213 回答
1

如果您在代码中使用异常,您还必须在使用函数的地方处理它们。每次处理或处理异常时,您都可以记录异常,将其打印出来等……但处理本身对每种情况都非常具体。

没有“所有异常的神奇代码”。在每种情况下恢复并采取相应的行动是您的工作。

网上有很多关于正确异常处理的教程,比如这个:http ://www.tutorialspoint.com/java/java_exceptions.htm

并且不要在不处理它们的情况下调用可能启动异常的函数,因为这会导致程序崩溃。

于 2013-05-16T10:23:12.990 回答
0

您可以查看 java http://docs.oracle.com/javase/tutorial/essential/exceptions/中的异常处理

您可能会了解什么是异常类型,应该处理哪些异常,哪些不应该处理,以及处理异常/错误的不同方法。

可能在您的情况下,您必须捕获异常并抛出自定义异常,或者可能只是显示更合理的评论/日志。

于 2013-05-16T10:23:37.807 回答
0

您应该捕获从文件输入/输出中抛出的任何异常,并执行任何清理代码,例如关闭连接。向用户显示错误消息也很好。

这就是我所说的“合理”

于 2013-05-16T10:23:41.523 回答