Wie MAN statische scanner Globale variable ohne Scannen ständig und verwenden Sie es innerhalb von Methoden und die main-Methode?
Ich möchte erstellen Sie eine statische scanner, aber ich werde gerne mal die try-catch-block um, damit er automatisch in der Nähe der Vermeidung von Ressourcen
Leckagen und oder dieser Ausnahme:
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1585)
at softwareEngineer.UserApp1.main(UserApp1.java:82)
Im wesentlichen möchte ich nur zum erstellen einer statischen scanner Erklärung und verwenden Sie es, während das Hauptprogramm und enthält die statischen Methoden, an dieser Stelle meinen code benötigen, um die Erstellung von separaten scanner für jede Methode und Sie werden die Kraft " - scan.close()". der folgende code erhalten, die eine exception-handling-Fehler aufgrund von mehreren Scannern, die offen war und nicht closein das Programm.
Ich aktualisierte den code nun bekomme ich eine null-Zeiger-Ausnahme
import java.util.Scanner;
public class UserApp1 {
static User currentCustomer = null; //single object
static Scanner scan;
//-------------------------------------------------------
//Create a list, then repeatedly print the menu and do what the
//user asks until they quit
//-------------------------------------------------------
public static void main(String[] args) {
scan = new Scanner(System.in);)//scanner to avoid resource leak
printMenu(); //print menu system from another function
String choice = scan.nextLine(); //reads an input
final String EXIT_now = "0";
final String BACK = "back";
while (!(choice.equalsIgnoreCase(EXIT_now))){
switch(choice) {
case 1: break;
case 2:
currentCustomer = loginInput();<---- errors happens here
if(currentCustomer != null){
System.out.println("You have successfully login");
}
break;
default:
System.out.println("Sorry, invalid choice");
break;
} //ends switch
printMenu(); //print menu system from another function
choice = scan.nextLine(); //reads an input
}//ends while
System.out.println("\t\t GoodBye!\n Thank you for trying our program.");
System.exit(0);
}//ends main
//----------------------------
//Print the user's choices
//----------------------------
public static void printMenu() {
System.out.println("\t\t The User Login System ");
System.out.println("\t\t ======================");
System.out.println("The Menu Options:");
System.out.println("1: Register an Account");
System.out.println("2: Login to your Account");
System.out.println("3: Reset Password");
System.out.println("0: Quit/Exit ");
System.out.println("Please enter your selection > ");
} //ends printMenu
public static User loginInput(){
System.out.print( "\nFollow the Prompts to Log-In to your Account \n ");
System.out.print( "\nPlease enter your userid : \n ");
String userid = scan.nextLine();//<---- errors happens here
System.out.print( "\nPlease enter your password: \n ");
String pass = scan.nextLine();
currentCustomer = AccountList.loginUser(userid, pass);
if (currentCustomer != null)
{
return currentCustomer;
}
return null;
}//ends loginInput
}//ends class*
- Es gibt keine globalen Variablen in Java.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bist du mit einem try-mit-Ressourcen, die automatisch schließen, wenn Sie fertig sind die try-block. Versuchen Sie, diese auf eine variable in etwa so:
Vermeiden, dass mehrere Scanner mit dem System.im input als auch, wie Sie verbrauchen den Strom und dann hast du ein ganz anderes problem.
scan
variable. Besonders im Fall vonScanner
mitSystem.in
Sie sollten wirklich immer nur das erstellen einer einzigen Instanz.scan
, sondern als Einstellung in Ihrem Bereich. Entfernen Sie die try-block vollständig aus dem main-Methode, und legen Sie die neue Scanner-Instanz auf Ihrem Feld statt, um eine neue variable.scan.close()
.AutoCloseable
, sollte absolut geschlossen, wenn Sie fertig sind mit Ihnen. Die Tatsache, dass Sie sehen keine Nebenwirkungen, die nicht in der Nähe der Ressource (zum Beispiel, weil Sie in der JVM-exits) ist keine Entschuldigung - Ressourcen-Lecks können schleichen, zu unerwarteten Zeiten und die Ursache schwer zu diagnostizieren oder erklären Fehler. Gerade schließen Sie Ihre Ressourcen, wenn Sie fertig sind mit Ihnen, es gibt keinen Grund, nicht zu.System.in
scanner sind Sie in der Regel schon fertig mit dem Programm völlig.Vermeiden Sie die Verwendung einer statischen globalen Scanner überhaupt, indem Sie die Scanner-Instanz, die Sie möchten, mit zu arbeiten, um die entsprechenden Methoden. Betrachten Sie dieses vereinfachte Beispiel:
Möchten Sie Ihre Ressourcen aufteilen, um sicherzustellen, Sie sind in Ihrem Umfang begrenzt und einfach zu schließen. Setzen Sie im global-state jeglicher Art macht, die sehr schwierig ist. Stattdessen trennen Sie das öffnen und schließen der Ressource aus dem code verwenden. Diese Art der Aufteilung macht für viel mehr wartbaren, lesbaren und testbaren code.
Beispielsweise durch die übergabe einer bereits offenen
Scanner
auf Ihr core-business-logic-Funktionen, können Sie simulieren Sie eine Reale Nutzerverhalten und erstellen Sie einen test durch, um sicherzustellen, dass Ihr code bleibt stabil, durch den Bau einerScanner
liest aus einer hart codierten String, und die übergabe, die in Ihrer Methode, ohne benötigen, um ausführen die gesamte Klasse, und geben Sie in das Verhalten Ihrer Prüfung manuell wieder und wieder.Scanner
beim Aufrufnew Scanner()
, die immer sein sollte fertig in a try-mit-Ressourcen blockieren, so dass es automatisch geschlossen, wenn Sie fertig sind mit ihm. Das bestehen der vorhandenen Ressourcen zu anderen Methoden können Sie komplizierte arbeiten, , mit denen die vorhandenen Ressourcen und lässt die öffnen-schließen bis an den Aufrufer dieser Methoden.back
, jemand wird Sie immer gebenBaCk
, und so weiter. Sollten Sie normalisieren Ihre Eingabe, wenn möglich, Kleinbuchstaben,.trim()
usw.) oder scheitern, fallen und heben Sie klare Fehler, wenn Sie unklar oder unverständlich.