Methoden Scanner Methode

Neoline

Mitglied
Hallo,

unzwar habe ich probiert meinen Einlesevorgang in eine eigene Methode zu packen allerding möchte er mir keine Ausgabe liefern. Wenn ich ohne den Scanner arbeite klappt die Ausgabe mit allerdings nicht wo liegt mein Fehler ?
Java:
package test;

import java.util.Scanner;

public class String_umkehren {

    public static void main(String[] args) {
        einlesen();
        System.out.println(einlesen());
    }//main
    public static String einlesen() {
        Scanner sc = new Scanner(System.in);
        String eingabe = sc.nextLine();
        sc.close();
        return eingabe;
    }//einlesen
}//class
Als Fehlermeldung erhalte ich folgendes
Code:
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at test.String_umkehren.einlesen(String_umkehren.java:13)
    at test.String_umkehren.main(String_umkehren.java:9)

Grüße

Neoline
 
Du darfst den Scanner nicht schließen weil sonst auch der Inputstream geschlossen wird und keine weiter Eingabe mehr möglich ist.
 
Okay. Vielen dank für die Antwort. Klappt nun soweit allerdings muss ich nun mindestes zwei Eingaben tätigen wobei nur die letze dann Ausgegeben wird. z.B. Tippe erst 1 und dann 2 ein dann erst wird 2 ausgegeben.
 
Hallo,

eine Frage hätte ich dann doch noch undzwar an welcher Stelle kann ich den Scanner wieder schließen ? Jetzt ist das ja weniger ein Problem wenn der offen bleibt aber, wenns mal größer wird dann bleibt der ja immer für immer offen.

Java:
package test;

import java.util.Scanner;

public class String_umkehren {

    public static void main(String[] args) {
        System.out.println(umkehren(einlesen()));
    }//main
    public static String einlesen() {
       
        Scanner sc = new Scanner(System.in);
        String Eingabe = sc.nextLine();
        return Eingabe;
    }//einlesen
    public static String umkehren( String str )
      {
        String umgekehrt = new String();

        for ( int j = str.length()-1; j >= 0; j-- )
          umgekehrt += str.charAt(j);

        return umgekehrt;
      }//umkehren
}//class

Grüße

Neoline
 
Prinzipiell dann, wenn du ihn nicht mehr brauchst.

Aber:
Meiner Meinung nach muss man sich nicht wirklich darum kümmern den Scanner zu schließen.
Der darunterliegende Stream blockiert meines Wissens nach nicht viele Ressourcen.
 
Naja eigentlich brauch ich ichs nicht mehr nach dem return, aber danach schließen kann ichs ja nicht weil da bin ich ja schon aus der Methode raus.

Das dies nicht unbedingt von Nöten ist, weiß ich allerdings interessiert es mich einfach wie das klappen würde daher meine Frage.

Edit:

Habs nochmal probiert mit folgendem Code eigentlich wie zu beginn wo ich Fehler bekommen habe, aber nun gehts warum auch immer weißt du wieso ?
Ist die gleiche Methode wie im ersten Beitrag wenn ich das richtig sehe nur das ich es jetzt nicht direkt ausgebe sondern in einer andern Methode verarbeite.

Java:
package test;

import java.util.Scanner;

public class String_umkehren {

    public static void main(String[] args) {
        System.out.println(umkehren(einlesen()));
    }//main
    public static String einlesen() {
       
        Scanner sc = new Scanner(System.in);
        String Eingabe = sc.nextLine();
        sc.close();
        return Eingabe;
       
    }//einlesen
    public static String umkehren( String str )
      {
        String umgekehrt = new String();

        for ( int j = str.length()-1; j >= 0; j-- )
          umgekehrt += str.charAt(j);

        return umgekehrt;
      }//umkehren
}//class
 
Dann mal ganz theoretisch:

Wenn du ganz genau weißt, dass du die Methode nur einmal aufrufst und danach System.in nicht mehr brauchst könntest du das ganze in einen try-with-Resource Block packen.
Java:
try(Scanner scanner = new Scanner(System.in)) {
    String eingabe = scanner.nextLine();
    return eingabe;
}

Oder den Scanner als Klassenvariable anlegen und am Ende deiner main-Methode schließen.
Java:
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
     String a = einlesen();
     String b = einlesen();
     ...

     scanner.close();
}
private static String einlesen() {
     String eingabe = scanner.nextLine();
     return eingabe;
}
 

Zurück
Oben