【问题标题】:Java Try/Catch IssuesJava 尝试/捕获问题
【发布时间】:2013-12-06 05:28:14
【问题描述】:

我对 Java 比较陌生,而且我总是遇到代码中的 Try/Catch 函数的问题,所以我想知道你们是否可以帮助我。

我遇到的问题是我编写了一个 try/catch,但我收到一条错误消息,指出永远不会抛出异常。我在我的整体代码的另一部分写了一个类似的语句,它运行良好,所以我想知道这个问题是什么。

代码如下:

public String getMatchedLogs(String matchStr, File logFile) {
    String fileLine = "";
    try {
        Scanner ipScan = new Scanner(fileLine);
        if (fileLine.indexOf(matchStr) > -1) {
            output += fileLine;
        }else{
            System.out.println(fileLine.indexOf(""));
        }
    } catch (FileNotFoundException fnfe) {
        System.out.println(fnfe.getMessage());

    }
    return fileLine;
} //end getMatchedLogs

错误出现在 catch 中,它表示永远不会抛出异常。所以如果你们能给我一些关于发生了什么的见解,我将不胜感激。

【问题讨论】:

  • 为什么要扫描空字符串并获取未使用的参数?

标签: java error-handling


【解决方案1】:

您实际上并没有对参数File logFile 做任何事情,您只是在使用您定义的空String fileLine = "";。因此没有文件访问正在进行,因此没有FileNotFoundException的机会。

【讨论】:

    【解决方案2】:

    养成查找方法的习惯,看看它们是否按照您的想法做。

    File 对象的 Scanner 构造函数打开一个文件并声明它可以抛出 FileNotFoundException http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#Scanner(java.io.File)

    String 的 Scanner 构造函数会扫描字符串本身并且不会打开文件,因此不需要抛出异常 http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#Scanner(java.lang.String)

    顺便说一句:您的代码似乎正在使用扫描仪写入传入的字符串(“filine”)。字符串在 Java 中是不可变的,并且在传递给方法时无法更改。

    【讨论】:

    • 感谢您的链接。我一定会调查的。
    【解决方案3】:

    FileNotFound 异常不是由 Scanner 扫描线引发的。您没有使用logFile,因此不可能抛出FileNotFoundException

    【讨论】:

      【解决方案4】:

      如果你有一个编译器知道永远不会发生的 catch 处理程序,Java 编译器可能会抱怨。 (与 Scala 等较新的语言相比,Java 异常规则往往非常严格)

      【讨论】:

        【解决方案5】:

        您正在捕获此处未抛出的特定类型的异常。

        所以你应该试试:

        catch (Exception e) {}
        

        捕捉任何类型的异常。

        【讨论】:

          【解决方案6】:

          如果FileNotFoundException 以外的任何Exception 无法处理您的情况。最好如下使用..

               try {
                  try {
                      Scanner ipScan = new Scanner(fileLine);
                      if (fileLine.indexOf(matchStr) > -1) {
                          output += fileLine;
                      } else {
                          System.out.println(fileLine.indexOf(""));
                      }
                  } catch (FileNotFoundException fnfe) {
                      System.out.println(fnfe.getMessage());
                  }
              } catch (Exception e) {
                  // error log here
              }
          

          【讨论】:

          • 谢谢,我会试试的。 :)
          • 如果我们可以编写多个 catch 块,那么根据您的回答使用嵌套的 try-catch 有什么好处?
          • @JqueryLearner 实际上这取决于您的需求。如果您愿意抛出除特定异常之外的其他异常,那么您根本不想使用嵌套异常。但是在某些情况下,我们不想抛出异常抛出的任何东西。
          • @Ruchira 我的意思是说我们可以写 catch (FileNotFoundException fnfe) { System.out.println(fnfe.getMessage()); } } catch (Exception e) { // error log here } 所以它会检查两个异常(在 OP 的情况下)但是你使用 ed 2 try -catch 我的问题是一次尝试和 2 次捕获
          • @JqueryLearner 两者最终都会给你相同的结果。你也可以使用try{}catch(FileNotFoundException | Exception e){}
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-12
          • 1970-01-01
          • 1970-01-01
          • 2021-12-13
          相关资源
          最近更新 更多