2017-01-13 11 views
0

Ich habe diesen Code:nicht gemeldete Ausnahme muss gefangen oder erklärt werden, um in statischen Initialisierer geworfen wird

class C { 
    private static final Object myObject = makeObject(); // * 

    private static Object makeObject() throws IOException { 
     try { 
      ... 
     } catch (IOException e) { 
      ... 
      throw e; 
     } 
    } 
} 

Wenn ich versuche, es zu kompilieren, erhalte ich Ausnahme im Einklang mit * markiert:

error: unreported exception IOException; must be caught or declared to be thrown 

Wie deklariert man die Ausnahme, die in diesem Fall ausgelöst werden soll? Ich weiß, dass ich es verstehen kann, meine Frage betrifft die Syntax.

+0

Haben Sie versucht, statische {...} Block? – efekctive

+0

Ja, ich bekomme einen ähnlichen Fehler. – akonsu

+0

Sie können einen "try/catch" -Block in einen statischen Initialisierungsblock setzen und die "IOException" abfangen. Ich denke, das ist so nah wie möglich. Sie können es in diesem Fall nicht deklarieren. – khelwood

Antwort

5

Wenn Sie die Signatur von makeObject() werfen IOException behalten wollen, müssen Sie es auf diese Weise tun:

class C { 
    private static final Object myObject; 

    static { 
     try { 
      myObject = makeObject(); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    private static Object makeObject() throws IOException { 
     try { 
      ... 
     } catch (IOException e) { 
      ... 
      throw e; 
     } 
    } 
} 

Es ist nicht erlaubt eine geprüfte Ausnahme von einer Methode zu werfen, die eine (statische) Feld initialisiert oder innerhalb eines statischen Blocks. Es ist jedoch erlaubt, eine ungeprüfte (Laufzeit-) Ausnahme auszulösen. So müssen Sie Ihre IOException fangen und es in eine (Unterklasse von) RuntimeException wickeln.

Alternativ können Sie einfach werfen nicht IOException from makeObject() `durch die Verpackung dort tun:

class C { 
    private static final Object myObject = makeObject(); // OK now 

    private static Object makeObject() { // no 'throws' 
     try { 
      ... 
     } catch (IOException e) { 
      ... 
      throw new RuntimeException(e); // wrap here 
     } 
    } 
} 

IOException sind eine geprüfte Ausnahme, die von der Java Language Specification verboten ist (möglicherweise) zu sein in einem geworfenen Klasse Variableninitialisierer oder statische Initialisierer (siehe JLS §11.2.3. Exception Checking):

Es ist ein Fehler bei der Kompilierung, wenn eine Klasse Variableninitialisierer (§8.3.2) oder statische Initialisierer (§8.7) von einer benannten Klasse oder Schnittstelle werfen ac gehackte Ausnahmeklasse.

Diese Einschränkung gilt nicht für ungeprüfte (Laufzeit-) Ausnahmen.

+0

danke. Kannst du erklären, warum das 'RuntimeException' funktioniert, aber' IOException' nicht ausgelöst wird? Ich bin neu in Java .. – akonsu

+0

@akonsu - Ich habe einen Verweis auf JLS hinzugefügt, wo dies in der Regel angegeben ist. Vielleicht möchten Sie sich mit aktivierten oder nicht aktivierten Ausnahmen befassen, um die Unterschiede besser zu verstehen. –

+0

statische Member werden initialisiert, bevor eine Instanz dieser Klasse erstellt wird. Eine ungeschützte Ausnahme während der statischen Initialisierung könnte die Klasse unbrauchbar machen – efekctive

Verwandte Themen