2011-12-13 67 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塊相比,幾乎總是有一種更好的方式來做到這一點,但是當他們工作的時候,他們的工作非常好。