Java:如何在抛出exception后继续读取文件

所以我的教授给我们分配了一个项目,我们必须从文本文件中获取命令并使用它们来驱动我们程序的流程。 这些命令如起飞,着陆,装载货物,卸载货物等等 – 用于模拟类似飞机的物体。

有时这些命令执行起来没有意义,比如飞机在飞行中装载货物。 因此,为了防止这样的事情发生,我们必须在我们自己的exception类中进行编码,即“如果在飞行中命令飞机装载货物,则抛出InvalidActionException”

我的问题是:如何在抛出exception后继续从文本文件中读入命令(看看它们抛出后如何,程序无法进一步发展

这是我想要做的概述:

Scanner input = new Scanner(new FileInputStream("stuff1.txt")); while(input.hasNextLine()) { try { //execute commands by reading them using input.nextLine() } catch() { //catch any exceptions and ignore them... continue to read //the file for more commands } } 

我将不胜感激任何帮助。 谢谢。

Catch适当的exception并且流程将while循环条件下自动到达。

在导致exception之后,没有必要继续执行该程序。

抓住你的特定例外:

 while(input.hasNextLine()) { try { //execute commands by reading them using input.nextLine() } catch ( UserDefinedException ex ) { //catch the exceptions you're throwing } } 

这正是你想要做的。 所有的读取和处理语句都在try块中, catch块只包含error handling(除了在某处打印警告消息之外,它可能只包含error handling)。

你需要注意的是你不要陷入无休止的循环中。 确保每次循环都在处理新数据!

因为你的catchwhile循环中,所以在捕获exception之后循环将自然地继续到下一次迭代。

看到它们被抛出后,程序突然结束

只有未捕获的exception会停止一个线程。 我建议你抓住你想要继续的所有例外,你就不会有问题。

catch块中捕获的任何exception都不会导致程序终止。 只需捕获您想要处理的exception,您的循环就会继续。

 while(input.hasNextLine()) try { //execute commands by reading them using input.nextLine() } catch (CargoLoadingException e) { System.err.println("Can't load cargo while the plane is in flight."); } catch (OtherException e) { e.printStackTrace(); } } 

请注意,如果捕获Throwable ,则基本上可以捕获任何可以抛出的exception。 但是,您可能只想捕获特定的exception。 例如, PlaneCrashException可能应该导致程序终止。

您显示的大纲足以实现您想要的(即try-catch-construct在while循环中)。 只需确保catch语句声明了要捕获和忽略的正确类型或超类型的exception。

更新:如果你不确定要捕获什么样的exception,你可能想要捕获“Throwable”,但这并不是真的建议。 当您的老师让您实现自己的exception时,您可能会将它们基于一个现有的Exception类。 您可能希望捕获该exception类型。

在一个完全不同的说明中,您可能希望在执行序列之前将文本文件中的整个命令读入字符串列表。 这可能会使您免于一些IO问题,因为您始终保持文件句柄处于打开状态(这对于这样的直接任务来说似乎没有必要)。

要添加到其他答案:例外可以执行许多工作。 通常情况下,他们会告诉您,您的程序绝对不稳定,应立即关闭。

通常情况下,他们会告诉您发生了一些不良和意外的事情,并让您有机会向用户解释问题然后继续。 例如,意外的End-Of-Fileexception。 你可以告诉用户文件是坏的,让他们尝试另一个。 您还可以打印出堆栈跟踪,以便他们可以打电话给您,即使您没有打印出大量的错误消息,也可以弄清楚发生了什么。

请注意此exception的分裂个性。 与第一种类型(通常是RunTimeException实例)一样,它们可以让您确切地知道发生了什么,几乎没有您做任何事情。 但是,Java也强迫您意识到可能抛出IOException并试图强迫您为用户写一条好消息。 我一直对此感到困惑。 如果我捕获到EOFException,我知道它发生在哪里,我不需要堆栈跟踪。 (当然,如果我知道EOF 不会发生,我不打算给用户一个正确的消息,并且当它发生时堆栈跟踪将非常方便。)

但是还有第三种例外,它是前一种例外的第二种人格。 它只是让你知道正常发生的事情。 效率很高(如果设置正确,请参见下文)。 它可以比在一堆方法调用中返回值更清晰。 它允许一个已经返回的方法,比如一个String(具有空引用完全没问题)来提醒调用方法一个特殊条件,并且可选地,在该条件下提供大量数据。

 public static class MyEOFException extends EOFException { // Saves creating a meaningless stack trace. public Throwable fillInStackTrace() { return this; } } // Saves creating a new object every time you use it public static MyEOFException myEOF = new MyEOFException(); 

然后,在一个方法内:

 try { for (;;) { String text = readAStringFromFile( in ); // Do something with text... } } catch (MyEOFException e) { // Nothing at all needs to be done here. // Note that MyEOFException COULD have beeen set up with tons of data and // then a lot of work could be done. (The file might end with binary // data, for instance, which would be in "e".) } 

exception可能被抛出很多级别,它会让你完全摆脱循环。 在大多数此类情况下,这有点过于简单化了。 通常它太复杂了; try-catch块可能很烦人。 就像是:

 while (readAStringFromFile( in )); 

如果readAStringFromFile有一个放置它的内容的地方,那么写readAStringFromFile更好,更快。

在您的特定情况下,使用这样的exeptions可能是您的教授正在寻找的。 我个人的经验是,几乎总有比使用try-catch块更好的方法,但是当他们工作时,他们的工作非常好。