|
[ ZakMMM @ 31.07.2006. 12:34 ] @
| Imam vrlo glup,iritirajuci pocetnicki problem koji ne mogu da resim.
Koristim JEdit za ucenje jave i uglavnom sve je funkcionisalo dobro dok nisam poceo da eksperimentisem sa paketima.
Konkretno:
-Imam dva foldera a1 i a2 na c:\
-U folderu a1 se nalazi public klasa A
-U folderu a2 se nalazi public klasa B koja je zapravo podklasa klase A
Obe klase se lepo kompajliraju, ali kada izvrsim klasu B prijavljuje mi gresku:
"could not find the main class. program will exit"
Iz ciste radoznalosti sam probao da izvrsim klasu A i isti slucaj je i sa njom.(Obe klase imaju main() metod);
Singl klase koje snimim na C:\ u sa java ekstenzijom kompajliraju se i izvrsavaju bez problema.
Pokusao sam da napravim i jedan JAR folder pod imenom paketi na c:\paketi.jar i u njega da ubacim ova dva paketa. U polju za classpath podesim c:\paketi.jar ali dobijam iste simptome sve lepo iskompajlira ali kada trebam da izvrsim neku klasu opet mi prijavljuje
"could not find the main class. program will exit".
Molim vas ako neko moze da mi pokaze kako da resim ovaj problem!! |
[ djalfirevic @ 31.07.2006. 13:46 ] @
Imas jednu javnu klasu A, i jednu klasu koja nasledjuje nju, recimo B...
Kakva je svrha ako te dve klase ti razdvojis u dva paketa???
One idu zajedno u jedan paket.
To moze, ali onda moras da uvezes onaj paket u kome se nalazi klasa A.
[ ZakMMM @ 01.08.2006. 01:04 ] @
Kao sto rekoh , trenutno ucim javu, tako da nema neke velike svrhe u tome sto radim.
Klase sam podelio u dva paketa sa razlogom da ispitam ponasanje kompajlera i vidljivost clanova klase(polja i metoda) u odnosu na razlicite modifikatore pristupa, sto ce reci default i protected.
Znam da njihovu definiciju mogu naci u skoro svakom tutorijalu o javi ali jednostavno sam zeleo sam malo da eksperimentisem i da razjasnim sve nejasnoce.
Ali me je u tome sprecio gore pomenuti problem.(a kako ne znam o cemu se radi, ono me kopka i kopka i kopka i ako ga skoro ne resim, ne znam sta ce mi se desiti - ali ovo ne sluti na dobro:-{)
Inace, parent klasu sam uvezao i kompajler ne prijavljije nikakvu gresku, ali je problem kada hocu da ih izvrsim.
Izgleda da nesto ne razumem u vezi konfigurisanja JVM-a, ali ne znam sta.
Tako da jos jednom molim, ako neko ume da mi pomogne da to i ucini.
[ bgd2500 @ 01.08.2006. 09:30 ] @
Klasa mora da ima main metod da bi bila izvrsna.
Daj primer da ne nabadamo.
Code:
public static void main (String[] args) {
...
}
[ hyle @ 01.08.2006. 10:27 ] @
Idi na root c: diska i pokreni program sa:
Code: java a1.A
ili sa
Code: java a2.B
Moraš navesti i paket u kome ti se nalazi glavna klasa.
[ ZakMMM @ 01.08.2006. 11:18 ] @
Ljudi hvala vam na pokusaju da mi pomognete, ali izgleda da sam pronasao uzrok problema, ali u isto vreme su mi se pojavile i nove nejasnoce.
Evo primera mojih klasa:
-Klasa A nalazi se u folderu c:\a1
Code:
package a1 ;
public class A {
public int javnoPolje;
public static void main(String[] args) {
}
public String maliMetod() {
return "a a a a a a a a ";
}
}
-Klasa B nalazi se u folderu c:\a2
Code:
package a2;
import a1.*;
public class B extends A {
public static void main(String[] args) {
B x = new B();
x.mojMaliMetod();
}
public void mojMaliMetod() {
System.out.println("B kaze, " + this.maliMetod() + " " + javnoPolje);
System.out.println("B kaze, " + maliMetod());
A z = new A();
System.out.println("A kaze, " + z.maliMetod() + " " + z.javnoPolje);
}
public String maliMetod() {
return " b b b b b b b ";
}
}
Problem sam prevazisao na sledeci nacin:
Code:
C:\>javac a2\*.java
C:\>javac a1\*.java
C:\>java a2.B
B kaze, b b b b b b b 0
B kaze, b b b b b b b
A kaze, a a a a a a a a 0
Ali kada uradim ovako javlja mi se greska:
Code:
C:\>javac a2\*.java
C:\>javac a1\*.java
C:\>cd a2
C:\a2>java B
Exception in thread "main" java.lang.NoClassDefFoundError: B (wrong name: a2/B)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
A posto koristim NetRexxJe, JEdit plugin za kompajliranje i pokretanje klasa, koji za pokretanje klasa koristi naredbu javaw, na ekranu mi se pojavljuje sledece upozorenje
Isto upozorenje mi se javlja kada i ja u cmd-u upotrebim komandu:
Code:
C:\a2>javaw B.
E sada, za JEdit je ocigledno da moram pronaci pravi nacin da upotrebim odgovarajuce argumente prilikom kompajliranja i pokretanja, ali ono sto ne razumem je sta to JVM izgubi kada udjem u paket a2 i odatle direktnom komandom
C:\a2>java B
pokusam da pokrenem klasu B.
Zapravo u cemu je sustina, koju informaciju JVM poseduje ako pokretanje vrsim iz korenog direktorijuma(C:\>java a2.B) a istu izgubi ako udjem u folder a2( C:\a2>) ??????????
P.S.
Za nekog koga privuce ova tema evo i ukratkog objasnjenja javaw.exe programa:
The javaw.exe command is identical to java.exe, except that with javaw.exe there is no associated console window. This implies you can't get it to display the version with -version since there is no console to display it on. Use javaw.exe when you don't want a command prompt window to appear. The javaw.exe launcher will, however, display a dialog box with error information if a launch fails for some reason.
[Ovu poruku je menjao ZakMMM dana 01.08.2006. u 12:29 GMT+1]
[Ovu poruku je menjao ZakMMM dana 02.08.2006. u 10:06 GMT+1]
[ djalfirevic @ 02.08.2006. 08:56 ] @
Zbunices i nas koji vec neko vreme programiramo u Javi.... 8-)
Hmmm...
Sledeci put kada budes postovao svoj kod, molim te koristi Code:
tagove posto je daleko preglednije...
Kopirao sam tvoj program kod sebe i pokusao da ga izvrsim i javlja tu gresku koju i tebi javlja...
Problem sam resio na sledeci nacin...
Meni se paketi nalaze u sledecem direktorijumu: D:\Programiranje\Java\EliteSecurity\
Tu se nalaze direktorijumi ("paketi") a1 i a2...
Sve sto moras da uradis jeste da u CLASSPATH i u Path navedes putanju do paketa a1:
.;..;D:\Programiranje\Java\EliteSecurity\;
Nakon toga mi je program radio bez greske.
[ hyle @ 02.08.2006. 10:38 ] @
Citat: ZakMMM:
...ono sto ne razumem je sta to JVM izgubi kada udjem u paket a2 i odatle direktnom komandom
C:\a2>java B
pokusam da pokrenem klasu B.
Zapravo u cemu je sustina, koju informaciju JVM poseduje ako pokretanje vrsim iz korenog direktorijuma(C:\>java a2.B) a istu izgubi ako udjem u folder a2( C:\a2>) ??????????
Nije dovoljno da navedeš samo naziv klase, obavezno je navođenje i paketa u kome se ta klasa nalazi kako bi Java mogla da je pronađe. Ako imaš neki veliki projekat lako može da se desi da postoji više klasa koje imaju isto ime, samo se nalaze u različitim paketima, tako da Java ne može da zna na koju klasu misliš ako ne navedeš paket.
Na početku svake klase navodiš kome paketu pripada. U tvom slučaju naveo si da se klasa B nalazi u paketu a2 i tako kompajlirao.
Java gleda classpath i traži klase u svakom od direktorijuma koji su navedeni u classpath-u. Ako si u classpath-u naveo direktorijum "c:\klase" onda će Java uzeti u obzir sve klase i pakete koji se nalaze u tom direktorijumu. Da bi Java pronašla klasu B, ona se mora nalaziti na lokaciji "c:\klase\a2"
Da si kojim slučajem u classpath stavio "c:\klase\a2" umesto "c:\klase" onda bi Java pronašla klasu B ali bi ti prijavila grešku "(wrong name: a2/B)" zato što je prilikom kompajliranja navedeno da se klasa B nalazi u paketu a2, a Java je pronašla tu klasu u default paketu (bez paketa). Java je očekivala da se klasa B nalazi na lokaciji "c:\klase\a2\a2" zbog toga što je lokacija "c:\klase\a2" navedena kao početna i potraga za paketima počinje od te lokacije.
Kod tebe nastaju problemi iz sledećeg razloga. U okviru classpath-a si naveo direktorijum "."
Tačka označava trenutni direktorijum i to znači da Java treba da traži klase u onom direktorijumu odakle si je pozvao. Ako ti je pokrenut command prompt i nalaziš se na "c:\" onda će prilikom pokretanja Java tražiti sve pakete na lokaciji "c:\". Ako se nalaziš na lokaciji "c:\a2" i pokrećeš Javu onda će ona tražiti sve pakete koji se nalaze na toj lokaciji. Znači uvek se direktorijum u kome se nalaziš uzima kao polazni za traženje klasa i paketa. U trenutku kada odeš u direktorijum "c:\a2" i pozoveš "java B" dolazi do problema zbog toga što u klasi B piše da se nalazi u paketu a2, a Java je pronašla u default paketu.
Ne znam da li sam uspeo da ti objasnim, stvar je prosta ali je meni teško da je sročim u par redova.
Nadam se da sam bio od pomoći, pozdrav!
[ ZakMMM @ 02.08.2006. 10:47 ] @
Djuro, hvala ti na odgovoru, ali da li bi mogao na konkretnom primeru da mi pokazes kako da uradim sledece:
"...u CLASSPATH i u Path navedes putanju do paketa a1..."
da li si mislio da upotrebim argument -classpath npr:
Code: java -classpath .;..;D:\Programiranje\Java\EliteSecurity\; B
ili nesto drugo
P.S
Hvala na sugestiji za tagove, zaista izgleda bolje
[ ZakMMM @ 02.08.2006. 10:54 ] @
Hyle, ovo je bio jedan zaista iscrpan odgovor, veliko hvala.
[ djalfirevic @ 02.08.2006. 11:10 ] @
Citat: ZakMMM: Djuro, hvala ti na odgovoru, ali da li bi mogao na konkretnom primeru da mi pokazes kako da uradim sledece:
"...u CLASSPATH i u Path navedes putanju do paketa a1..."
da li si mislio da upotrebim argument -classpath npr:
Code: java -classpath .;..;D:\Programiranje\Java\EliteSecurity\; B
ili nesto drugo
P.S
Hvala na sugestiji za tagove, zaista izgleda bolje
Ako koristis Windows 2000, kliknes desni klik na My Computer, pa Properties, pa kartica Advanced, pa Environment Variables.
Zatim u prozoru System Variables, odes na Path i dodas putanju gde ti se nalaze paketi. Naravno putanju dodajes na kraj, nemoj da obrises ono sto vec postoji tamo. I takodje to isto uradis i u CLASSPATH-u. Naravno, njega si vec kreirao, jer si u njega smestio jre/lib/ext i JAVA_HOME/jdk/bin/ putanje.
Nadam se da sam ti pomogao.
[ ZakMMM @ 02.08.2006. 23:48 ] @
Djuro i Perice, veliko vam hvala, ovoga puta obojica ste bili "divni" (naravno da prepoznajete citat iz "Mi nismo andjeli", i verujem da se Djuri smucilo to da slusa, ali sta da radim kad je to jednostavno jace od mene, a i Djuro sta da radis kada te je zapalo to "prokletstvo" - mada, cuti dobro je, moglo i nesto gore, obzirom da svako ima neko u zivotu).
Zaista bili ste mi od velike pomoci. Obzirom da se spremam za SCJP, mislim da je najbolje da sve "decje boginje" na vreme istrebim, ovoga puta sam uspeo zahvaljujuci vama.
Za u buduce nadam se da mogu jos racunati na vas i ovaj forum.(Barem dok ne stanem na solidne noge sa znanjem, a kasnije cu i ja (poput vas - mojih heroja 8-),pomagati jadnim i izgubljenim dusama JAVA-sveta, kao sto sam i sàm danas).
Thanks!!!
[ djalfirevic @ 10.08.2006. 17:02 ] @
Citat: ZakMMM: Djuro i Perice, veliko vam hvala, ovoga puta obojica ste bili "divni" (naravno da prepoznajete citat iz "Mi nismo andjeli", i verujem da se Djuri smucilo to da slusa, ali sta da radim kad je to jednostavno jace od mene, a i Djuro sta da radis kada te je zapalo to "prokletstvo" - mada, cuti dobro je, moglo i nesto gore, obzirom da svako ima neko u zivotu).
Zaista bili ste mi od velike pomoci. Obzirom da se spremam za SCJP, mislim da je najbolje da sve "decje boginje" na vreme istrebim, ovoga puta sam uspeo zahvaljujuci vama.
Za u buduce nadam se da mogu jos racunati na vas i ovaj forum.(Barem dok ne stanem na solidne noge sa znanjem, a kasnije cu i ja (poput vas - mojih heroja 8-),pomagati jadnim i izgubljenim dusama JAVA-sveta, kao sto sam i sàm danas).
Thanks!!!
8-). Uvek mozes racunati na mene, a naravno i na "elitnu bezbednost"...
Pozz
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|