2015-09-03 1 views
0

Le Scannerdocumentation dit que lorsque l'on appelle next() sur un flux fermé alors ces deux exceptions peuvent être jetés:L'appel suivant() sur un scanner initialisé par un flux fermé ne jette pas IllegalStateException

NoSuchElementException - si plus de jetons sont disponibles

IllegalStateException - si ce scanner est fermé

De plus hasNext() peut jeter cette exception:

IllegalStateException - si ce scanner est fermé

Maintenant, nous allons supposer que nous avons ce code:

FileInputStream fis = new FileInputStream(new File("somefile")); 
Scanner sc = new Scanner(fis); 
// sc.close(); 
// sc = new Scanner(fis); 
// somefile contents: word1 word2 word3 
System.out.println(sc.next()); 

Ce imprimera word1 comme prévu. Si on décommente sc.close(); sc = new Scanner(fis); un NoSuchElementException sera levé quand sc.next() sera exécuté.

Ce comportement me semble étrange. Il ne faut pas hasNext() et next() jeter un IllegalStateException comme InputStream est fermé? S'il vous plaît, expliquez pourquoi cela se passe.

+0

Comme @Andreas dit, dans mon cas, il a jeté IllegalStateException: fermé Scanner. – wawek

+1

Je ne suis pas sûr de ce que vous dites. 'sc.hasNext()' effectue une exception fermée dans ce code, elle ne renvoie pas false. – Zarwan

+0

Vous avez raison, je me suis trompé. Je vais mettre à jour ma question un peu plus tard. –

Répondre

1

Il semble que vous ayez mal interprété la documentation de Scanner. Il dit next() lancera un NoSuchElementException s'il n'y a plus de jetons disponibles; C'est le cas lorsque le flux sous-jacent est à sa fin ou a été fermé. Il ne jeter un IllegalStateException si le scanner lui-même a été fermé qui ne se produit pas dans votre question.

+0

Je vois. C'est une différence subtile mais je l'obtiens maintenant. Merci. –