BETA

Μαθαίνοντας την Java-Εισαγωγή δεδομένων μέσω κλάσης Scanner [μάθημα 11]

Εικόνα Michail

Συνεχίζουμε τα μαθήματα εκμάθησης της Java, έχοντας ήδη κάνει το πρώτο εισαγωγικό μάθημα και έχοντας δει,πως μπορουμε να εγκαταστήσουμε το NetBeans, προκειμένου να δημιουργήσουμε τις εφαρμογές μας και στη συνεχεια δημιουργώντας την πρωτη μας εφαρμογή.
Έχοντας δει κιόλας, σχετικά με τα LANGUAGE FUNDAMENTALS και στη συνέχεια, Ονομασία Μεταβλητών, και τα INTEGER TYPES, καθώς και τα Floating Point Types, μα και καθορισμό των Boolean και Char Data types, καθώς και για τα Arrays, συνεχίζουμε με το 11ο μάθημα της σειράς.
[box color=blue]Σε αυτή την φάση για τα εκπαιδευτικά μαθήματα χρησιμοποιούμε το λειτουργικό σύστημα Windows, μα οι διαφορές είναι ελάχιστες, ως μηδαμινές και στα υπόλοιπα λειτουργικά[/box]
Υπάρχουν δύο κλασικοί τρόποι εισαγωγής δεδομένων (input) σε ένα πρόγραμμα Java: είτε με την χρήση εντολών από το command prompt, είτε με την ευκολία που προσφέρει το γραφικό περιβάλλον της Java με την βοήθεια των βιβλιοθηκών AWT και Swing. Στο σημερινό μάθημα θα ασχοληθούμε με την ανάλυση της κλάσης Scanner η οποία χρησιμοποιείται για την εισαγωγή δεδομένων από το command prompt.

Πριν ξεκινήσουμε, θα ήθελα να αναφέρω το γεγονός ότι θα αναφέρουμε συχνά τις λέξεις κλάση, αντικείμενο και μέθοδος.
Δεν θα πρέπει να ασχοληθείτε βαθύτερα με αυτές τις έννοιες ούτε να σας ανησυχήσουν σε αυτή την χρονική στιγμή.
Αργότερα, θα έχουμε την ευκαιρία να ασχοληθούμε με τις κλάσεις και τον αντικειμενοστραφή προγραμματισμό με περισσότερες λεπτομέρειες.
Για τώρα απλά κρατάμε τον μηχανισμό λειτουργίας τους για να γνωρίζουμε πως μπορούμε να τα χρησιμοποιήσουμε σωστά.

Στηριζόμενοι όπως πάντα στο επίσημο documentation της Java, μια Scanner κλάση χρησιμοποιείται για να διαβάσει όλα τα είδη των primitive types (που ήδη έχουμε περιγράψει σε προηγούμενα μαθήματα) και Strings σαν αποδεκτές τιμές για την εισαγωγή πληροφοριών από τον χρήστη.
Ο τρόπος με τον οποίο έχουμε την δυνατότητα να διαβάσουμε και να αναγνωρίσουμε το input είναι εύκολος αρκεί να γνωρίζουμε την σωστή λειτουργία και απαιτήσεις της Scanner κλάσης.
Στην πιο κάτω εικόνα έχετε την ευκαιρία να δείτε την επίσημη περιγραφή της κλάσης από το site της Oracle:

Για να αποκτήσουμε λοιπόν την δυνατότητα να διαβάζουμε input από τον χρήστη, πρέπει σαν πρώτο βήμα να δημιουργήσουμε ένα αντικείμενο από την κλάση Scanner του οποίου οι ιδιότητες θα μας βοηθήσουν να διαβαστούν σωστά τα εισαγόμενα δεδομένα. Όπως ανάφερα στην αρχή του μαθήματος, μην πανικοβληθείτε στο άκουσμα των νέων αυτών όρων, γιατί απλά ακόμα δεν έχει έρθει η ώρα να συζητήσουμε εκτενέστερα για αυτά.
Για να δημιουργήσουμε ένα αντικείμενο από την κλάση Scanner:

  • Δημιουργούμε ένα αντικείμενο (new Scanner)
  • Ορίζουμε την μεταβλητή η οποία θα αναφέρεται στο αντικείμενο (Scanner sc) και θα έχει αποκτήσει σαν δυνατότητες μια λίστα από μεθόδους.
  • Ορίζουμε ποιο ακριβώς θα είναι το είδος εισαγωγής δεδομένων (command prompt ή αρχείο) Scanner sc = new Scanner (System.in);

