【问题标题】:Is there an alternative to try/catch in Java for opening a file?在 Java 中是否有替代 try/catch 来打开文件的方法?
【发布时间】:2014-12-17 15:21:50
【问题描述】:

我记得在我的c++ 课程中,我们会在打开文件时使用以下代码来处理错误:

ifstream in;
in.open("foo.txt");
if(in.fail()){
   cout << "FAILURE. EXITING..." << endl;
   exit(0);
}

现在我正在学习java,我在使用try/catch 语句时遇到了问题,因为当我创建扫描仪来读取我的输入文件时,在try 代码块之外无法识别它。 java中是否有与fail()exit(0)等价的方法,或者有更好的方法吗?

【问题讨论】:

  • 在你使用的方法中使用throwsbeginnersbook.com/2013/04/java-throws
  • 查看变量范围。
  • @Dinal24 这如何防止使用 try/catch(除非你想要一个崩溃的程序)? BrentAllard:在 try 块之前声明变量。
  • C++ != Java。不要以 C++ 为指导编写 Java 代码,也不要以 Java 为指导编写 C++ 代码。
  • 老实说,我更喜欢 C++,但 Java 接口更好。

标签: java c++ file exception-handling try-catch


【解决方案1】:

我在使用 try/catch 语句时遇到问题,因为当我创建扫描仪来读取我的输入文件时,它在“try”代码块之外无法识别。

好!您不应该在 try 块之外使用它。文件的所有相关处理都应try块内,例如:

try (
    InputStream istream = new FileInputStream(/*...*/); // Or Reader or something
    Scanner scanner = new Scanner(istream)
    ) {
    // Use `scanner` here
}
// Don't use `scanner` here

(这是使用新的 try-with-resources。)

在上面,我假设当您说 Scanner 时,您专门谈论的是 Scanner 类。

回答您的实际问题:不,这不是 Java 代码的标准做法。 Java 包含异常。

【讨论】:

  • 你为什么这么说,@T.J.Crowder?异常的唯一原因不应该是文件的实际打开吗?
  • @BrentAllard:扫描仪是用来读取文件的,对吧?还是我误会了?所以除了读取文件时,扫描仪的存在是没有意义的。
  • 不,这就是我对扫描仪所做的。我明白你的意思,但是除了文件的 opening 之外还有什么可能导致异常?
  • @BrentAllard:任何文件读取操作都可能导致异常(例如,I/O 错误),因此所有Scanner 的各种“下一个”操作都可能抛出。但基本点是:如果 Scanner 是用来读取文件的,那么 Scanner 的唯一用途应该是在 try 块内,这取决于成功打开文件。
  • @BrentAllard:如果您是 Java 新手,可能值得为您标记 try-with-resources 语句为您做了什么:基本上,无论您在 () 之后打开什么当控制超出try出于任何原因(正常执行离开块,异常等)时,try 将自动关闭(以相反的顺序),并且如果异常它关闭事物而不让关闭操作期间的任何异常掩盖发生的主要异常。因此,它极大地简化了您的代码。
【解决方案2】:

要让Scannertry...catch 块外可见,只需在块外声明变量即可:

Scanner scanner = null;

try {
    scanner = ... //Initialize scanner
} catch (IOException e) {
    //Catch
}

现在您可以在try...catch 块之外使用您的扫描仪对象。要检查初始化是否成功,你可以检查null,如果你真的需要,但通常错误处理应该在catch块内完成,例如

try {
    scanner = ... //Initialize scanner
} catch (IOException e) {
    System.out.println("Failure. Exiting");
    exit(1);
}

【讨论】:

    【解决方案3】:

    您可以将 throws Exception 添加到您使用扫描仪的方法中。

    void method_name() 抛出异常{方法定义}

    这样,方法就知道部分代码会抛出异常,需要处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 2016-02-14
      • 2023-03-25
      • 2019-12-04
      • 1970-01-01
      相关资源
      最近更新 更多