Page 1 of 1
Sun Java Compiler Bug ?
Posted: Mon Oct 23, 2006 3:13 pm
by Zifnab
Code: Select all
class serialtest {
public static void main(String args[]) {
if (true)
String str;
}
}
Έφτιαξα αυτό που φαίνεται σωστό αλλά μου βγάζει:
Code: Select all
C:\OPA\2nd semister\Papaioannou\bug report\serialtest.java:4: not a statement
String str;
^
C:\OPA\2nd semister\Papaioannou\bug report\serialtest.java:4: ';' expected
String str;
^
2 errors
Process completed.
Αν όμως κάνω compile το παρακάτω όλα ΟΚ !
Code: Select all
class serialtest {
public static void main(String args[]) {
if (true) {
String str;
}
}
}
To πρόβλημα εντοπίζεται εδώ:
if (true)
{
String str;
}Αν αφαιρέσω τα άγκυστρα πάπαλα ο compiler
Πρόκειται για bug?
Posted: Mon Oct 23, 2006 4:14 pm
by Einherjar
Δε καταλαβαίνω το πρόβλημά σου, τι αντικαθιστάς δηλαδή με τι και παίζει.
Θα σου πρότεινα πάνως να χρησιμοποιείς τον τελεστή
instanceof σε καταστάσεις όπως αυτή
Posted: Mon Oct 23, 2006 4:34 pm
by Zifnab
Το obj instanceof classname, θα μου επιστρέψει true ακόμα και αν το obj δεν είναι τύπου classname αλλά κάποιου απογόνου της classname. Ενώ το getClass() μου επιστρέφει ένα αντικείμενο τύπου Class που είναι πραγματικού τύπου. Δεν είναι εκεί το πρόβλημα...
Έκανα edit το παραπάνω post για να φανεί καλύτερα η διαφορά

Posted: Mon Oct 23, 2006 7:33 pm
by Babedacus
Αυτό μου το είχε κάνει κι εμένα σε κάποια εργασία,μόνο που ήταν 2 for και μια if χωρίς καθόλου άγκιστρα.Όταν έβαλα τα άγκιστρα δούλεψε.Μήπως ο JCreator επιβάλλει τα code conventions της Sun;

Θα συμφωνήσω πως δεν έχει να κάνει με την getClass(),πάντως.
Posted: Mon Oct 23, 2006 8:28 pm
by Zifnab
Babedacus++
Περιόρισα και άλλο το πιθανό bug. Ισχύει για οποιοδήποτε είδος αντικειμένου
και για τα primitive types int,short,...,float,double, κτλ
Δείτε πάνω πάνω τον κώδικα....

Posted: Mon Oct 23, 2006 8:34 pm
by Einherjar
Λογικά, μετά από ένα if περιμένει ένα statement. Αυτό που κάνεις εσύ χωρίς τις αγγύλες είναι declaration ενώ με τις αγγύλες γίνεται statement.
Δεν είμαι απόλυτα σίγουρος για την ορθότητα του πράγματος, αλλά μου φαίνεται λογικό.
Posted: Mon Oct 23, 2006 8:51 pm
by Zifnab
Thanks Einherjar!
Αν ισχύει αυτό τότε οι καθηγητές πρέπει να αλλάξουν τον τρόπο που διδάσκουν την if, δηλαδή τον γνωστό: αν έχουμε μία εντολή παραλείπονται οι αγκύλες ενώ αν έχουμε πολλές βάζουμε αγκύλες...

Posted: Mon Oct 23, 2006 9:33 pm
by tsilochr
χα, αν παίξεις με τις λέξεις τότε μια χαρά τα λένε οι καθηγητές διότι εσύ δεν βάζεις εντολή αλλά κάνεις δήλωση και αρχικοποιήση μεταβλητής ταυτόχρονα
Posted: Tue Oct 24, 2006 3:05 am
by Zifnab
tsilochr wrote:εσύ δεν βάζεις εντολή αλλά κάνεις δήλωση και αρχικοποιήση μεταβλητής ταυτόχρονα
Μόνο δήλωση έκανα...
Zifnab wrote:Code: Select all
class serialtest {
public static void main(String args[]) {
if (true)
String str;
}
}
Α και παρεπιπτόντως το String str; το ονομάζουν declaration
statement μέσα στα βιβλία...
Posted: Tue Oct 24, 2006 2:54 pm
by adam98
Στην minijava αυτό είναι λάθος πάντως για πολλούς λόγους.Αν έχεις πάρει το μάθημα και έχεις κάνει το σχετικό project θα καταλάβεις γιατί λέω αυτό το κακόγουστο αστείο!

Posted: Tue Oct 24, 2006 3:09 pm
by PaP
Zifnab wrote:Thanks Einherjar!
Αν ισχύει αυτό τότε οι καθηγητές πρέπει να αλλάξουν τον τρόπο που διδάσκουν την if, δηλαδή τον γνωστό: αν έχουμε μία εντολή παραλείπονται οι αγκύλες ενώ αν έχουμε πολλές βάζουμε αγκύλες...

Ασε τι λένε οι καθηγητές... καλό είναι να βάζουμε πάντα αγκύλες για code readability
Posted: Tue Oct 24, 2006 4:58 pm
by HdkiLLeR
Zifnab wrote:tsilochr wrote:εσύ δεν βάζεις εντολή αλλά κάνεις δήλωση και αρχικοποιήση μεταβλητής ταυτόχρονα
Μόνο δήλωση έκανα...
Zifnab wrote:Code: Select all
class serialtest {
public static void main(String args[]) {
if (true)
String str;
}
}
Α και παρεπιπτόντως το String str; το ονομάζουν declaration
statement μέσα στα βιβλία...
Δεν κάνεις κάτι λάθος στην λογική σου. Το String str; είναι
declaration statement και πολύ σωστά έχεις ένα μόνο statement και μπορείς να βγάλεις τις αγγύλες. Επειδή αυτό είναι λάθος όμως λογικά εάν συμβεί, δηλαδή σε ένα block statement να έχεις μόνο ένα declaration, γιατί δηλώνεις κάτι που δεν θα χρησιμοποιηθεί ποτέ (θα έχει scope μόνο μέσα στο if το οποίο δεν έχει body και συνεπώς είναι μια δήλωση άκυρη) το συντακτικό της Java δεν σου επιτρέπει δηλώσεις ανούσιες με αυτόν τον τρόπο.