在这种情况下如何正确处理异常?

时间:2013-03-30 23:36:22

标签: java file-io exception-handling error-handling

我有一个名为Dictionary的类,它从文本文件中读取长度分隔的单词,并从中创建一个TreeSet,用于查找字典中是否存在单词。

所以我显然需要以某种方式处理IOException。我的问题是,如果错误处理职责落在Dictionary类上,还是它应该落在创建Dictionary对象的代码上?

这就是我所拥有的:

public class Dictionary
{
    private final TreeSet<String> stringSet = new TreeSet<>();

    // constructor
    public Dictionary(String fileName) throws IOException
    {
        try (final Reader reader = new InputStreamReader(new FileInputStream(fileName)))
        {
            // load dictionary into stringSet
            final char[] buffer = new char[4];
            int numRead = -1;
            while ((numRead = reader.read(buffer)) > 0)
                stringSet.add(new String(buffer, 0, numRead).toUpperCase());
        }
        catch (IOException e)
        {
            throw e;
        }
    }

    public boolean contains(String word)
    {
        return stringSet.contains(word);
    }
}

创建Dictionary对象的代码:

public class MainClass
{
    public static void main(String args[])
    {
        String fileName = "C:/Users/Brandon/Desktop/Android Development/Practice Apps/SwapWords_Prototype/src/data/dictionary.txt";
        try
        {
            Dictionary dict = new Dictionary(fileName);
        }
        catch (IOException e)
        {
            System.out.println("Could not load dictionary <" + fileName + ">");
            e.printStackTrace();
        }

        // TODO handle dict
    }
}

Dictionary应该捕获并处理IOException还是将其抛给调用代码?我的意思是,任何一个有效,但哪个更合乎逻辑?

1 个答案:

答案 0 :(得分:2)

我会说你现在设置它的方式很好。如果是Dictionary遇到IOException的情况,则没有任何好的方法可以恢复,那么您将需要提醒调用者发生此故障。另一方面,如果Dictionary可以自己优雅地处理错误(通过尝试加载不同的文件或其他内容),那么您可以将代码放在构造函数中以将其隐藏在调用者之外。

您不希望调用者使Dictionary由于异常而在内部无效,但对调用者来说看起来完全正常。