Sadako Δημοσ. 10 Ιανουαρίου 2007 Δημοσ. 10 Ιανουαρίου 2007 Το concept είναι σχετικά απλό. Έχουμε δημιουργήσει μέσω sql μια database για ταινίες, και τώρα θέλουμε ένα πρόγραμμα σε java για να χειριζόμαστε αυτή την database, να προσθέτουμε/αφαιρούμε ταινίες, search κτλ μέσω εξωτερικού αρχείου txt.. Ως ένα βαθμό έχω καταλάβει τη λογική, και άρχισα να το κάνω. Το να ανοίγω εξωτερικό αρχείο που περιέχει εντολές, να διαβάζει κάθε γραμμή και να ερμηνεύει τις εντολές ξέρω πως να το κάνω, ήταν μέρος μιας άλλης εργασίας java που είχα. Οπότε πάω να ανοίξω connection με την database, να δημιουργήσω statements κλπ κλπ. Μάλιστα βάζοντας όλο τον κώδικα μέσα στη main, το κατάφερα. Στα specs όμως λέει, ότι θέλει ξεχωριστή μέθοδο για να ανοίγει connections και διαφορετική για να κλείνει. Όταν όμως πήγα να μεταφέρω την διαδικασία σε μια ξεχωριστή μέθοδο, παίρνω compile errors. Συγκεκριμένα, με τον παρακάτω κώδικα, μου λέει ότι missing return statement (!!!), ενώ φαίνεται πεντακάθαρα ότι την έχω πριν την catch. Μπορεί να καταλάβει κανείς τι κάνω λάθος?? ΥΓ. Η λογική μου είναι να επιστρέψει η μέθοδος το Connection object, έτσι ώστε να δημιουργήσω μετά το statement object k.o.k.. > // method for opening database connection static Connection openConnection() { try { String database_address = "********"; String user_name = "********"; String password = "**********"; Connection conn; conn = DriverManager.getConnection(database_address, user_name, password); return conn; } catch (SQLException e) { System.out.println("catch errors"); } } EDIT: Να προσθέσω ότι προσπάθησα να μεταφέρω τη return statement (σε κόντρα βέβαια με τη λογική μου) σε άλλο σημείο του κώδικα, είτε έξω απο την try, είτε μετά την catch, αλλά (όπως περίμενα σε αυτή την περίπτωση), οδηγήθηκα σε (πιο λογικά) compile errors.
Cue Δημοσ. 10 Ιανουαρίου 2007 Δημοσ. 10 Ιανουαρίου 2007 Το "missing return statement" στο βγάζει γιατί η μέθοδος έχει παραπάνω από 1 σημείο όπου μπορεί να κάνει return! Αν π.χ. συμβεί το SQLException και γίνει catch, τότε η εκτέλεση του προγράμματος συνεχίζεται. Βάλε άλλο ένα return statement στο τέλος της μεθόδου.
Sadako Δημοσ. 10 Ιανουαρίου 2007 Μέλος Δημοσ. 10 Ιανουαρίου 2007 Χμμ.. Λογικό αυτό που λές, το δοκίμασα (και μέσα στην catch, και μετά την catch πριν το τέλος της μεθόδου και μαζί στις 2 περιπτώσεις μέσα στην απελπιδία μου). Όμως, μου πετάει πάλι compile error: cannot find symbol variable conn
ni_kuho Δημοσ. 10 Ιανουαρίου 2007 Δημοσ. 10 Ιανουαρίου 2007 Αυτό στο πετάει μάλλον γιατί η catch δε βλέπει τη μεταβλητή conn. Πρόχειρη λύση, αλλά για δοκίμασε αυτό, μάλλον δουλεύει (δεν το δοκίμασα): static Connection openConnection() { Connection conn; try { String database_address = "********"; String user_name = "********"; String password = "**********"; conn = DriverManager.getConnection(database_address, user_name, password); } catch (SQLException e) { System.out.println("catch errors"); conn=null; } return conn; }
Sadako Δημοσ. 10 Ιανουαρίου 2007 Μέλος Δημοσ. 10 Ιανουαρίου 2007 Πρόχειρη ή όχι δεν ξέρω, αλλά επειδή έλεγε ότι cannot find symbol, την όρισα πάλι μέσα στην catch (αν και μέσα στη γραμμικότητα του κώδικα επειδή η "επικίνδυνη γραμμή" [conn = DriverManager.getConnection(database_address, user_name, password); ] βρίσκεται ΜΕΤΑ τη declaration της conn μια γραμμή πιο πάνω σαν object της κλάσης Connection δε φαντάστηκα ότι θα είναι απαραίτητο) Οπότε έβαλα > catch (SQLException e) { System.out.println("catch errors"); Connection conn = null; return conn; } Και έκανε compile.. Δεν ξέρω μόνο πόσο χρήσιμο είναι να επιστρέφει null σε περίπτωση exception. Ή μήπως στην προκειμένη περίπτωση δεν έχει και ιδιαίτερη σημασία??
ni_kuho Δημοσ. 10 Ιανουαρίου 2007 Δημοσ. 10 Ιανουαρίου 2007 Δεν νομίζω να είναι καλή ιδέα να ορίσεις δύο φορές την conn στη μέθοδό σου.. Βασικά καλό θα ήταν να επιστρέφει null ώστε να ξέρει η μέθοδος που θα μαζέψει την τιμή επιστροφής αν κάτι πήγε στραβά ή όχι.
Sadako Δημοσ. 10 Ιανουαρίου 2007 Μέλος Δημοσ. 10 Ιανουαρίου 2007 Μα αν δεν την ορίσω πάλι μέσα στην catch δεν σταματάει να πετάει το compile error. Εξάλλου αυτό είναι και το λάθος απο ότι λέει. cannot find symbol. Δεν καταλαβαίνει τι'ναι τούτο το conn..
Sadako Δημοσ. 10 Ιανουαρίου 2007 Μέλος Δημοσ. 10 Ιανουαρίου 2007 Πάντως τώρα το δοκίμασα, και δουλεύει. Ευχαριστώ που με ξεκολλήσατε, θα επανέλθω αν χρειαστεί με άλλες απορίες πάνω στο θέμα..
Cue Δημοσ. 10 Ιανουαρίου 2007 Δημοσ. 10 Ιανουαρίου 2007 Το cannot find symbol στο βγάζει γιατί η μεταβλητή conn είναι local στο try block. Μπορείς πολύ απλά να γράψεις > return null; Γενικά βλέπω ότι σου λείπουν βασικές γνώσεις και καλό θα ήταν να διαβάσεις 5 πράγματα πριν συνεχίσεις.
Sadako Δημοσ. 10 Ιανουαρίου 2007 Μέλος Δημοσ. 10 Ιανουαρίου 2007 Βασικές γνώσεις δε θα'λεγα ότι μου λείπουν, πίστεψε με, στη σχολή μου έχω δει ΠΟΛΥ χειρότερα, και θεωρώ τον εαυτό μου σε ένα αν μη τι άλλο ικανοποιητικό επίπεδο. Απλά αν σκεφτείς ότι αρχίσαμε πριν 3 μήνες με ένα απλό Hello World πρόγραμμα σε java, και τώρα μας ζητάνε προγράμματα σε στυλ interpreter απο μια tiny programming language, σε συνδιασμό και με τα άλλα μαθήματα, είναι κάπως πολλά για να έχεις το χρόνο να ασχοληθείς και να παίξεις μαζί τους. Ειδικά αν σκεφτείς ότι δεν έχει και προαπαιτούμενες γνώσεις προγραμματισμού. Οπότε θεωρώ "φυσιολογικό" να υπάρχουν κάποια κενά και μερικά πράγματα που δεν τα έχω ξεκαθαρίσει 100% στο μυαλό μου.. Όπως και να'χει ευχαριστώ για κάθε βοήθεια, είναι καλοδεχούμενη..
Sadako Δημοσ. 12 Ιανουαρίου 2007 Μέλος Δημοσ. 12 Ιανουαρίου 2007 Απο κείνο το σημείο ξεκόλλησα, αλλά τώρα έχω κολλήσει αλλού.. Υπάρχει τρόπος να δω το size απο ένα ResultSet? Απο όσο έψαξα στο google λένε ότι δεν γίνεται απλά με κάποια μέθοδο. Δεν ξέρω, ίσως γίνεται και αλλιώς αυτό που θέλω να κάνω.. Μας ζητάει να κάνουμε μια μέθοδο που να κάνει list όλα τα στοιχεία της database (στην προκειμένη περίπτωση ταινίες). Το να τα εκτυπώσουμε όλα στην οθόνη θα ήταν το μόνο εύκολο. Αντ'αυτού όμως, μας λέει η μέθοδος να επιστρέφει ένα array απο movie objects (όπου στη movie class έχω βάλει κάποιες properties, που τις τιμές τους πρέπει να τις κάνω extract απο το ResultSet). Και αφού είναι array, δεν πρέπει να δηλώσω απο την αρχή το μέγεθος του?? (γιατί δε μας είπε να το κάνουμε με vectors που θα ήταν πιο απλά τα πράγματα??)
Γηρυόνης Δημοσ. 13 Ιανουαρίου 2007 Δημοσ. 13 Ιανουαρίου 2007 Το πιο εύκολο είναι (αν το ResultSet είναι scrollable) να κάνεις > rs.last(); int size = rs.getRow();
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.