2016-12-05 115 views
0

所以我需要添加一個新的方法到一個程序,它需要我訪問這個zip文件夾。第一種方法從網站下載並返回一個File對象。創建一個ZipFile,需要初始化,但初始化需要處理異常

所以現在在我的方法中,我想要將其更改爲ZipFile對象。在那一刻,我只想進入文件,使用該文件創建一個ZipFile對象,然後返回它。

所以一切都很好,但是當我創建ZipFile對象時,它說未處理的IOException在那裏。但是,如果我把try/catch放在它上面,我不能返回ZipFile。所以我先創建它然後做try catch,但告訴我ZipFile沒有初始化。有什麼想法可以解釋我在這裏想的是什麼,或者我可以如何分類?

我的代碼看起來像;

ZipFile zipTestData; 

try { 
    zipTestData = new ZipFile(testData) 
}catch (IOException io) 
    log.debug(io.toString()); 
}catch(Exception e) { 
    log.debug(e.toString()); 
} 

return zipTestData; 
+0

共享異常堆棧跟蹤 – sidgate

回答

2

你不應該「吞下」一個異常。如果發生異常,您可能應該將其傳遞給調用者處理。否則,主叫方會如何知道操作失敗?

您也可以使用您所描述的方法,如果主叫方準備正確處理結果,像這樣:

ZipFile zipTestData = null; 

try { 
     zipTestData = new ZipFile(testData) 
} catch (IOException io) 
    log.debug(io.toString()); 
} catch(Exception e) { 
    log.debug(e.toString()); 
} 

return zipTestData; 

這將返回null給調用者,而不是一個ZipFile,如果拉鍊不能創造出於任何原因。

雖然,在特定情況下,你也可以同樣寫

try { 
     return new ZipFile(testData) 
} catch (IOException io) 
    log.debug(io.toString()); 
} catch(Exception e) { 
    log.debug(e.toString()); 
} 

return null; 

的理由讓你得到的錯誤是當地變量通過在聲明默認初始化。所以當你聲明一個局部變量(ZipFile zipTestData;)時,它沒有被分配任何值。然後,如果在運行時拋出異常new ZipFile(testData),變量將不會被分配,而return將嘗試返回該未分配的變量的值。在Java中,這是被禁止的。

1

可能你應該初始化爲 ZipFile zipTestData = null; 沒有stacktrace這是我能想出的