当前位置: 首页 > 知识库问答 >
问题:

文件中的某些方法使用布尔值来指示其成功(而不仅仅是抛出异常)有什么原因吗?

庞彬
2023-03-14

Java中的文件类包含一些方法,这些方法利用布尔值来指示正在执行的操作的成功性。上述方法的用户需要在每次调用时检查返回值。

以下是取自mkdir()的文档片段,说明了要求:

公共布尔值mkdir()

创建由该文件命名的目录,假设其父目录存在。如果还想创建缺失的父对象,请使用mkdirs。

请注意,此方法不会在失败时引发IOException。呼叫者必须检查返回值。

createNewFile()也有一个例子,它(甚至更奇怪)使用布尔值和抛出的异常来表示成功:

公共布尔createNewFile()引发IOException

根据文件中存储的路径信息在文件系统上创建一个新的空文件。如果该方法创建了一个文件,则返回true;如果该文件已经存在,则返回false。请注意,即使文件不是文件,它也会返回false(例如,因为它是一个目录)。

...

请注意,如果文件已经存在,即使不是常规文件,此方法也不会引发IOException。调用者应该总是检查返回值,并且可能还想调用isFile。

现在,这看起来充其量是不方便的,因为用户必须预测两种错误场景,而不仅仅是使用一个简单的try-catch块。

这件事背后的原因是什么?

共有1个答案

祁建明
2023-03-14

因为这是他们二十多年前设计它的方式。如果你能让开发商离开他们的养老院,离开他们的齐默框架,你可能会得到一个更好的答案。否则我们都只是猜测。

然而,你不需要像一些人认为的那样频繁地调用这些方法。例如,isFile()/exists()/delete()/createNewFile()newfileinputstream(…)之前都是多余的 新文件输出流(…) ,它将抛出您正在查找的异常。调用文件。exists()/delete()/createNewFile()在这些构造函数或相应的FileReader/Writer构造函数之前,这是一种严重的时间和空间浪费,构造函数(或者由构造函数调用的操作系统代码)必须重复的工作。我怀疑我是否使用过文件。createNewFile()将在20年内完成。

 类似资料:
  • 我正在尝试使用HttpWebRequest验证Url的存在。我发现了一些基本上这样做的示例: 但是,如果url确实损坏了,它不会返回响应,而是抛出异常。 我将代码修改为: 这似乎终于做到了我想要的。 但是我想知道,为什么请求会抛出异常,而不是返回带有NotFindstatus代码的响应?

  • 所以我必须做以下其中之一: 在每个doSomething调用周围添加try catch块 在main中添加throws语句 删除doSomething中的throws语句 将该条件作为前提条件,这样不遵循该条件就会导致未定义的行为或类似的行为。 3将不起作用,因为doSomething可能会在客户端使用时引发异常。1和2简直是多余的,我认为应该避免。 我的问题是:在提到的选项(或任何其他选项)中,

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

  • 下面是我的代码。当我运行它时,我在线程“main”java.lang.IndexOutOfBoundsException:Index:3、Size:2中得到异常,而不是我的异常消息。谁能解释一下我做错了什么,为什么会这样?谢谢!

  • null 为简洁起见,排除了getter和setter(用于所有字段)以及toString()。 我尽了最大的努力按照指导原则格式化代码,但它没有发生,请耐心等待。 @Entity@Table(name=“Products”)@XmlRootElement@NamedQueries({@NamedQuery(name=“Product.FindAll”,query=“从产品p中选择p”),@nam

  • 最近配置了eslintrc,有一个文件中有'no-dupe-class-members': 'error'的错误,如果单独扫描该文件eslint [file path]时可以扫出来,但用eslint src/的方式扫描包含该文件的父级目录,结果中就不存在此错误了,这是什么原因?