View Full Version : [Java/Jcreator]
islandofjava
01-09-2008, 15:44
Ciao a tutti :)
Cerco di compilare una piccola classe con Jcreator e nel general output ottengo questo errore:
--------------------Configuration: <Default>--------------------
java.lang.NoClassDefFoundError: Prova
Caused by: java.lang.ClassNotFoundException: Prova
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: Prova. Program will exit.
Exception in thread "main"
Process completed.
Come mai? :(
agente mm8
01-09-2008, 19:24
Puoi postare il codice?
Così è più facile scoprire l'errore, ok?
islandofjava
02-09-2008, 13:42
Sì :)
Allora la consegna dell'esercizio è questa:
class Prova {
public void m1() throws Exception {
int x = 5/0;
}
public void m2() {
m1();
}
public void m3() {
m2();
}
}
Modificate i metodi m2 ed m3 per far rimbalzare l’eccezione
da m2 e farla catturare a m3. Quando m3 cattura l’eccezione
deve visualizzare su standard output catturata.
Il codice modificato è il seguente:
class Prova {
public void m1() throws Exception {
int x = 5/0;
}
public void m2() throws Exception {
m1();
}
public void m3() {
try{
m2();
}catch (Exception e){
System.out.println("catturata");
}
}
banryu79
02-09-2008, 13:52
Nella classe del file .java dove hai definito il metodo public static void main(String argv[]) che al suo interno (immagino) usa Prova, hai importato Prova? [import miopackage.Prova;]
sottovento
02-09-2008, 13:59
Per curiosita': come hai fatto a compilarlo? Da linea di comando?
Se da linea di comando, quale comando hai impartito?
islandofjava
02-09-2008, 15:02
Nella classe del file .java dove hai definito il metodo public static void main(String argv[]) che al suo interno (immagino) usa Prova, hai importato Prova? [import miopackage.Prova;]
ehr no...cioè non ho ben capito cosa mi chiedi.
Io non ho importato niente perché definisco una semplice classe dove mi si chiede venga propagata l'eccezione.
Del package non c'è nessun bisogno per soddisfare la richiesta della consegna di questo esercizio (sto preparando prog1 e questo riguarda le eccezioni :D), quello che non mi è chiaro, è se la struttura è corretta.
Cioè il metodo di propagazione mi è chiaro, quello che non ho ben capito sulle eccezioni è se devo estendere, andando a recuperare librerie di Java che trattano le eccezioni, visto che qui in definitiva non ne sto creando una ex novo ed eventualmente come..
Il libro che ho io tratta due pagine ed è veramente fatto male e online non ci ho capito granché :(
Poi c'è pure questo errore di Jcreator che non capisco da dove spunti :muro:
Per curiosita': come hai fatto a compilarlo? Da linea di comando?
Se da linea di comando, quale comando hai impartito?
Sì allora, se io compilo con javac da console di comando mi da questo errore:
Prova.java:18: reached end of file while parsing
}→
^
1 error
Se compilo con JCreator mi da quell'errore in Build Output e quello là sopra in General Output.
grazie dell'aiuto :)
sottovento
02-09-2008, 15:16
Sì allora, se io compilo con javac da console di comando mi da questo errore:
Prova.java:18: reached end of file while parsing
}→
^
1 error
Se compilo con JCreator mi da quell'errore in Build Output e quello là sopra in General Output.
grazie dell'aiuto :)
Converrai che dovrebbero dare gli stessi errori, e non una lista di errori diversi!!
Il motivo e' che JCreator NON sta compilando, ma cerca di eseguire: quindi ti riporta che non trova l'applicazione. Infatti se da prompt, in una directory qualsiasi scrivi:
Java mia_applicazione_inesistente
ottieni esattamente l'errore che hai riportato. Controlla le operazioni che fai, oppure la configurazione di JCreator (non so cosa sia).
Per quanto riguarda gli errori dati da javac, quelli sono veri: hai infatti dimenticato di chiudere l'ultima parentesi graffa, ma il codice e' indentato in maniera tale che risulta difficile accorgersene....
islandofjava
02-09-2008, 15:38
Converrai che dovrebbero dare gli stessi errori, e non una lista di errori diversi!!
Il motivo e' che JCreator NON sta compilando, ma cerca di eseguire: quindi ti riporta che non trova l'applicazione. Infatti se da prompt, in una directory qualsiasi scrivi:
Java mia_applicazione_inesistente
ottieni esattamente l'errore che hai riportato. Controlla le operazioni che fai, oppure la configurazione di JCreator (non so cosa sia).
Hai ragione! :doh:
Non conoscendo il programma, pensavo che con il comando di debug/run lo compilasse anche e invece no.
Grazie :)
Facendo build ora risulta solo questo:
--------------------Configuration: <Default>--------------------
java.lang.NoSuchMethodError: main
Exception in thread "main"
Process completed.
Per quanto riguarda gli errori dati da javac, quelli sono veri: hai infatti dimenticato di chiudere l'ultima parentesi graffa, ma il codice e' indentato in maniera tale che risulta difficile accorgersene....
Sì è una schifezza, ma volevo mantenere un abbozzo del main per vedere se la versione che avevo scritto così andava bene oppure no ed eventualmente modificare appunto il main...resta infatti il dubbio se la consegna sia stata rispettata e se abbia capito la gestione delle eccezioni :help:
sottovento
02-09-2008, 15:45
Hai ragione! :doh:
Non conoscendo il programma, pensavo che con il comando di debug/run lo compilasse anche e invece no.
Grazie :)
Facendo build ora risulta solo questo:
--------------------Configuration: <Default>--------------------
java.lang.NoSuchMethodError: main
Exception in thread "main"
Process completed.
Perdonami, ma sta ancora cercando di eseguire! Stavolta trova la classe (quindi il nome della classe/directory/... e' configurato correttamente) ma non trova il main, ovviamente, perche' non l'hai scritto...
Sì è una schifezza, ma volevo mantenere un abbozzo del main per vedere se la versione che avevo scritto così andava bene oppure no ed eventualmente modificare appunto il main...resta infatti il dubbio se la consegna sia stata rispettata e se abbia capito la gestione delle eccezioni :help:
Chiaro. Per curiosita': aggiungendo la parentesi mancante, riesci a compilare (almeno a linea di comando, poi dovrai vedere ancora cosa fare col tuo ambiente)?
islandofjava
02-09-2008, 15:58
Perdonami, ma sta ancora cercando di eseguire! Stavolta trova la classe (quindi il nome della classe/directory/... e' configurato correttamente) ma non trova il main, ovviamente, perche' non l'hai scritto...
Ehr sì non trova il main perché non c'è...e non ho ben capito come scriverlo sinceramente :stordita:
Pensavo fosse sufficiente semplicemente un classico main richiamando il metodo m3...penso mi sfugga qualcosa a livello concettuale. :/
Chiaro. Per curiosita': aggiungendo la parentesi mancante, riesci a compilare (almeno a linea di comando, poi dovrai vedere ancora cosa fare col tuo ambiente)?
Sìsì.
Mi da questo in Build Output:
--------------------Configuration: <Default>--------------------
Process completed.
Quindi compilare compila, il problema è quello sopra
sottovento
02-09-2008, 16:41
Ehr sì non trova il main perché non c'è...e non ho ben capito come scriverlo sinceramente :stordita:
Pensavo fosse sufficiente semplicemente un classico main richiamando il metodo m3...penso mi sfugga qualcosa a livello concettuale. :/
Perche' non e' sufficiente?
public static void main (String[] args)
{
m3();
}
Caso mai, se c'e' un problema a livello concettuale, riguarda la eccezioni...
agente mm8
02-09-2008, 18:39
quoto
islandofjava
02-09-2008, 21:00
Perche' non e' sufficiente?
public static void main (String[] args)
{
m3();
}
No, ci avevo già provato. A meno che non sbagli la sintassi, con questa soluzione:
class Prova {
public void m1() throws Exception {
int x = 5/0;
}
public void m2() throws Exception {
m1();
}
public void m3() {
try{
m2();
}catch (Exception e){
System.out.println("catturata");
}
}
public static void main(String[] args) {
m3();
}
}
non funziona.
Al momento della compilazione, mi vengono restituiti 2 errori, uno nel General Output:
--------------------Configuration: <Default>--------------------
java.lang.NoSuchMethodError: main
Exception in thread "main"
Process completed.
e uno nel Build Output:
non-static method m3() cannot be referenced from a static context.
Che cosa sbaglio quindi?
Caso mai, se c'e' un problema a livello concettuale, riguarda la eccezioni...
Sicuramente. Ma è infatti la mia sensazione e l'ho scritto fin dall'inizio. Non riesco a capire se e quando utilizzare le librerie presenti in Java per gestire le eccezioni e quando no e anche sul come ho qualche dubbio (la propagazione l'ho capita, il throw new exception anche o almeno credo).
khelidan1980
02-09-2008, 21:43
e uno nel Build Output:
non-static method m3() cannot be referenced from a static context.
Che cosa sbaglio quindi?
Ovvio,m3 non è statico,devi creare l'oggetto e poi richiamarlo:
class Prova {
public void m1() throws Exception {
int x = 5/0;
}
public void m2() throws Exception {
m1();
}
public void m3() {
try{
m2();
}catch (Exception e){
System.out.println("catturata");
}
}
public static void main(String[] args) {
Prova obj = new Prova();
obj.m3();
}
}
islandofjava
02-09-2008, 21:53
Funziona!
Però non ho capito che cosa hai fatto scusa :(
In pratica il metodo m3 non è statico e quindi non può essere richiamato senza prima creare un oggetto di tipo Prova.
Quindi per usare un metodo non statico ( quelli scritti da te ) si deve prima creare un oggetto che contiene quel metodo e poi si può invocarlo scrivendo ( in questo caso ) obj.m3()
Oppure si può fare anche così
new Prova().m3();
Si crea un oggetto e si invoca direttamente il metodo.
Testato e funzia.
ByeBye
sottovento
03-09-2008, 06:56
non-static method m3() cannot be referenced from a static context.
Si, ogni tanto mi bevo il cervello. Colpa mia, scusa.
Grazie a khelidan1980 e Xfight per aver ovviato alle stupidate che scrive sottovento
islandofjava
03-09-2008, 14:25
Mmmm ok...
Ma sarebbe stato possibile scrivendo ad esempio un'altra classe Eccezione che la controlli e facendo sì che sia ereditata dalla Prova?
O basta scrivere un main?
In effetti la consegna non è chiarissima, perché dice di modificare solo i mtodi m2 e m3; forse è il caso che chieda al mio prof :confused:
Grazie a tutti cmq :)
khelidan1980
03-09-2008, 15:19
Si, ogni tanto mi bevo il cervello. Colpa mia, scusa.
Grazie a khelidan1980 e Xfight per aver ovviato alle stupidate che scrive sottovento
Hai voglia quante ne scrivo io...
Mmmm ok...
Ma sarebbe stato possibile scrivendo ad esempio un'altra classe Eccezione che la controlli e facendo sì che sia ereditata dalla Prova?
O basta scrivere un main?
In effetti la consegna non è chiarissima, perché dice di modificare solo i mtodi m2 e m3; forse è il caso che chieda al mio prof :confused:
Grazie a tutti cmq :)
ma la modifica fatta è solo per far funzionare il codice,al limite avresti potuto dichiarare static i metodi,se è questo che intendi,non centra con le eccezioni,per il resto la consegna mi sembra rispettata,il main lo puoi scrivere come vuoi mi pare(e non che ci siano molte alternative)
islandofjava
03-09-2008, 18:22
ma la modifica fatta è solo per far funzionare il codice,al limite avresti potuto dichiarare static i metodi,se è questo che intendi,non centra con le eccezioni,per il resto la consegna mi sembra rispettata,il main lo puoi scrivere come vuoi mi pare(e non che ci siano molte alternative)
Nono intendevo per eventualmente utilizzare il meccanismo dell'ereditarietà e le librerie Java dov'è definita anche la divisione per 0 come tipo di errore (non mi ricordo la reference ma sono sicuro ci sia).
Modificare i metodi non potevo proprio per la consegna; cioè il 2 e 3 sì ma poi l'errore si sarebbe verificato nel metodo1 che invece deve rimanere così come è scritto.
Grazie mille allora :)
P.S.: Eventualmente posso chiedervi altri chiarimenti se mi vengono dei dubbi durante altri tipi di esercizi? ^^'
khelidan1980
03-09-2008, 18:37
Nono intendevo per eventualmente utilizzare il meccanismo dell'ereditarietà e le librerie Java dov'è definita anche la divisione per 0 come tipo di errore (non mi ricordo la reference ma sono sicuro ci sia).
Modificare i metodi non potevo proprio per la consegna; cioè il 2 e 3 sì ma poi l'errore si sarebbe verificato nel metodo1 che invece deve rimanere così come è scritto.
Grazie mille allora :)
bhe si eventualmente puoi anche propagare java.lang.ArithmeticException: / by zero ma il concetto è quello!
P.S.: Eventualmente posso chiedervi altri chiarimenti se mi vengono dei dubbi durante altri tipi di esercizi? ^^'
Certo finchè non si chiedono risoluzioni di esercizi non ci sono problemi! ;)
islandofjava
05-09-2008, 10:22
bhe si eventualmente puoi anche propagare java.lang.ArithmeticException: / by zero ma il concetto è quello!
esatto sì quella è l'eccezione che non ricordavo!
Certo finchè non si chiedono risoluzioni di esercizi non ci sono problemi! ;)
Ok ^^
Allora approfitto nuovamente della vostra cortesia :D
Questa volta l'obiettivo è la ricorsione...che credo di aver capito, anche dopo aver visto il corso di Algoritmi, però formalmente non riesco a fargli fare quello che voglio io.
Consegna: Si scriva un metodo ricorsivo che
restituisce il massimo di un array di double.
Codice:
class Ricorsivo {
public static void main(String[] args) {
int a[] = {10,1,9,5,12};
int x = 0;
System.out.println(stampaMaggiore(a,x));
}
static int stampaMaggiore(int[] a, int key) {
int x = 3;
if(x < a.length-1){
key = a[x];
if(key > a[x+1]){
key = a[x];
} else {
key = a[x+1];
}
x = x+1;
}
stampaMaggiore(a,key+1);
return key;
}
}
Ho provato a fare qualche correzione ma mi da o l'errore:
--------------------Configuration: <Default>--------------------
Exception in thread "main" java.lang.StackOverflowError
at Ricorsivo.stampaMaggiore(Ricorsivo.java:21)
at Ricorsivo.stampaMaggiore(Ricorsivo.java:21)
at Ricorsivo.stampaMaggiore(Ricorsivo.java:21)
e continua per altre tot righe con il medesimo
oppure mi restituire sempre il secondo valore :eek:
Eppure il ragionamento mi sembra corretto. Cioè confronto fino a scorrere tutto l'array incrementando di volta in volta l'indice e richiamando il metodo stampaMaggiore in modo appunto che risulti ricorsivo.
Che cosa sbaglio? :/
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.