簡體   English   中英

Java異常處理方法

[英]Java exception handling method

在處理我應該處理的3個異常時,在實現以下方法時遇到了一些麻煩。 我應該像我正在做的那樣包括try / catch塊,還是應該留給應用程序而不是類設計

該方法說我應該實現這一點:

public Catalog loadCatalog(String filename)
         throws FileNotFoundException, IOException, DataFormatException

此方法從產品目錄中指定的存檔中加載信息,然后返回目錄。

首先打開文件進行讀取。 然后,它繼續讀取和處理文件的每一行。

方法String.startsWith用於確定線的類型:

  • 如果行的類型是“產品”,則調用readProduct方法。
  • 如果行的類型是“ Coffee”,則調用readCoffee方法。
  • 如果行的類型是“ Brewer”,則調用方法readCoffeeBrewer。

在生產線處理之后, loadCatalog將產品(產品,咖啡或loadCatalog添加到產品目錄中。

處理完文件的所有行后, loadCatalog將產品目錄返回給進行調用的方法。

此方法可以引發以下異常:

  • FileNotFoundException如果指定的文件不存在。
  • IOException —如果讀取指定文件的信息時發生錯誤。
  • DataFormatException如果一行有錯誤(異常必須包括數據錯誤的行)

這是我到目前為止的內容:

public Catalog loadCatalog(String filename)
       throws FileNotFoundException, IOException, DataFormatException{
    String line = "";
    try {
        BufferedReader stdIn = new BufferedReader(new FileReader("catalog.dat"));
            try {
                BufferedReader input = new BufferedReader(
                    new FileReader(stdIn.readLine()));
                while(! stdIn.ready()){
                    line = input.readLine();                        
                    if(line.startsWith("Product")){
                        try {
                            readProduct(line);
                        } catch(DataFormatException d){
                            d.getMessage();
                        }
                    } else if(line.startsWith("Coffee")){
                        try {
                            readCoffee(line);                               
                        } catch(DataFormatException d){
                            d.getMessage();
                        }
                    }  else if(line.startsWith("Brewer")){
                        try {
                            readCoffeeBrewer(line);
                        } catch(DataFormatException d){
                            d.getMessage();
                        }
                    }
                }
            } catch (IOException io){
                io.getMessage();
            }
    }catch (FileNotFoundException f) {
        System.out.println(f.getMessage());
    }
    return null;
}

這取決於您是要使用類還是使用它的應用程序的其他部分來處理異常並執行所需的任何操作。

由於將使用loadCatalog()的代碼可能不知道如何處理文件I / O或格式異常,因此就我個人而言,我將創建一個類似CatalogLoadException的異常並從loadCatalog()方法中拋出該異常,然后將原因異常FileNotFoundExceptionIOExceptionDataFormatException )放入其中,同時包含一條信息性消息,具體取決於觸發了哪個異常。

try {
         ...
    //do this for exceptions you are interested in.
    } catch(Exception e) {
         //maybe do some clean-up here.
         throw new CatalogLoadException(e); // e is the cause.
    }

這樣,您的loadCatalog()方法將僅引發一個有意義的異常。

現在,將使用loadCatalog()的代碼只需處理一個異常: CatalogLoadException

loadCatalog(String filename) throws CatalogLoadException

這也使您的方法可以隱藏其實現細節,因此當基礎底層結構發生更改時,您不必更改其“異常拋出”簽名 請注意,如果更改此簽名,則每段代碼都需要進行相應更改,以處理您引入的新類型的異常。

另請參閱有關異常翻譯的問題。


關於投擲簽名要求的更新:

如果您必須保留該簽名,那么您別無選擇,只能throw它們throw應用程序中,而不是throw它們catchloadCatalog()方法中,否則, throws簽名將是無用的,因為我們不會引發與我們剛剛處理的完全相同的異常。

通常的想法是,將異常滲透到適當的位置進行處理。 我猜想您的老師希望他們能得到主要處理。 在這種情況下,我可以猜到是由於throws子句而獲得的。 一個簡單的經驗法則是,如果該方法在throws子句中聲明了異常,則不會在該方法中捕獲該異常。 因此,您正在編寫的方法應該沒有catch語句。

為此,您將更改代碼,例如:

public Catalog loadCatalog(String filename) 
    throws FileNotFoundException, 
           IOException, 
           DataFormatException
{
    String line = "";

    BufferedReader stdIn = new BufferedReader(new FileReader("catalog.dat"));
    BufferedReader input = new BufferedReader(new FileReader(stdIn.readLine()));

    while(!stdIn.ready())
    {
        line = input.readLine();

        if(line.startsWith("Product"))
        {
            readProduct(line);
        } 
        else if(line.startsWith("Coffee"))
        {
            readCoffee(line);
        }  
        else if(line.startsWith("Brewer"))
        {
            readCoffeeBrewer(line);
        }
    }

    return null;
}

然后在調用loadCatalog的方法(大概是main)中,您將擁有:

try
{
   loadCatalog(...);
}
catch(FileNotFoundException ex)
{
    ex.printStackTrace(); 
}
catch(IOException ex)
{
    ex.printStackTrace(); 
}
catch(DataFormatException ex)
{
    ex.printStackTrace(); 
}

用適當的東西替換printStackTrace。

這樣,方法loadCatalog不會處理顯示錯誤消息,因此您可以在GUI或控制台代碼中調用該方法,並且調用該方法的代碼可以選擇如何向用戶顯示錯誤(或在其中處理錯誤)。某種方式)。

這是Heinz Kabutz出色的文章,涉及異常處理。

http://www.javaspecialists.eu/archive/Issue162.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM