我必须在构造函数中初始化文件对象并处理异常,使用throws
是否有效,或者我应该选择try
/ catch
?
答案 0 :(得分:13)
可以在构造函数中抛出异常。我知道一些Java库类这样做(URI只是一个例子)。我认为抛出异常比返回未知或无效状态的对象更好。
答案 1 :(得分:8)
当然你可以抛出异常实际上是我会做的(而不是在构造函数中吞下它)。您希望让调用者知道发生了意外情况,您不希望返回未正确初始化的实例。也就是说,可能表明你在构造函数中做了太多事情。
答案 2 :(得分:6)
考虑一个构造函数,或者就此而言任何方法,以获得契约。构造函数的契约非常简单 - 你给我(零,一个或多个)参数,我会给你一个构造对象。好的做法是建议这个对象的内部数据结构应该正确初始化,不变量不变,尽管语言中没有任何内容可以强制执行。
如果由于某种原因构造函数无法持有此契约,那么它应该抛出异常。这可能是因为传递的参数(如果有的话)是不可接受的(前置条件失败)或一些外部问题(文件系统已满,堆耗尽,网络中断等)阻止它。
答案 3 :(得分:3)
对我而言,这不是效率问题。
如果您可以对异常状态做出反应并仍然创建有效或至少可用的对象,则在构造函数中处理它。
否则 - 如果对象不可用 - 将异常抛回给调用者。在这种情况下,他不会得到一个对象,也不能继续使用不可用/不一致的实例,这可能会在应用程序的某些其他角落产生错误。
答案 4 :(得分:3)
您确定可以(例如,FileOutputStream
确实可以。)
应该明智地从构造函数中抛出异常 - 确保清理干净后自己清理。有时会在构造函数中抛出异常,以确保RAII被保留。
答案 5 :(得分:2)
你应该把对象带到构造函数中的安全状态,但是让我们想象你想要打开一个不存在的文件(用于读取),抛出异常是唯一的方法。所以它取决于你实现的逻辑
答案 6 :(得分:2)
我建议使用try / catch,并从你的捕获中抛出有用的错误。这将使用户更好地了解您的应用程序出了什么问题。例如,您应该检查文件是否存在,以及正确格式化的条件。
答案 7 :(得分:1)
通常,在构造函数中进行繁重的工作是一个坏主意:在许多语言中,无论如何,在构造期间可以对异常做什么都会受到限制。
答案 8 :(得分:1)
通常,在构造函数中只使用简单逻辑是个好主意(例如,使用参数值设置私有字段)。并与其他特殊的“装配工”,“编制者”或“工厂”一起设置您的对象。同样是关于get / set方法 - 它们应该尽可能简单。
当然可以从constuctor抛出异常。但这不是一个好习惯。
答案 9 :(得分:1)
我认为在构造函数中抛出异常是一种在构造函数中指示错误条件的优雅方法。否则,您必须创建另一个初始化资源的函数,并在构造对象后调用该函数。
答案 10 :(得分:0)
如果您关心构造函数中初始化的内容,我会选择'throws',我想你会这样做。
如果隐藏了异常,那么以后可能会导致问题。
答案 11 :(得分:0)
当然,它实际上在Java中使用了很多。例如,
public FileInputStream(String name)
throws FileNotFoundException