所以我的教授给我们分配了一个项目,我们必须从文本文件中获取命令并使用它们来推动我们程序的流程。这些命令,如起飞,着陆,装载货物,卸载货物等,都是为了模拟类似飞机的物体。
有时这些命令执行起来没有意义,比如在飞机飞行时装载货物。因此,为了防止类似的事情发生,我们必须在我们自己的异常类中进行编码,即“如果飞机在飞行中被命令装载货物,则抛出InvalidActionException”
我的问题是:如何在抛出异常后继续从文本文件中读入命令(看看它们抛出后如何,程序无法进一步发展
以下是我想要做的概述:
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
}
}
我将不胜感激任何帮助。感谢。
答案 0 :(得分:3)
Catch
相应的异常和流量将自动达到while
循环条件。
在导致异常之后,没有必要继续执行该计划。
答案 1 :(得分:2)
抓住您的特定例外:
while(input.hasNextLine())
{
try
{
//execute commands by reading them using input.nextLine()
}
catch ( UserDefinedException ex )
{
//catch the exceptions you're throwing
}
}
答案 2 :(得分:2)
这正是你想要做的。所有读取和处理语句都在try
块中,catch
块只包含错误处理(除了在某处打印警告消息之外,其他任何内容都可以。
你需要注意的是,你不要陷入无休止的循环中。确保每次循环都处理新数据!
答案 3 :(得分:2)
由于catch
位于while
循环内,因此在捕获到异常后循环将自然地继续到下一次迭代。
答案 4 :(得分:2)
看到一旦他们被抛出,程序突然结束
只有未捕获的异常会停止一个线程。我建议你抓住你想要继续的所有例外,你就不会有问题。
答案 5 :(得分:1)
catch块中捕获的任何异常都不会导致程序终止。只需捕获您想要处理的异常,您的循环就会继续。
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
可能会导致程序终止。
答案 6 :(得分:1)
您展示的大纲足以实现您想要的(即try-catch-construct在while循环中)。只需确保catch语句声明了要捕获并忽略的正确类型或超类型。
更新:如果您不确定要捕获的异常类型,您可能希望捕获“Throwable”,但实际上并不建议这样做。当您的老师让您实现自己的异常时,您可能会将它们基于一个现有的Exception类。您可能希望捕获该异常类型。
完全不同的是,您可能希望在执行序列之前将文本文件中的所有命令读入字符串列表。这可能会使您免于一些IO问题,因为您始终保持文件句柄处于打开状态(这对于这样的直接任务来说似乎没有必要)。
答案 7 :(得分:1)
添加到其他答案:例外可以完成许多工作。很常见的是,他们告诉你,你的程序绝对不稳定,应该立即关闭。
通常情况下,他们会告诉您发生了一些不良和意外的事情,并让您有机会向用户解释问题,然后继续。例如,意外的End-Of-File异常。你可以告诉用户文件是坏的,让他们尝试另一个。您还可以打印出堆栈跟踪,以便他们可以给您打电话,即使您没有打印出大量的错误消息,也可以弄清楚发生了什么。
请注意此异常的分裂个性。与第一种类型(通常是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
有一个放置它的内容的位置,写起来会更好,更快。
在您的特定情况下,使用此类记忆可能是您的教授正在寻找的。我个人的经验是,几乎总有一种比使用try-catch块更好的方法,但是当它们工作时,它们的效果非常好。