03. oktober 2004 - 19:11Der er
15 kommentarer og 1 løsning
Fejl "Cannot resolve symbol" peger på superklassens navn
Det burde være ligetil, og chancen for at jeg har overset et eller andet helt banalt er også stor. Men jeg kan som sagt ikke se fejlen i nedenstående subklasse:
public class Child extends Mother { public Child(String name) { this.name = name; }
private String name; }
...som arver fra følgende superklasse:
public class Mother { public Mother(String name) { this.name = "Josephine Doe"; }
private String getName() { return name; }
private String name; }
Som navnene antyder har jeg måtte koge det ned til det mest banale for at kunne se fejlen, men det er ikke lykkedes. Superklassen kompiler uden problemer, men jeg får som sagt følgende fejl når jeg kompiler subklassen "Child":
Child.java:1: cannot resolve symbol symbol : class Mother location: class Child public class Child extends Mother { ^ 1 error
Det eneste jeg kunne forestille mig var årsagen er, at jeg for nylig har installeret JavaBeans Activation Framework 1.0.2, JavaMail Package og Xerces XML Parser 1.4.4. Min CLASSPATH ser derfor således ud:
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Okay, nu har jeg ændret lidt i navnene. Navnene Mother og Child var også bare brugt som et hurtigt eksempel og det gik vist lidt udover sammenhængen :-) Nu ser superklassen således ud:
public class FamilyMember {
public FamilyMember(String memberName) { name = memberName; } private String getName() { return name; }
Efter som at mikkelbm nok har fat i selve svaret på dit problem vil jeg ikke komme med et svar men blot en lille remark. 1. Dine instansvariabler skal altid stå først. Global java-programmerpolicy. public class Mother { private String name; <- rigtigt (instansvariabel)
public Mother(String name) { this.name = "Josephine Doe"; }
private String getName() { return name; }
private String name; <- forkert }
2. Der er ingen grund til at instansere variablen navn 2 gange. Følg mikkelbm's forslag og lad din childklasse kalde FamilyMember (super). Meningen med nedarvning (det som du er igang med at programmere) er at de ting som er fælles for klasserne der arver skal op og ligge i superklassen altså fællesnævneren. Derved undgår du gentagelser af koden der skal bruges flere steder.
Det var pokkers - nu virker det efter jeg tilføjede mit directory til CLASSPATH
Men hvordan kan det være? Jeg bruger UltraEdit hvor jeg har sat mit working directory til "%p" i indstillingerne for compile. Jeg har tidligere aldrig behøvet at tilføje min working folder til min CLASSPATH?
Det lyder logisk. Det er måske muligt at bruge -classpath i UltraEdit så man er fri for at kompile udenfor programmet. Men tak (igen) for det fyldige svar - til alle involverede. Det er altid fedt at kunne komme ind på Eksperten og få svar på ens spørgsmål!
Hvis du smider et svar, så får du dine point arne_v
og til dem som nu ville have interesse i en løsning til UltraEdit:
1. Vælg Advanced->Tool Configuration... 2. Kopier følgende tekst ind i Command Line feltet (erstat drev og sti til bin directory med egne værdier): C:\Java\bin\javac -classpath %p %p%n%e 3. Angiv %p som working directory 4. Eventuelt kan man markere "Save all files first", "Output to list box" og "Capture Output".
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.