Η μεταβλητή sc που αναφέρεται στο δημιουργημένο αντικείμενο, εξ ορισμού έχει κληρονομήσει έναν σεβαστό αριθμό μεθόδων από τις οποίες επιλέγουμε για να διαβάσουμε σωστά το είδος του input.
Σαν τελικό βήμα, αφού διαβάσουμε τα στοιχεία από τον χρήστη αναθέτουμε την τιμή ή τιμές σε μια καινούργια τελική (ή τελικές) μεταβλητή (ή μεταβλητές) για να μπορέσουμε διαχειριστούμε τα δεδομένα κατά την διάρκεια εκτέλεσης του προγράμματος.
Η πιο κάτω εικόνα περιγράφει τις γραμμές κώδικα που μας επιτρέπουν να διαβάσουμε ένα ακέραιο αριθμό από την κονσόλα και προέρχεται από το site της Oracle:

Ξέρω ότι έχετε απορία για εκείνο το System.in το οποίο υπάρχει σαν παράμετρος μέσα στον Constructor του Scanner (δηλαδή στον μηχανισμό δημιουργίας αντικειμένων της κλάσης Scanner).
Πριν απαντήσω σε αυτή την ερώτηση, ας εξηγήσουμε πρώτα μια άλλη κατάσταση που την έχετε δει αρκετές φορές στα απλά προγράμματά σας – System.out.println.
Η γνωστή αυτή εντολή χρησιμοποιείται για την εμφάνιση του αποτελέσματος από το πρόγραμμα μας στο παράθυρο του console.
Πιο συγκεκριμένα το αντικείμενο System.out καλεί την μέθοδο println για να αποκτήσει το δικαίωμα να αποδώσει το αποτέλεσμα της πράξης που ζητάμε σωστά στην οθόνη.
Ακριβώς με τον ίδιο τρόπο λειτουργεί και το System.in.
Το συγκεκριμένο είναι ένα αντικείμενο το οποίο οι ιδιότητες του είναι μια σειρά από μέθοδοι οι οποίες μας βοηθάνε να διαβάζουμε σωστά το input από τον χρήστη. Η πρώτη εικόνα παρουσιάζει μόνο ένα δείγμα από τον πραγματικό αριθμό μεθόδων που είναι διαθέσιμοι, ενώ στην δεύτερη μπορείτε να δείτε από που προήλθε η μέθοδο nextInt( ) την οποία χρησιμοποιήσαμε πιο πάνω:

Άρα με την ίδια λογική εάν θέλαμε να ζητήσουμε κάποιο όνομα αντί για αριθμό σαν είδος εισαγωγής δεδομένου (π.χ. String) τότε θα χρησιμοποιούσαμε την μέθοδο nextLine( ) όπως δείχνει και ο πιο κάτω κώδικας.

System.out.print(“Please insert the name of the product you want to purchase”);

Scanner in = new Scanner(System.in);

String name = in.nextLine( );

Ένα Java πρόγραμμα, εξ ορισμού, δεν έχει όλες τις κλάσεις φορτωμένες εξ αρχής.
Για να πραγματοποιηθεί μια τέτοια πράξη, είναι αναγκαίο ο προγραμματιστής να τις ορίσει στην αρχή του προγράμματος (μετά από την εντολή package και πριν την αρχή της κλάσης μας).
Αυτό εύκολα μπορούμε να το πράξουμε προσθέτοντας την γραμμή import java.util.* πριν τον ορισμό της κλάσης.

Από την εντολή καταλαβαίνουμε ότι υπάρχει ένα πακέτο με το όνομα java.util στο οποίο βρίσκεται η κλάση Scanner και θα πρέπει να την εισάγουμε στον πρόγραμμα μας για να μπορέσουμε να αξιοποιήσουμε τις δυνατότητές της.

Ας κάνουμε μερικές παρατηρήσεις ακόμα για τον κώδικα που μόλις παρουσιάσαμε.

Scanner in = new Scanner(System.in);

 System.out.print(“What is the name of your favorites team? “);

String team = in.nextLine( );

Όπως ήδη έχουμε αναφέρει, η διαδικασία διαβάσματος των δεδομένων που θα εισάγει ο χρήστης περιλαμβάνει δύο βήματα.

Στο πρώτο βήμα δημιουργούμε μια μεταβλητή in η οποία αναφέρεται στο αντικείμενο της κλάσης Scanner που δημιουργήσαμε με την εντολή new Scanner(System.in).
Αφού ενημερώσουμε τον χρήστη για την πληροφορία που επιθυμούμε να εισάγει, χρησιμοποιούμε την μέθοδο nextLine( ) για να διαβάσουμε String input.
Η μέθοδος nextLine( ) είναι χρήσιμη όσο αφορά το διάβασμα χαρακτήρων αγνοώντας whitespace (δεν υπολογίζει εάν ο χρήστης πατήσει το spacebar πριν ή μετά την εισαγωγή της τιμής String).
Τέλος στο δεύτερο βήμα, αναθέτουμε την String τιμή που διαβάσαμε σε μια μεταβλητή με το όνομα team.

