java - 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。我不明白这个错误来自哪里。谢谢您的帮助!
解决方案
你打电话teste.parse(someString)
, whereteste
是一个具有类型的表达式Parser
。parse(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 NullPointerException
or throws InternalError
。
推荐阅读
- aws-lambda - 使用无服务器设置从 Windows 部署到 lambda 的文件的执行权限
- python - Pandas - 如何在列中查找一组值,如果存在则返回另一列中的值
- python - 将任意长度的列表或元组传递给用 C 编写的 Python 扩展
- python - Scrapy请求,蜘蛛中的shell Fetch()
- c# - 如何使用现有数据库在 MVC (C#) 中进行开发
- python - 非零向量上的 TensorFlow 操作
- c# - 部署 AWS .NET SDK 项目失败
- firebase - 在限制之前和之后对 Firestore 集合进行排序
- katalon-studio - 在 Katalon Studio 中检索 WebUI 中的所有 DOM 元素
- php - 登录在php mysql代码中不起作用