Voilà. Donc le message d'erreur est causé par ceci dans la classe Bibliotheque :
try (Scanner sc = new Scanner(System.in)){
Pour rappel, cette syntaxe est le try-with-resource, dont l'unique but est d'être bien certain qu'on va fermer la ressource mentionnée.
Ici on s'assure de bien fermer System.in
Donc
- le programme principal lit System.in pour connaître le choix dans le menu de l'utilisateur
- le choix est d'ajouter un livre, appel de Ajouter()
- Ajouter() lit les infos du livres en utilisant System.in, et en s'assurant qu'il sera bien fermé après
- on a fini d'ajouter un livre, on retourne au menu
- le programme essaie à nouveau d'utiiliser System.in pour connaître le choix dans le menu de l'utilisateur, ce qui est impossible puisqu'on s'est assuré de bien fermer System.in
A première vue la solution c'est de ne pas s'occuper de fermer System.in. Après tout tu ne l'as pas ouvert, alors ça ne fait pas tellement sens de le fermer.
Attention toutefois :
- on n'est pas censé créer plus d'un Scanner sur le même flux, et notamment pas sur System.in. Ici tu fais new Scanner(System.in) à deux endroits différents, Test et Bibliotheque. C'est générateur de problèmes.
- une solution à ça serait de créer un seul Scanner au tout début du programme, et de laisser toutes les classes qui en ont besoin, utiliser ce seul et unique Scanner créé.
- par nature, next() et nextLine() ne vont pas bien ensemble, ça crée des résultats contre-intuitifs. Il vaut mieux choisir d'utiliser uniquement l'un ou uniquement l'autre. En l'occurrence, comme tu peux avoir besoin d'espaces dans le titre d'un livre ou le nom d'un auteur, il vaut mieux utiliser nextLine() uniquement et faire comme si next() n'existait pas.
Honnêtement... Communiquer avec l'utilisateur dans la console, c'est bizarre et bien plus compliqué que ça ne devrait l'être quand on débute. Mais c'est comme ça, on fait avec ce qu'on a. Il y a peu d'effort pour rendre tout cela plus pratique, parce que quand on fait un vrai programme, il y a longtemps que la console n'est plus là.
Partager