2014-01-24 28 views
8

在一個假設的情況下,我有一個這樣的類:靜態代碼塊可以拋出異常嗎?

import java.io.File; 
import java.util.Scanner; 
class X 
{ 
    static Scanner scanner; 
    static 
    { 
     scanner = new Scanner(new File("X.txt")); 
    } 
} 

編譯時,我得到

未報告exeption java.io.FileNotFoundException;必須被捕或宣佈投擲

因爲public Scanner(File source) throws FileNotFoundException

爲了解決這個問題,我可以把一個try/catch語句scanner = new...行:

static 
    { 
     try 
     { 
      scanner = new Scanner(new File("X.txt")); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

然而,有沒有什麼辦法,我可以這樣做:

static throws java.io.FileNotFoundException 
    { 
     scanner = new Scanner(new File("X.txt")); 
    } 

這是一個假設的情況。請不要說「那麼你爲什麼要這麼做?」或「這是製作掃描儀的更好方法!」

+0

坦率地說,我在這裏看不到問題。 –

回答

7

JLS §11.2.3

這是一個編譯時錯誤,如果一個名爲類或接口的類變量初始化(§8.3.2)或靜態初始化(§8.7)可以拋出 checked異常類。

爲了完整起見,一個檢查異常JLS §11.1.1定義:

RuntimeException及其所有子類,統稱爲運行時異常類。

未經檢查的異常類是運行時異常類和錯誤類。

這是唯一一種可以從靜態初始化器拋出的異常。

6

靜態代碼塊不能拋出檢查異常,你可以捕獲檢查的異常,適當地記錄它並拋出運行時異常。您想要將檢查的異常嵌套爲根本原因。

但是,您最終收到的異常將是某種形式的ClassInitializationException,您可以查看嵌套的異常以確定根本原因。

相關問題