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

Java 在这种情况下,如何正确处理异常?,java,file-io,exception-handling,error-handling,Java,File Io,Exception Handling,Error Handling,我有一个名为Dictionary的类,它从文本文件中读取定长分隔词,并从中创建一个树集,用于查找字典中是否存在一个词 所以我显然需要以某种方式处理IOException。我的问题是,错误处理责任应该落在Dictionary类身上,还是落在创建Dictionary对象的代码身上 以下是我所拥有的: public class Dictionary { private final TreeSet<String> stringSet = new TreeSet<>();

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

所以我显然需要以某种方式处理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);
    }
}
公共类字典
{
私有最终树集stringSet=新树集();
//建造师
公共字典(字符串文件名)引发IOException
{
try(最终读取器=新的InputStreamReader(新文件InputStream(文件名)))
{
//将字典加载到stringSet中
最终字符[]缓冲区=新字符[4];
int numRead=-1;
而((numRead=reader.read(buffer))>0)
add(新字符串(buffer,0,numRead).toUpperCase());
}
捕获(IOE异常)
{
投掷e;
}
}
公共布尔包含(字符串字)
{
返回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
    }
}
public类MainClass
{
公共静态void main(字符串参数[])
{
String fileName=“C:/Users/Brandon/Desktop/Android Development/Practice Apps/SwapWords_Prototype/src/data/dictionary.txt”;
尝试
{
Dictionary dict=新字典(文件名);
}
捕获(IOE异常)
{
System.out.println(“无法加载字典”);
e、 printStackTrace();
}
//待办事项处理记录
}
}

字典应该捕获并处理IOException还是将其抛出调用代码?我的意思是,两种方法都可以,但哪一种更符合逻辑呢?

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


您不希望调用方生成一个由于异常而在内部无效的
字典
,但对调用方来说完全没有问题。

您所做的看起来没问题(尽可能晚地捕获异常),只是您可以摆脱
捕获(IOException e){throw e;}
…我会将加载字典文件的逻辑移到它自己的单独方法中(使用类似于
newdictionary().load(file)
)。然后从构造函数中删除抛出。顺便说一句,这个问题更适合我的看法。@Perception:非常感谢你提出这个想法。它实际上解决了一个问题,那就是我必须编写一个反向代码来解决这个问题。它更有条理,而且更明显地表明正在做什么。还要感谢CodeReview链接,我甚至不知道它的存在。我觉得问这个问题很愚蠢,但是……用我现在的代码,
MainClass
中catch try块之后对
dict
的任何引用都无法解决。我很困惑,是的。因为
dict
是在
try
块中声明的,所以它是该代码块的本地。如果您希望能够在外部使用它,则需要在外部声明它(并在内部初始化它)。或者,只需将所有需要
dict
的代码放在try块中,因为如果我们点击
catch
块,那么
dict
无论如何都是无效的,所以我们可能不想使用它。很抱歉,我直到现在才看到您的评论:我没有收到关于您编辑的通知,你问问题的地方。