Hello world java

10 risposte [Ultimo contenuto]
Ritratto di paco_deb
paco_deb
(Geek)
Offline
Geek
Iscritto: 25/10/2007
Messaggi: 152

Ciao, vorrei imparare java....ma ho già qualke probl con hello world

<br />1 public class Hello{<br />2 <br />3     public static void main(String args[]){<br />4         System.out.println(&quot;Ciao Mondo&quot;);<br />5     }<br />6 }<br />

compilo con javac Hello.java

e cerco di eseguire con java Hello ma ecco cosa ottengo:
<br />Exception in thread &quot;main&quot; java.lang.ClassFormatError: Hello (unrecognized class file version)<br />   at java.lang.VMClassLoader.defineClass(libgcj.so.81)<br />   at java.lang.ClassLoader.defineClass(libgcj.so.81)<br />   at java.security.SecureClassLoader.defineClass(libgcj.so.81)<br />   at java.net.URLClassLoader.findClass(libgcj.so.81)<br />   at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.81)<br />   at java.lang.ClassLoader.loadClass(libgcj.so.81)<br />   at java.lang.ClassLoader.loadClass(libgcj.so.81)<br />   at gnu.java.lang.MainThread.run(libgcj.so.81)<br /><br />

Qual'è il problema?

Ritratto di paco_deb
paco_deb
(Geek)
Offline
Geek
Iscritto: 25/10/2007
Messaggi: 152

OK, risolto! era un conflitto tra gcj e jdk

ho risolto con
apt-get remove --purge gcj-4.1-base gcj-4.2-base

Ciao

Ritratto di sava_v
sava_v
(Junior)
Offline
Junior
Iscritto: 02/11/2014
Messaggi: 40

Salve. Continuo qua perche ho lo stesso problema e non riesco a risolvere come ha fatto paco_deb.

Ho scaricato i pacchetti:
apt-get install openjdk-7-jdk openjdk-7-jre

Scrivo il piccolo file col nome Hello.java:

class Hello
{
	public static void main ( String[] args )
	{
		System.out.println("Hello World!");
	}
}

Compilo con javac Hello.java
Vedo il file Hello.class però quando do dal terminale
java Hello
mi esce l'errore:
sava@debian:~/Java/Source$ java Hello 
Exception in thread "main" java.lang.UnsupportedClassVersionError: Hello : Unsupported major.minor version 51.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:643)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
	at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
Could not find the main class: Hello. Program will exit.

Per favore qualche sugerimento. Ho trovato nella rette varie discussioni simile ma nessuna mi aiuta.

Ritratto di mcortese
mcortese
(Moderatore)
Offline
Moderatore
Iscritto: 27/02/2009
Messaggi: 2918

Non è che c'è una variabile d'ambiente (CLASSPATH) che dice dove andare a cercare le classi, e questa non include la directory corrente? Se è così, si può risolvere facilmente:

CLASSPATH=".:$CLASSPATH"

Ritratto di sava_v
sava_v
(Junior)
Offline
Junior
Iscritto: 02/11/2014
Messaggi: 40

Ciao mcortese.
Ho controlato la variabile con

sava@debian:~$ echo $CLASSPATH

e mi da una linea vuota. Immagino che la var non è impostata.

Grazie

Ritratto di sava_v
sava_v
(Junior)
Offline
Junior
Iscritto: 02/11/2014
Messaggi: 40

Ho impostato la CLASSPATH come mi sugerisci e non cambia. Da errore.

Ritratto di badroot
badroot
(Guru)
Offline
Guru
Iscritto: 22/08/2008
Messaggi: 2075

Ciao,
prova a postare l'esito dei seguenti comandi :

javac -version
java -version

perchè sembra che ci sia una differenza tra la versione java del compilatore e quella della runtime.
Prova anche a controllare con questo comando se hai più di un'opzione per gestire le applicazioni java :

sudo update-alternatives --config java

Ritratto di sava_v
sava_v
(Junior)
Offline
Junior
Iscritto: 02/11/2014
Messaggi: 40

Ciao badroot.

Vero c'è versione 6 ed anche 7.

root@debian:~# update-alternatives --config java
Sono disponibili 2 scelte per l'alternativa java (che fornisce /usr/bin/java).
 
  Selezione    Percorso                                        Priorità  Stato
------------------------------------------------------------
* 0            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      modalità automatica
  1            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      modalità manuale
  2            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1051      modalità manuale
 
Premere Invio per mantenere il valore predefinito[*] o digitare il numero della selezione:

Non capisco l'ultima riga - "digitare il numero della selezione". Digitando tra 0, 1, 2 seleziono quale sarà usato? Quale devo scegliere?

Poi questa CLASSPATH? Come faccio a renderla permanente. Ieri era uguale a nulla. L'ho impostata con CLASSPATH=".:$CLASSPATH". Oggi la controlo con echo $CLASSPATH e di nuovo da una riga vuota sotto.

Grazie

Ritratto di sava_v
sava_v
(Junior)
Offline
Junior
Iscritto: 02/11/2014
Messaggi: 40

Non ho postato le versioni.

root@debian:~# java -version
java version "1.6.0_33"
OpenJDK Runtime Environment (IcedTea6 1.13.5) (6b33-1.13.5-2~deb7u1)
OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)
root@debian:~# javac -version
javac 1.7.0_65

Ritratto di badroot
badroot
(Guru)
Offline
Guru
Iscritto: 22/08/2008
Messaggi: 2075

Ciao,
allora il problema dovrebbe essere proprio la discordanza tra compilatore e runtime, soprattutto poichè il compilatore 1.7 credo che marchi il codice generato con la sua versione di bytecode che non è riconosciuta dalla runtime 1.6.
Risulterebbe quidni che tu abbia installato sia la versione 1.6 che la 1.7, c'è un motivo particolare ?
Io ti consiglio di rimuovere la 1.6, solo perchè è la più vecchia, e a questo punto dovresti avere in output la versione uguale sia per la runtime che per il compilatore.
Per quanto riguarda la variabile CLASSPATH puoi impostarla in .bashrc nella tua home directory perchè venga valorizzata ad ogni di un terminale.

Ritratto di sava_v
sava_v
(Junior)
Offline
Junior
Iscritto: 02/11/2014
Messaggi: 40

Ho risolto dando il commando sugerito da te sopra

root@debian:~# update-alternatives --config java
Sono disponibili 2 scelte per l'alternativa java (che fornisce /usr/bin/java).
 
  Selezione    Percorso                                        Priorità  Stato
------------------------------------------------------------
  0            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      modalità automatica
  1            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      modalità manuale
* 2            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1051      modalità manuale
 
Premere Invio per mantenere il valore predefinito[*] o digitare il numero della selezione:

Il programma dopo il commando di sopra non ti rida il prompt ma aspetta che premi ENTER per lasciare l'asterisco dove è o premere uno tra 1, 2 o 3 per cambiare quali dei 3 programmi sarà attivo.

Il pacchetto openjdk-6-jdk non sono riuscito ad eliminare. Farò altri tentativi piu tardi.

Grazie infinite mcortese e badroot.