2011-12-13 68 views
2

因此,我的教授已经为我们指定了一个项目,我们必须从文本文件中接收命令并使用它们来驱动程序的流程。诸如起飞,陆地,装载货物,卸载货物等这些命令是为了模拟飞机状物体。Java:抛出异常后如何继续读取文件

有时这些命令没有意义执行,例如在飞机正在飞行时装载货物。因此,为了防止这样的事情的发生,我们有我们自己的异常类代码,即“如果飞机被下令装载货物,而在飞行,扔I​​nvalidActionException”

我的问题是:我怎么能继续阅读,从文本文件中的命令异常已被抛出后(看到如何一旦被抛出,程序不能进步进一步

这里是我想要做一个概要:

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 
     } 
    } 

我是ld感谢任何帮助。谢谢。

+1

如果你发现异常,那么程序不会突然结束。确保你在catch语句中指定了正确的Exception类。 – DaveJohnston

+0

只需在catch子句之后的括号之间插入想要捕获的异常,并且您有解决方案:catch(InvalidCommandException e){// ignore} –

+0

当您知道它是垃圾时,是否真的想继续处理该文件? ? – toto2

回答

3

Catch适当的异常和流量会自动达到while循环状态。

导尿例外无需额外为后完成继续该程序。

2

吸引您的具体情况例外:

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

最好不要按照@Graham Borland的建议在循环中进行。 – Mudassir

+2

@Mudassir,但这就是操作者想要的,因为循环才能继续。格雷厄姆没有暗示说,他只是说明会发生什么。 –

+1

@Mudassir:在发生异常之后,OP需要读取下一行时必须在内部。 – Azodious

2

这正是你想做的事。所有读取和处理语句都在try区块中,而catch区块只包含错误处理(其可能仅包含在某处打印警告消息。

您需要注意的一点是您不需要“T陷入死循环。确保周围循环每次你正在处理新的数据!

2

由于您的catch位于while循环内,因此在捕获异常后,循环自然会继续进行下一次迭代。

2

看到如何一旦被抛出,程序突然结束

只有未捕获的异常停止一个线程。我建议你赶上所有你想要继续的例外,你不会有问题。

1

捕获块中捕获的任何异常都不会导致程序终止。只需抓住你想处理的例外,你的循环就会继续。

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,你基本上捕获任何可以抛出的异常。但是,您可能只想捕捉特定的例外情况。例如,PlaneCrashException可能应该导致程序终止。

1

你所显示的大纲足以实现你想要的(即try-catch-construct在while循环内)。只要确保catch语句声明了要捕获并忽略的正确类型或超类型的异常。

更新:如果您不确定要捕捉什么样的异常,您可能需要捕捉“Throwable”,但这不是真正的建议。当你的老师让你实现自己的异常时,你可能会将它们从一个现有的Exception类中分离出来。您可能想要捕获该异常类型。

而完全不同的是,您可能希望在执行序列之前将文本文件中的所有命令读入到字符串列表中。这可以让你免于一些IO问题,因为你始终保持文件句柄打开(对于这样一个简单的任务似乎没有必要)。

+0

通过保持打开文件,程序可以处理来自套接字或其他实时输入以及磁盘文件的数据。鉴于文件数据,这可能是教授想要编写程序的方式。我同意通常最好尽快关闭文件 - 抓取数据然后处理它。 – RalphChapin

1

要添加到其他答案:例外可以做一些工作。太常见了,他们告诉你,你的程序是绝望不稳定的,应该立即关闭。

通常情况下,他们告诉你发生了一些不好的事情,并给你一个机会向用户解释问题,然后继续。例如,一个意外的文件结束异常。你可以告诉用户该文件是坏的,让他们尝试另一个。您也可以打印堆栈跟踪,以便他们可以打电话给您,即使您未打印广泛的错误消息,也可以确定发生了什么情况。

请注意此异常的分裂特征。就像第一种类型(通常是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".) 
} 

的异常可能会被抛出上下多层次,它会弹出你圈外的相当整齐。在大多数情况下,这太简单了。通常它太复杂了; try-catch块可能很烦人。喜欢的东西:

while (readAStringFromFile(in)); 

要好很多快写,如果readAStringFromFile有把它看的地方。

在你的具体情况下,使用这样的exeptions可能是你的教授正在寻找的东西。我个人的经验是,与try-catch块相比,几乎总是有一种更好的方式来做到这一点,但是当他们工作的时候,他们的工作非常好。