Avatar billede boomshanka Nybegynder
03. oktober 2004 - 19:11 Der 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:

E:\Programmer\Java\soap-2_3_1\lib\soap.jar;E:\Programmer\Java\javamail-1.3.2ea\mail.jar;E:\Programmer\Java\jaf-1.0.2\activation.jar;E:\Programmer\Java\soap-2_3_1;E:\Programmer\Java\xerces-1_4_4\xerces.jar;E:\Programmer\Java\bin

Kan det være årsagen eller er det noget helt andet?
Avatar billede mikkelbm Nybegynder
03. oktober 2004 - 19:47 #1
Først lige et banalt spørgsmål - du er sikker på, at filerne ligger i samme mappe?

Dernæst skal der - hvis der er parametre med i superklassens contructor - være et kald dertil i subklassens contructor!
...
super (name);
...


En anden ting:

Dit eksempel er ikke særligt sigende - forstået på den måde, at du har Child til at arve fra Mother - hvad er fællesnævneren for de to klasser?

Bedre (efter min mening):

Superklasse : FamilyMember

Subklasser : Child & Mother
Avatar billede boomshanka Nybegynder
03. oktober 2004 - 20:21 #2
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;
    }
   
    private String name;
}

...og den tilhørende subklasse:

public class Child extends FamilyMember {
   
    public Child(String name) {
        super(name);
    }
   
}

Men...jeg får stadig samme fejl :-(
Avatar billede boomshanka Nybegynder
03. oktober 2004 - 20:22 #3
og ja filerne ligger samme sted :-)
Avatar billede arne_v Ekspert
03. oktober 2004 - 20:23 #4
Bruger du package ?
Avatar billede boomshanka Nybegynder
03. oktober 2004 - 20:25 #5
Ja, jeg har installeret JavaMail Package
Avatar billede hacked Nybegynder
03. oktober 2004 - 20:26 #6
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.
Avatar billede mikkelbm Nybegynder
03. oktober 2004 - 20:27 #7
Det virker nu fint ved mig!

Er du helt sikker på, at class filerne bliver compilet til samme package?

Hvis du, som Arne påpeger, bruger packages, skal du huske at importerer de rigtige mapper.
Avatar billede arne_v Ekspert
03. oktober 2004 - 20:28 #8
Jeg mener - ligger dine klasser i en package ?
Avatar billede boomshanka Nybegynder
03. oktober 2004 - 20:35 #9
okay nu er jeg med. Nej jeg bruger ikke packages i det her eksempel (jeg har blot installeret JavaMail Packages og ændret CLASSPATH som ovenfor).
Avatar billede arne_v Ekspert
03. oktober 2004 - 20:53 #10
Prøv lige og put directory med dine klasser i classpath også (evt. bare put
. i classpath).
Avatar billede boomshanka Nybegynder
03. oktober 2004 - 21:03 #11
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?
Avatar billede arne_v Ekspert
03. oktober 2004 - 21:06 #12
Der er sommetider noget med det.

Jeg tror at ofte er . i CLASSPATH og muligvis bruger javac CLASSPATH=. hvis
CLASSPATH variablen ikke er sat.

Jeg har aldrig undersøgt det nærmere. Men der er andre end dig som har haft
problemer med det.
Avatar billede arne_v Ekspert
03. oktober 2004 - 21:08 #13
Iøvrigt fraråder jeg normalt altid at putte noget som helst i CLASSPATH.

Hvis man bruger eksplicit:

javac -classpath ... *.java
java -classpath ... Program

så har man meget bedre styr over hvad man bruger til hvad.
Avatar billede boomshanka Nybegynder
03. oktober 2004 - 21:26 #14
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
Avatar billede arne_v Ekspert
03. oktober 2004 - 21:37 #15
ok
Avatar billede boomshanka Nybegynder
03. oktober 2004 - 21:40 #16
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".
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester