PDA

View Full Version : [JAVA]Strano errore


trignoleo
12-07-2009, 15:22
Ho un problema nell'aprire alcuni file .jar.
Dopo aver creato, da console, un file .jar mi da problemi quando vado ad aprirlo e in particolare mi esce una finestra con questo errore:
"Fatal Exception occured. Program will exit."
Questo succede solo con alcuni programmi altri invece funzionano.
Ho notato che i programmi che non funzionano hanno in comune l'implementazione dell'ActionListener e quindi la gestione degli eventi (non so se c'entra qualcosa questo):muro: :muro: :muro: :muro:

trignoleo
12-07-2009, 18:04
Come risolvo???????????:help: :help: :help: :help: :help: :help:

trignoleo
12-07-2009, 19:27
..................................

franksisca
12-07-2009, 20:43
se posti ogli 3 ore...non dai nememno il tempo.

cmq sei troppo vago.

che jar sono?
hai provato ad eseguirli da console?

trignoleo
12-07-2009, 21:20
che jar sono?
hai provato ad eseguirli da console?
sono programmi fatti con bluej.
SI.ho provato anche ad eseguirli da console con il comando:
java -jar nome_file.jar ma non funziona

malocchio
15-07-2009, 12:21
sono programmi fatti con bluej.
SI.ho provato anche ad eseguirli da console con il comando:
java -jar nome_file.jar ma non funziona

Dovresti almeno specificare per intero l'errore che ti viene restituito...

trignoleo
17-07-2009, 15:29
Dovresti almeno specificare per intero l'errore che ti viene restituito...

l'errore che esce con il comando java -jar nome_file.jar è:
Exception in thread "main" java.lang.NoSuchMethodError: main

mentre facendo il doppio click sul file jar creato (con il comando jar cmf Manifest.txt nome_file.jar *.class) esce una finestra della JVM con questo messaggio:
Fatal Exception occured. Program will exit.

PS: Uso la stessa procedura per tutti i programmi che faccio, ma come ho già detto, alcuni funzionano ed altri no.

malocchio
17-07-2009, 15:34
l'errore che esce con il comando java -jar nome_file.jar è:
Exception in thread "main" java.lang.NoSuchMethodError: main

mentre facendo il doppio click sul file jar creato (con il comando jar cmf Manifest.txt nome_file.jar *.class) esce una finestra della JVM con questo messaggio:
Fatal Exception occured. Program will exit.

PS: Uso la stessa procedura per tutti i programmi che faccio, ma come ho già detto, alcuni funzionano ed altri no.

Sembra che sia un errore nel file Manifest presente nel Jar. Dovrebbe esserci specificata chiaramente la classe main da avviare, che ovviamente deve avere il metodo main.

Se l'hai generato con BlueJ (l'ho usato l'ultima volta 2 anni fa penso, e non ci tornerò mai), prova a vedere se puoi specificare la classe main principale del progetto ;)

PGI-Bis
17-07-2009, 15:35
Controlla l'attributo Class-Path del manifesto del jar. Se apri il jar con un decompressore (winzip, 7zip o quant'altro) dentro torvi una cartella META-INF e dentro a quella cartella un file Manifest.mf. E' un file di testo semplice, lo apri e verifichi:

a. che esista un attributo Class-Path
b. che il valore dell'attributo sia il nome pienamente qualificato della classe che contiene il metodo main del programma.

trignoleo
17-07-2009, 15:47
Controlla l'attributo Class-Path del manifesto del jar. Se apri il jar con un decompressore (winzip, 7zip o quant'altro) dentro torvi una cartella META-INF e dentro a quella cartella un file Manifest.mf. E' un file di testo semplice, lo apri e verifichi:

a. che esista un attributo Class-Path
b. che il valore dell'attributo sia il nome pienamente qualificato della classe che contiene il metodo main del programma.

ecco il file Manifest.mf:
Manifest-Version: 1.0
Class-Path:
Main-Class: Film

:muro: :muro: :muro: :muro: :muro:

PGI-Bis
17-07-2009, 17:27
La classe Film si chiama effettivamente Film? (Cioè non ha un package?)
La classe Film contiene un metodo:

public static void main(String[] args) {...qualcosa...}

trignoleo
17-07-2009, 18:15
La classe Film si chiama effettivamente Film? (Cioè non ha un package?)
La classe Film contiene un metodo:

public static void main(String[] args) {...qualcosa...}

Sia la classe che il package si chiamano Film.

Si contiene il metodo main che è stato cosi' dichiarato:
public void main()throws Exception

PGI-Bis
17-07-2009, 18:22
se la classe appartiene al package film allora li suo nome - pienamente qualificato - è:

film.Film

dunque l'attributo Class-Path dovrebbe essere:

Class-Path: film.Film

Il metodo "main" per essere il main necessario all'avvio di un programma Java deve avere la firma:

public static void main(String[] args)

o l'equivalente vararg

public static void main(String...args)

La clausola di rilascio è ininfluente - può quindi rilasciare un Exception.

malocchio
17-07-2009, 18:33
Sia la classe che il package si chiamano Film.

Si contiene il metodo main che è stato cosi' dichiarato:
public void main()throws Exception
Il main DEVE essere un metodo static, vedi l'intestazione di PGI qui sotto.

se la classe appartiene al package film allora li suo nome - pienamente qualificato - è:

film.Film

dunque l'attributo Class-Path dovrebbe essere:

Class-Path: film.Film

Il metodo "main" per essere il main necessario all'avvio di un programma Java deve avere la firma:

public static void main(String[] args)

o l'equivalente vararg

public static void main(String...args)

La clausola di rilascio è ininfluente - può quindi rilasciare un Exception.

Ma se non ricordo male il classpath è un relative URL usato per indicare dove sono i package e per includere eventuali librerie in formato jar e il Main-class serve per definire la classe contenente il main, o no? Premetto che non ho mai modificato un file manifest a mano (grazie NetBeans...) :rolleyes:

http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html#Manifest%20Specification

trignoleo
17-07-2009, 18:38
il main non posso dichiararlo statico poiche' in esso sono messi la posizione e
la grandezza (il getContentPane.add(...) per capirci) dei JButton, JTextField e cavolate varie.

pulsanti e textfield ecc.. ecc.. non possono stare in un contesto statico.

PGI-Bis
17-07-2009, 18:39
Sì, pardon, Main-Class, non Class-Path. Sai com'è, ho una punta di parkinson ogni tanto...

malocchio
17-07-2009, 18:41
il main non posso dichiararlo statico poiche' in esso sono messi la posizione e
la grandezza (il getContentPane.add(...) per capirci) dei JButton, JTextField e cavolate varie.

pulsanti e textfield ecc.. ecc.. non possono stare in un contesto statico.

Allora c'è qualcosa di veramente sbagliato nel tuo concetto di main.

Che cosa fa complessivamente la tua applicazione? Ovvero di che cosa si tratta?
Apre un Frame?

PGI-Bis
17-07-2009, 18:42
il main non posso dichiararlo statico poiche' in esso sono messi la posizione e
la grandezza (il getContentPane.add(...) per capirci) dei JButton, JTextField e cavolate varie.

pulsanti e textfield ecc.. ecc.. non possono stare in un contesto statico.

Non è un'opzione :D.

Il "main" necessario all'avvio del programma deve essere esattamente quello indicato. Poi puoi benissimo dichiarare un altro metodo che faccia quello che vuoi. Nel tuo caso dirai una cosa tipo (in film.Film)

public static void main(String[] args) {
try {
Film f = new Film();
f.main();
} catch(Exception ex) {
ex.printStackTrace();
}
}

Così hai il tuo metodo di inizializzazione e hai il metodo main richiesto da java.

trignoleo
17-07-2009, 18:50
Allora c'è qualcosa di veramente sbagliato nel tuo concetto di main.

Che cosa fa complessivamente la tua applicazione? Ovvero di che cosa si tratta?
Apre un Frame?

in poche parole permette di inserire il titolo di un film in un textfield e salvarlo
in un file di testo e inoltre permette di fare una ricerca di un film sempre all'interno del file di testo (piu' che un programma è una stupidaggine).

Si apre un Frame. Ora non posso ma piu' tardi posto il codice(ho il programma su un altro pc).

Scusate per l'ignoranza e grazie per la pazienza

malocchio
17-07-2009, 18:52
Sì, pardon, Main-Class, non Class-Path. Sai com'è, ho una punta di parkinson ogni tanto...

Quindi il Class-Path può rimanere vuoto (stringa vuota)?

Allora trignoleo, se tu (come presumo) hai un interfaccia Swing, probabilmente avrai una finestra JFrame principale.

Il classico main di un'applicazione del genere è
public static void main (String[] args) {
javax.swing.SwingUtilities.EventQueue.invokeLater(new Runnable() {
public void run() {
new MyFrame();
}
});
}
Il costruttore di MyFrame crea la finestra e la popola di componenti GUI

OK, siamo in presenza di una race condition tra me e PGI, penso che dovremmo sincronizzarci (battuta triste :stordita: )

malocchio
17-07-2009, 18:56
Allora c'è qualcosa di veramente sbagliato nel tuo concetto di main.

Ah senza offesa ovviamente :), mi sono solo sorpreso che ti manca quest'informazione essenziale, anche se vedo che sei già alle interfacce grafiche ;)

trignoleo
17-07-2009, 18:59
Non è un'opzione :D.

Il "main" necessario all'avvio del programma deve essere esattamente quello indicato. Poi puoi benissimo dichiarare un altro metodo che faccia quello che vuoi. Nel tuo caso dirai una cosa tipo (in film.Film)

public static void main(String[] args) {
try {
Film f = new Film();
f.main();
} catch(Exception ex) {
ex.printStackTrace();
}
}

Così hai il tuo metodo di inizializzazione e hai il metodo main richiesto da java.

OK. Quindi devo impostare il programma in modo diverso...

E pensare che il prof non ci obbliga ha usare il main (per lui o ci sta o non ci sta è la stessa cosa).

malocchio
17-07-2009, 19:03
OK. Quindi devo impostare il programma in modo diverso...

E pensare che il prof non ci obbliga ha usare il main (per lui o ci sta o non ci sta è la stessa cosa).

I prof di informatica (ovviamente non tutti) sono dichiaratamente una causa persa in questa sezione :p

trignoleo
17-07-2009, 19:06
I prof di informatica (ovviamente non tutti) sono dichiaratamente una causa persa in questa sezione :p

Mi sa che da oggi faro' per conto mio :D :D :D

trignoleo
17-07-2009, 20:22
Il classico main di un'applicazione del genere è
public static void main (String[] args) {
javax.swing.SwingUtilities.EventQueue.invokeLater(new Runnable() {
public void run() {
new MyFrame();
}
});
}


Qual è il package della classe MyFrame??

malocchio
18-07-2009, 19:24
Qual è il package della classe MyFrame??

MyFrame è una tua classe che hai scritto, che estende javax.swing.JFrame (ma anche no) e che rappresenta la tua applicazione. Chiamarla MyApp sembra migliore. Ti consiglio di documentarti un attimo sul MVC (model-view-controller), è un ottimo inizio per scrivere bene un'applicazione desktop, IMHO