2014-03-14 37 views
0

我試圖拋出新的異常,當args.length沒有任何參數供應,​​而不是打印出我的消息它打印出ArrayIndexOutOfBounce異常。Java:爲args.length == 0發生新的異常。不起作用?

if (args.length == 0) 
    { 
    throw new DeleteFieldException("You must set at least three arguments"); 
    } 

我的陷阱:

catch (DeleteFieldException exception) 
{ 
    System.err.println(exception); 
} // catch 

和我定製的異常類:

public class DeleteFieldException extends Exception 
    { 
     private String message = null; 

     public DeleteFieldException() 
     { 
     super(); 
     } 

     public DeleteFieldException (String message) 
     { 
     super (message); 
     this.message = message; 
     } 

     public DeleteFieldException (Throwable cause) 
     { 
     super (cause); 
     } 

     public DeleteFieldException (String message, Throwable cause) 
     { 
     super (message, cause); 
     } 

     public String toString() 
     { 
     return message; 
     } 

     public String getMessage() 
     { 
     return message; 
     } 

    } // DeleteFieldException 

回答

4

你捕獲異常並不意味着什麼,如果你只是打印出來的消息。你的代碼會繼續執行,可能會碰到你實際讓數組訪問的行,如argv[n],它會拋出這個異常,你不會捕獲它,所以它崩潰。

你必須在你的catch塊中採取實際的預防措施。

編輯的注意事項要求:

這些預防措施是完全應用程序特定的,但是從您提供的代碼,我明白,你的應用程序需要命令行參數,並通過異常處理要檢查用戶是否給你的代碼運行足夠的命令行參數。

在這種情況下,您應該問自己:「如果用戶沒有提供必要的參數,我該怎麼辦?」

首先可能的答案(最有可能),在這個例子中,因爲你需要命令行參數,你要問用戶使用正確的參數重新運行該程序,並安然退出。在這種情況下,假設您在主要方法中執行異常處理,您只需要return即可退出。代碼如下:

catch (DeleteFieldException exception) 
{ 
    System.err.println("Some error message"); 
    return; 
} // catch 

如果你正在做這東西比主就可以返回您用來通知主叫方法有什麼不對的一些其他有價值的另一種方法。如果方法應該返回一個對象返回null,如果它應該返回一個非負數返回-1等

其次,您可以爲那些你所期望的用戶給你一些默認值,那個catch塊是完美的地方。查看下面的代碼以獲得稍微不同的場景。

try{ 
    myVariable = argv[1]; 
} 
catch(ArrayIndexOutOfBoundsException e){ 
    myVariable = 10; //lets say 10 is the default value 
} 

它甚至犯規檢查argc == N喜歡你的代碼,它只是試圖指定命令行參數變量。如果用戶沒有給出任何輸入argv[1]會導致該異常,那麼可以將其捕獲並作爲預防措施您將默認值賦予該變量。

+2

另外,我想補充說,對於這種異常,你不想擴展'Exception',你想擴展'RuntimeException',這樣它就不必每次都用try-catch來包裝它被使用了。 – AxiomaticNexus

+0

「如果您只是打印出消息」< - 我希望IDE模板設計人員在'catch'塊中自動生成'e.printStackTrace()'之前記住異常並不意味着什麼...... – fge

+0

@ fge我希望編譯器生成警告.. IDEs是不正確的:) –