【问题标题】:Unhandled exception type Exception in EclipseEclipse中未处理的异常类型Exception
【发布时间】:2020-10-18 17:45:50
【问题描述】:

我在 Java 中有类 Parser,如下所示:

public class Parser {
public ArrayList<MetroStop> listeArrets;

public Parser() {
    this.listeArrets = new ArrayList<>();       
}

public MetroStop creerArret(String [] parts) {
    MetroStop arret = new MetroStop (); 
    arret.identifiant = Integer.parseInt(parts [0]);
    arret.longitude = Double.parseDouble(parts [1]);
    arret.latitude = Double.parseDouble(parts [2]);
    arret.nom = parts [3];
    arret.destination = parts [4];
    arret.moyen = parts [5];
    return arret;
}

public  void  parse(String fichier)  throws  Exception {
    try {
        Reader reader = new FileReader(fichier);
        BufferedReader  br = new  BufferedReader(reader);
        String line;    
        while((line = br.readLine ()) != null) {
            String [] parts = line.split("#"); 
            MetroStop arret = creerArret(parts);
            listeArrets.add(arret);     
        }
        br.close();
    } catch (FileNotFoundException e) {
        throw new RuntimeException(e);      
    }
}

}

我也有 Main 类:

public class Main {
public static void main(String[] argv) {    
    Parser teste = new Parser();
    teste.parse("ratp_arret.csv");
}

}

当我将 Main 类作为 Java 应用程序运行时,我收到此错误: “未处理的异常类型Exception”,它指向main()方法的第二行。 文件 ratp_arret.csv 位于 src 文件夹中,这也是工作目录。我使用的是 Eclipse。 我不明白这个错误来自哪里。 感谢您的帮助!

【问题讨论】:

  • 错误出现在编译时,而不是运行时。该错误意味着 parse() 方法被声明抛出异常并且您没有在调用者中捕获它。
  • 请阅读 Java 中的检查异常。此外,将方法声明为throws Exception 也是一种不好的做法。指定该方法抛出的确切检查异常。
  • @m0skit0 是的,我很抱歉是在我编译它的时候。这种情况我该怎么办?
  • parse 方法的声明中删除 throws Exception
  • @Eritrean 我这样做了,现在我在 Parser 类中收到错误“未处理的异常类型 IOException”。

标签: java eclipse exception


【解决方案1】:

您调用teste.parse(someString),其中teste 是一个类型为Parser 的表达式。这意味着这是在您的Parser 类型中调用parse(String) 方法......

这是用throws Exception声明的。

异常是一种传达替代返回选项的机制。 parse 方法可以通过以下两种方式之一运行:它可以“返回”,在这种情况下它什么也不返回 (void),或者它可以“抛出”。它可以抛出的内容受到其throws 行的限制——在这种情况下,它几乎可以抛出任何东西(异常是几乎所有你可以抛出的东西的超类型)。

java 处理这种情况的方式是您的代码需要处理方法可以得出的所有可能方式

所以,当parser() 方法返回时,您的代码需要一个“路径”(这是微不足道的;这是一个 void 方法,您可以“免费”获得,您不需要为此编写任何特殊的东西),但您还需要其他退出场景的路径:当它抛出某些东西时。您可以免费处理RuntimeException,但对于其他人,您有两种选择:

抓住它:

try {
    teste.parse(someString);
    // this code runs in the 'return' case.
} catch (Exception e) {
   // this code runs in the 'throws' case.
}

这意味着您知道当您的 parse 方法决定通过 throws 路径退出时该做什么。

或者,您可以通过让主方法“分叉”来解决此问题,并规定它有两种完成方式:通过return 路由或throw 路由:

public static void main(String[] args) throws Exception {
    teste.parse(someString);
}
// this main method has declared that it has two separate
// exit routes. 'return', and 'throws something'.

java 将通过运行其 main 方法来启动应用程序,并且 java 可以处理具有两个备用退出路由(返回或抛出某些东西)的 main。它什么都不做来处理“返回”路线。它通过打印异常的类型、消息、堆栈跟踪和整个因果链来处理“抛出一些东西”的路线。这是一个很好的默认设置,您不应该尝试通过例如提出不同的默认设置。捕获该异常并尝试“记录它”。

这:只需将throws Exception 添加到您的主方法声明中。将throws Exception 放回您的解析方法,忽略@Eritrean 的建议。

注意:所有方法本质上都被声明为好像他们说throws RuntimeException, Error(如,任何错误和任何运行时异常都可以在不为其编写 throws 子句的情况下引发,因为所有方法都隐含地已经包含该子句),这个这就是为什么我之前说过 RuntimeExceptions 是“免费处理的”。这个想法是,所有 RuntimeException 子类的异常都是如此普遍或不太可能发生的事情,将其强制管理给程序员会很笨拙。这就是为什么你永远不需要写throws NullPointerExceptionthrows InternalError

【讨论】:

  • 感谢您提供详细信息!真的很有帮助!
【解决方案2】:
public  void  parse(String fichier)  /*throws  Exception*/ {
    try {
        // ...
    } catch (FileNotFoundException e) {
        throw new RuntimeException(e);      
    }
}

你抛出RuntimeException。这称为未检查异常,在方法声明中声明这些异常并在调用方法时捕获它不是强制性的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2012-12-22
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多