Lines 15 – 16: Εδώ παρατηρούμε ότι χρησιμοποιείται το ίδιο αντικείμενο για να διαβάσουμε για δεύτερη φορά την εισαγωγή δεδομένων από τον χρήστη.
Γίνεται χρήση μιας άλλης μεθόδου nextInt() που έχει σαν ιδιότητά της να αναγνωρίζει χαρακτήρες σαν ακέραιους αριθμούς και να μπορεί να τους αναθέτει σε μια μεταβλητή που στο πρόγραμμα μας είναι η int.
Από την στιγμή που το αντικείμενο έχει σαν γενικότερο σκοπό απλά να διαβάζει το input από τον χρήστη και να το αναθέτει σε μια μεταβλητή για περαιτέρω χρήση, τότε μπορεί να χρησιμοποιηθεί πολλαπλές φορές αφού δεν είναι ανάγκη να “θυμάται” τις προηγούμενες τιμές που διάβασε.
Μπορείτε πολύ εύκολα να δείτε όλες τις διαθέσιμες μεθόδους στο Netbeans καθώς τυπώνεται την τελεία που ακολουθεί μετά από το αντικείμενο:

H Scanner κλάση μπορεί να χρησιμοποιηθεί και για να διαβάσει input από ένα text αρχείο όπως σας δείχνει το πιο κάτω παράδειγμα. Χρησιμοποιούμε λοιπόν ένα text αρχείο με το όνομα myNumbers και αποθηκευμένο μόνο έναν αριθμό.
Το Scanner αντικείμενο που θα δημιουργηθεί δεν έχει σαν input το System.in αντικείμενο αλλά το new File και μάλιστα με συγκεκριμένο path για την εύρεση του αρχείου.
Τέλος, στο συγκεκριμένο παράδειγμα, επιτρέπουμε το long data type να είναι το είδος του data που περιμένουμε σαν είδος εισαγωγής αριθμού. Το παράδειγμα προέρχεται από το documentation της Java.

Υπάρχουν μερικές άγνωστες εντολές κώδικα στο πρόγραμμα μας οι οποίες δεν θα πρέπει να σας απασχολήσουν για τώρα. Ενημερωτικά όμως ας δώσουμε μια γρήγορη εξήγηση λέγοντας ότι κάθε φορά που προσπαθούμε να αποκτήσουμε πρόσβαση σε κάποιο αρχείο του σκληρού δίσκου με την εφαρμογή μας, η java προσπαθεί να προστατέψει το πρόγραμμα από το να διακοπεί με λάθος σε περίπτωση που δεν είναι δυνατή η εύρεση του αρχείου το οποίο ψάχνουμε.
Κατά συνέπεια, ορίζεται μια FileNotFoundException για να γίνει σωστή και επίσημη προγραμματιστικά η διαχείριση του λάθους σε περίπτωση που συμβεί. Αυτό το exception όπως ονομάζεται υποστηρίζεται και από τα ακόλουθα πακέτα που με την εντολή import ενημερώνουμε το πρόγραμμα μας για την ύπαρξη τους και την υποστήριξή τους.
Αυτή η θεωρία με τις λίγες γνώσεις που έχουμε έως αυτό το σημείο είναι αρκετή για την συνέχεια του μαθήματος μας.

Εάν υπήρχαν περισσότερες από μια τιμές που έπρεπε να διαβάσουμε στην ίδια σειρά δεδομένων τότε θα έπρεπε να ορίσουμε έναν delimiter ο οποίος αγνοεί εκτός από το κενό (whitespace) και συγκεκριμένες λέξεις, φράσεις ή σύμβολα.
Ο ορισμός ενός τέτοιου είδους delimiter απαιτεί από τον χρήστη να ορίσει το απαραίτητο String το οποίο θα αγνοηθεί κατά την διάρκεια διαβάσματος του input.
Ο ορισμός του delimiter δίνεται στο site της Oracle.

Σήμερα αναλύσαμε το τρόπο εισαγωγής δεδομένων σε ένα πρόγραμμα Java χρησιμοποιώντας την κλάση Scanner από το command prompt.
Στο επόμενo μάθημα θα συνεχίσουμε με την εισαγωγή δεδομένων χρησιμοποιώντας παραθυρικό περιβάλλον.

Μιχάλης Κασάπογλου(http://kassapoglou.com)

  • Σχόλια

0 Comments:

Scroll to Top