2016-11-24 5 views
1

ich einen Artikel über checked und unchecked Ausnahmen in Java zu lesen und fand diesen Artikel/link: https://projectlombok.org/disableCheckedExceptions.htmlDeaktivierte Checked Exceptions in Java möglich?

Laut dem Artikel es für javac entwickelt nur ein Hack ist.

Betrachten Sie den Code-Schnipsel unten:

import java.io.*; 
class Example 
{ 
    public static void main(String args[]) throws IOException 
    { 
     FileInputStream fis = null; 
     fis = new FileInputStream("myfile.txt"); 
     int k; 

     while((k = fis.read()) != -1) 
     { 
      System.out.print((char)k); 
     } 
     fis.close();  
    } 
} 

Here I public static void main(String args[]) throws IOException zu schreiben, weil ich eine Datei zu öffnen versuchen. Hier ist "throws" -Klausel ein Muss. Ohne es werde ich einen Fehler bekommen. Was ist, wenn ich sicher bin, dass die Datei, die ich öffne, existiert? ifmyfile.txt in dem erwähnten Ort. Irgendwann kann man fühlen, dass wenige geprüfte Ausnahmen für den Code nicht erforderlich sind.

Gibt es eine von Java zur Verfügung gestellte Einrichtung, um geprüfte Ausnahmen je nach Bedarf zu deaktivieren?

Auch nach so viel Recherche konnte ich keine passende Antwort dafür finden.

+0

Wenn Sie Software schreiben, sind Sie nie sicher, dass etwas so ist, wie Sie denken, ist es. Sie sollten also immer Exceptions auslösen, wenn etwas schief geht. Warum möchten Sie sie deaktivieren, wenn alles in Ordnung ist, wird es nie geworfen, in anderen Fällen sollte es geworfen werden und Sie sollten sie nicht deaktivieren –

+2

Sie können jetzt sicher sein, aber was ist, wenn dieser Speicherort der Datei ändern oder nicht verfügbar sein wird (wie durch Disc/Dateisystem Korruption)? Wie sollte Java in dieser Situation reagieren? Es hat eine Ausnahme von 'new FileInputStream (" myfile.txt ");' aber es kann nichts damit anfangen ... Wie soll dein Code weitergehen? Sollte es weiter gehen und einfach jede Ausnahme ignorieren? Dies verlangt nach Ärger. – Pshemo

+0

Wie können Sie sicher sein? – njzk2

Antwort

1

Gibt es eine von Java zur Verfügung gestellte Einrichtung, um geprüfte Ausnahmen je nach Bedarf zu deaktivieren?

keine offiziellen Einrichtungen, aber es gibt Abhilfen einen bei Bedarf verwenden kann:

Erstens, da beide geprüft sind und ungeprüft Ausnahmen in Java, möglicherweise eine Option deaktiviert Ausnahmen verwenden.Alle Ausnahmen, die von Runtime ableiten sind nicht markiert:

Runtime die übergeordnete Klasse dieser Ausnahmen ist, die während des normalen Betriebs der Java Virtual Machine geworfen werden kann. Eine Methode ist nicht erforderlich, um in ihrer throws Klausel alle Unterklassen von RuntimeException zu deklarieren, die möglicherweise während der Ausführung der Methode geworfen werden, aber nicht gefangen.

Interessant lesen here, here.

Dann gibt es type erasure, die erlaubt, eine geprüfte Ausnahme zu werfen, ohne es zu deklarieren. Diese
ist, was Projekt lombok verwendet für @SneakyThrows

import lombok.SneakyThrows; 

public class SneakyThrowsExample implements Runnable { 
    @SneakyThrows(UnsupportedEncodingException.class) 
    public String utf8ToString(byte[] bytes) { 
    return new String(bytes, "UTF-8"); 
    } 

    @SneakyThrows 
    public void run() { 
    throw new Throwable(); 
    } 
} 

Gebrauch mit Vorsicht:

Beachten Sie, dass es unmöglich ist, schleichend zu fangen geworfen Typen geprüft direkt, wie javac lassen Sie nicht einen Haken schreiben Block für einen Ausnahmetyp, den kein Methodenaufruf im Testkörper als geworfen deklariert.

Und schließlich ist es nur der Compiler, der sich um checked Ausnahmen kümmert, es ist überhaupt kein Teil des jvm. Sobald Sie die Compiler-Phase hinter sich haben, ist alles möglich. Wenn Sie also Bytecode direkt schreiben oder eine Version von javac mit checked exceptions disabled verwenden, wird diese komplett umgangen.

1

Abgesehen von dem Hacken des Compilers gibt es keine Option, um geprüfte Ausnahmen zu deaktivieren, die ich kenne. Am besten können Sie die geprüfte Ausnahme abfangen und innerhalb einer Laufzeitausnahmebedingung erneut ausführen, wenn Sie nicht möchten, dass der Clientcode die geprüfte Ausnahme verarbeitet.

0

Gibt es eine von Java zur Verfügung gestellte Einrichtung, um die aktivierten Ausnahmen je nach Bedarf zu deaktivieren?

Nein, Sie können geprüfte Ausnahmen nicht deaktivieren, da sie für einen bestimmten Zweck gedacht sind.

Geprüfte Ausnahmen sind hilfreich, wenn bei einer Ausnahme ein Wiederherstellungsmechanismus (im Code) bereitgestellt werden soll (z. B. IOException). Außerdem machen sie Sie darauf aufmerksam, dass es möglich ist, durch Ausführung von Code eine Ausnahme zu erhalten, und Sie können entsprechende Maßnahmen ergreifen.

Diese Compile-Zeit für das Vorhandensein von Exception-Handler überprüft wird entwickelt, um die Anzahl von Ausnahmen zu reduzieren, die nicht richtig behandelt sind.

Ich schlage vor, Sie zu here besser zu verstehen.