2014-09-21 3 views
3

Je lisais ce link pour try-with-resources et il dit:Pourquoi la méthode close de java.lang.AutoCloseable renvoie Exception, mais la méthode close de java.io.Closeable renvoie IOException?

La méthode proche de l'interface Closeable émet des exceptions de type IOException alors que la méthode proche de l'interface AutoCloseable émet des exceptions de type Exception.

Mais pourquoi? La méthode proche de AutoCloseable aurait aussi jeté IOException est-il un exemple qui soutiennent cette méthode proche de AutoCloseable doit lancer des exceptions de type Exception

+0

Je pense que c'est simplement une mauvaise décision de la part des fabricants de langage. Il vous oblige à attraper une exception générique partout où vous utilisez try-with-resources. –

Répondre

7

L'interface AutoClosable est situé dans java.lang et est destinée à être appliquée à toute ressource qui doit être fermé 'automatiquement' (try-with-resources). Le AutoClosable ne doit pas être une ressource io releated. Donc l'interface ne peut faire aucune hypothèse d'une exception concrète.

D'autre part Closable est situé dans java.io et étend AutoClosable, parce qu'un Closable est un AutoClosable pour les ressources io. Par conséquent, il déclare que IOException s peuvent être jetés à proximité.

Par exemple ... un java.sql.Connection est un AutoClosable parce qu'il est la méthode étroite jette SQLException et un SQLException n'est pas un IOException. Pensez aux DB de mémoire et il est logique que la fermeture d'une connexion sql ne doit pas lancer un IOException.

EDIT

répondaient plus de doute à savoir pourquoi AutoClosable est maintenu sous paquet java.lang. Merci.

Je pense qu'il est situé dans java.lang parce try-with-resources a été présenté comme une fonctionnalité de langage Java 1.7. Ainsi, java.lang

+0

a répondu à un doute de plus, c'est-à-dire pourquoi 'AutoClosable' est conservé sous le paquet' java.lang'. Merci. – Vishrant

+0

@Vishrant J'ai mis à jour ma réponse ... En retard mais j'espère pas trop tard :) –

+0

En fait, répondu pourquoi 'AutoCloseable' a été créé du tout au lieu de simplement réutiliser' Closeable'. – entonio

4

Closeable étend AutoCloseable, mais il pourrait y avoir d'autres interfaces particulières qui étendent cette interface. .: par exemple

public interface MyCloseable extends AutoCloseable { 
    void close() throws RunTimeException; 
} 

Ils voulaient avoir une interface qui peut être utilisé dans de nombreux cas, ce qui est la raison pour laquelle ils ont décidé d'utiliser Exception parce que cela fonctionne aussi pour d'autres types d'exceptions.

Questions connexes