Hej! Vores lektion i dag bliver speciel! I dagens lektion vil vi tale om Java Scanner Class. Tidligere var processen med at fuldføre opgaver og skrive programmer enkel: vi skriver noget kode, kører main ()metoden gør programmet det, der kræves, og vi er færdige. Men nu vil alt ændre sig! I dag lærer vi, hvordan man virkelig interagerer med programmet: vi lærer det, hvordan man reagerer på vores handlinger! Før vi begynder at analysere koden, har du nogensinde skullet håndtere en enhed som en scanner? Sandsynligvis. Indersiden af en scanner er ret kompliceret, men den grundlæggende idé om, hvordan den fungerer, er meget enkel: den læser data, som brugeren giver (såsom et pas eller en forsikring) og gemmer disse oplysninger i hukommelsen (f.eks. som et billede ). I dag skal du lave din egen scanner! Den vil selvfølgelig ikke kunne håndtere papirdokumenter, men tekst vil ikke være noget problem for den :) Lad os gå!
Javas Scanner-klasse
Først og fremmest skal vi stifte bekendtskab med java.util.Scanner -klassen. Dens funktionalitet er meget enkel. Som en rigtig scanner læser den data fra en kilde, som du angiver. For eksempel en streng, en fil, konsollen. Dernæst genkender den informationen og behandler den korrekt. Her er det enkleste eksempel:
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
"How charged with punishments the scroll,\n" +
"I am the master of my fate,\n" +
"I am the captain of my soul");
String s = scanner.nextLine();
System.out.println(s);
}
}
Vi har oprettet et scannerobjekt og specificeret dets datakilde (en tekststreng). NextLine () -metoden får adgang til datakilden (vores tekst med et kvad), finder den næste ulæste linje (som er den første linje i dette tilfælde) og returnerer den. Så viser vi det på konsollen: Konsoludgang:
It matters not how strait the gate,
Vi kan bruge metoden nextLine() flere gange og vise hele digtuddraget:
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
"How charged with punishments the scroll,\n" +
"I am the master of my fate,\n" +
"I am the captain of my soul");
String s = scanner.nextLine();
System.out.println(s);
s = scanner.nextLine();
System.out.println(s);
s = scanner.nextLine();
System.out.println(s);
s = scanner.nextLine();
System.out.println(s);
}
}
Hver gang tager vores scanner et skridt frem og læser den næste linje. Programmets output vises:
It matters not how strait the gate,
How charged with punishments the scroll,
I am the master of my fate,
I am the captain of my soul
Som vi allerede har sagt, behøver scannerens datakilde ikke at være en streng. Det kan for eksempel være konsollen. Nogle spændende nyheder til dig: tidligere viste vi bare data der, men nu læser vi data fra tastaturet! Lad os se, hvad Scanner- klassen ellers gør:
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a number:");
int number = sc.nextInt();
System.out.println("Thanks! You entered the number " + number);
}
}
NextInt () -metoden læser og returnerer det indtastede tal. I vores program bruger vi det til at tildele en værdi til variabelnummeret . Det er allerede mere som en rigtig scanner! Programmet beder brugeren om at indtaste et hvilket som helst tal. Når brugeren har gjort dette, takker programmet brugeren, viser resultatet og afslutter. Men vi har stadig et alvorligt problem. Brugeren kan lave en fejl og indtaste noget forkert. Her er et eksempel, hvor vores nuværende program holder op med at virke:
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a number:");
int number = sc.nextInt();
System.out.println("Thanks! You entered the number " + number);
}
}
Lad os prøve at indtaste strengen "CodeGym" i stedet for et tal: Konsoloutput:
Enter a number:
CodeGym
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Main.main(Main.java:10) Process finished with exit code 1
Åh åh. Vi er i store problemer -_- For at undgå sådanne situationer er vi nødt til at finde på en måde at verificere de data, som brugeren har indtastet. Hvis brugeren f.eks. indtaster andet end et tal, vil det være godt at vise en advarsel om, at de indtastede oplysninger ikke er et tal. Og hvis oplysningerne er i orden, så kunne vi bekræfte. Men dette ville kræve, at vi "se ind i fremtiden" for at se, hvad der kommer i vores strøm. Kan scanneren gøre dette? Og hvor! Og den har en række metoder til at gøre dette: hasNextInt() — Denne metode kontrollerer, om den næste del af inputdata er et tal (returnerer sandt eller falsk, alt efter hvad der er relevant). hasNextLine() — Denne metode kontrollerer, om den næste del af input er en streng. hasNextByte() ,hasNextShort() , hasNextLong() , hasNextFloat() , hasNextDouble() — Alle disse metoder udfører lignende kontroller for de resterende datatyper. Lad os prøve at ændre vores nummerlæsningsprogram:
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a number:");
if (sc.hasNextInt()) {
int number = sc.nextInt();
System.out.println("Thanks! You entered the number " + number);
} else {
System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
}
}
}
Nu tjekker vores program, om det næste indtastede tegn er et tal. Og det viser kun bekræftelse, hvis det er det. Hvis input ikke består kontrollen, noterer programmet sig og beder brugeren om at prøve igen. Som udgangspunkt kan du kommunikere med Scanner- objektet og på forhånd finde ud af, hvilken datatype der venter dig. Et nummer, en streng eller noget andet? Et nummer? Og hvilken slags? An int , short , long ?" Denne fleksibilitet giver dig mulighed for at bygge programlogik, der afhænger af brugerens adfærd. Vi bør notere os en anden vigtig metode: useDelimiter() . Du sender en streng til denne metode. Strengen indeholder tegn, du vil bruge som skilletegn eller skilletegn. Antag for eksempel, at vi pludselig blev interesseret i japansk poesi og besluttede at bruge vores scanner til at læse noget haiku skrevet af den store digter Matsuo Bashō. Selvom tre forskellige vers videregives til os som én akavet streng, kan vi nemt splitte dem og gengive dem smukt:
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner("On a withered branch'" +
"A crow has alighted.'" +
"Nightfall in autumn." +
"''***''" +
"Such a moon above,'" +
"Like a tree cut at the root:'" +
"he fresh cut is white." +
"''***''" +
"How the river floods!'" +
"A heron wanders on short legs,'" +
"Knee-deep in the water.");
scan.useDelimiter("'");
while (scan.hasNext()) {
System.out.println(scan.next());
}
scan.close();
}
}
Vi bruger "\ n /*/*/*" (nyt linjetegn og tre stjerner) som vores skilletegn. Som et resultat har vi smukke konsoludgange, ligesom i bøger:
On a withered branch
A crow has alighted.
Nightfall in autumn.
***
Such a moon above,
Like a tree cut at the root:
The fresh cut is white.
***
How the river floods!
A heron wanders on short legs,
Knee-deep in the water.
Dette eksempel har endnu en metode, som vi absolut skal påpege: close() . Som ethvert objekt, der arbejder med I/O-streams, skal scanneren lukkes, når den er færdig, så den holder op med at forbruge computerens ressourcer. Glem aldrig close() -metoden!
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a number:");
int number = sc.nextInt();
System.out.println("Thanks! You entered the number " + number);
sc.close(); // Now we've done everything right!
}
}
Det er det! Som du kan se, for hvor nyttig den er, er Scanner- klassen ret nem at bruge! :) For at styrke det, du har lært, foreslår vi, at du ser en videolektion fra vores Java-kursus
Mere læsning: |
---|
GO TO FULL VERSION