Sun Java Compiler Bug ?

Συζητήσεις για θέματα που σχετίζονται με software.
Post Reply
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Sun Java Compiler Bug ?

Post by Zifnab » Mon Oct 23, 2006 3:13 pm

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 το παρακάτω όλα ΟΚ ! :shock:

Code: Select all

class serialtest {
	public static void main(String args[]) {	
		if (true) 	{
			String str;
                }
	}
}

To πρόβλημα εντοπίζεται εδώ:
if (true) {
String str;
}Αν αφαιρέσω τα άγκυστρα πάπαλα ο compiler :-p


Πρόκειται για bug?
Last edited by Zifnab on Mon Oct 23, 2006 8:27 pm, edited 4 times in total.
User avatar
Einherjar
Venus Project Founder
Venus Project Founder
Posts: 3751
Joined: Tue Jan 27, 2004 4:42 pm
Academic status: Alumnus/a
Gender:
Location: Washington DC, USA
Contact:

Post by Einherjar » Mon Oct 23, 2006 4:14 pm

Δε καταλαβαίνω το πρόβλημά σου, τι αντικαθιστάς δηλαδή με τι και παίζει.
Θα σου πρότεινα πάνως να χρησιμοποιείς τον τελεστή instanceof σε καταστάσεις όπως αυτή

Code: Select all

(obj.getClass() == String.class) 
[Better to understand a little than to misunderstand a lot]
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Mon Oct 23, 2006 4:34 pm

Το obj instanceof classname, θα μου επιστρέψει true ακόμα και αν το obj δεν είναι τύπου classname αλλά κάποιου απογόνου της classname. Ενώ το getClass() μου επιστρέφει ένα αντικείμενο τύπου Class που είναι πραγματικού τύπου. Δεν είναι εκεί το πρόβλημα...

Έκανα edit το παραπάνω post για να φανεί καλύτερα η διαφορά ;)
Babedacus
Kilobyte level
Kilobyte level
Posts: 299
Joined: Mon Nov 21, 2005 1:05 pm

Post by Babedacus » Mon Oct 23, 2006 7:33 pm

Αυτό μου το είχε κάνει κι εμένα σε κάποια εργασία,μόνο που ήταν 2 for και μια if χωρίς καθόλου άγκιστρα.Όταν έβαλα τα άγκιστρα δούλεψε.Μήπως ο JCreator επιβάλλει τα code conventions της Sun; :-p Θα συμφωνήσω πως δεν έχει να κάνει με την getClass(),πάντως.
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Mon Oct 23, 2006 8:28 pm

Babedacus++

Περιόρισα και άλλο το πιθανό bug. Ισχύει για οποιοδήποτε είδος αντικειμένου
και για τα primitive types int,short,...,float,double, κτλ
Δείτε πάνω πάνω τον κώδικα.... ;)
User avatar
Einherjar
Venus Project Founder
Venus Project Founder
Posts: 3751
Joined: Tue Jan 27, 2004 4:42 pm
Academic status: Alumnus/a
Gender:
Location: Washington DC, USA
Contact:

Post by Einherjar » Mon Oct 23, 2006 8:34 pm

Λογικά, μετά από ένα if περιμένει ένα statement. Αυτό που κάνεις εσύ χωρίς τις αγγύλες είναι declaration ενώ με τις αγγύλες γίνεται statement.
Δεν είμαι απόλυτα σίγουρος για την ορθότητα του πράγματος, αλλά μου φαίνεται λογικό.
[Better to understand a little than to misunderstand a lot]
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Mon Oct 23, 2006 8:51 pm

Thanks Einherjar!
Αν ισχύει αυτό τότε οι καθηγητές πρέπει να αλλάξουν τον τρόπο που διδάσκουν την if, δηλαδή τον γνωστό: αν έχουμε μία εντολή παραλείπονται οι αγκύλες ενώ αν έχουμε πολλές βάζουμε αγκύλες... :-p
User avatar
tsilochr
Wow! Terabyte level
Wow! Terabyte level
Posts: 3246
Joined: Tue Mar 16, 2004 2:47 pm
Academic status: PhD
Gender:
Location: mm.aueb.gr
Contact:

Post by tsilochr » Mon Oct 23, 2006 9:33 pm

χα, αν παίξεις με τις λέξεις τότε μια χαρά τα λένε οι καθηγητές διότι εσύ δεν βάζεις εντολή αλλά κάνεις δήλωση και αρχικοποιήση μεταβλητής ταυτόχρονα
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Tue Oct 24, 2006 3:05 am

tsilochr wrote:εσύ δεν βάζεις εντολή αλλά κάνεις δήλωση και αρχικοποιήση μεταβλητής ταυτόχρονα
Μόνο δήλωση έκανα... :!:

Zifnab wrote:

Code: Select all

class serialtest {
   public static void main(String args[]) {   
      if (true)    
         String str;
   }
}
Α και παρεπιπτόντως το String str; το ονομάζουν declaration statement μέσα στα βιβλία...
User avatar
adam98
Gbyte level
Gbyte level
Posts: 1078
Joined: Tue May 02, 2006 2:58 pm

Post by adam98 » Tue Oct 24, 2006 2:54 pm

Στην minijava αυτό είναι λάθος πάντως για πολλούς λόγους.Αν έχεις πάρει το μάθημα και έχεις κάνει το σχετικό project θα καταλάβεις γιατί λέω αυτό το κακόγουστο αστείο! :lol:
H δύναμη της εξαπάτησης και της καταστροφής μπορεί να γοητεύσει μόνο μέτριους και αδύναμους
Τhe lessons we learn from pain are the ones that make us the strongest
User avatar
PaP
Venus Project Founder
Venus Project Founder
Posts: 1077
Joined: Wed Apr 21, 2004 12:06 am
Academic status: Alumnus/a
Location: San Francisco
Contact:

Post by PaP » Tue Oct 24, 2006 3:09 pm

Zifnab wrote:Thanks Einherjar!
Αν ισχύει αυτό τότε οι καθηγητές πρέπει να αλλάξουν τον τρόπο που διδάσκουν την if, δηλαδή τον γνωστό: αν έχουμε μία εντολή παραλείπονται οι αγκύλες ενώ αν έχουμε πολλές βάζουμε αγκύλες... :-p
Ασε τι λένε οι καθηγητές... καλό είναι να βάζουμε πάντα αγκύλες για code readability
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Tue Oct 24, 2006 4:58 pm

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 δεν σου επιτρέπει δηλώσεις ανούσιες με αυτόν τον τρόπο.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
Post Reply

Return to “Software”