首页 > 解决方案 > Eclipse中未处理的异常类型Exception

问题描述

我在 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);      
    }
}

}

我也有主课:

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

}

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

标签: javaeclipseexception

解决方案


你打电话teste.parse(someString), whereteste是一个具有类型的表达式Parserparse(String)这意味着这是对您类型中的方法的调用Parser....

那是用 . 声明的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您的 parse 方法,忽略@Eritrean的建议。

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


推荐阅读