[Java] packages niet herkend

Pagina: 1
Acties:

  • Thijs!
  • Registratie: Oktober 2002
  • Laatst online: 21:43
Nav. een opdracht voor school ben ik bezig met een programmaatje.
Gegeven: een package gamebase, met een bord
Daarbij heb ik een programma Life gemaakt, met classes die gamebase uitbreiden. Dit werkt prima.
Nu lukt het echter niet om een programma te maken dat Life weer uitbreid.
Mijn directory-structuur is nu als volgt:

AdvLife
|
lifebase
|
gamebase

Een typische class uit AdvLife ziet er als volgt uit
code:
1
2
3
4
5
6
7
8
import lifebase.*;
import lifebase.gamebase.*; //voor de zekerheid, kan toch geen kwaad 
                              zolang je andere classnames gebruikt? //
public class AdvLifeClass extends LifeClass {
     AdvLifeClass (args) {
            super(args)
    }
}

Dit lijkt me vrij correct. Analoog hieraan ziet een typische class uit lifebase er als volgt uit:
code:
1
2
3
4
5
6
7
8
package lifebase;
import gamebase.*

public class LifeClass extends GameClass {
     LifeClass (args) {
           super(args)
     }
}


Een typische foutmelding die ik hierbij krijg is:

AdvLifeFrame.java:5: cannot access gamebase.GameFrame
file gamebase/GameFrame.class not found
protected AdvLifeStats stats;

Het lijkt dus dat de compiler aan alleen de package lifebase niet genoeg heeft, en gamebase niet kan vinden. Waar kan dit aan liggen?

Ik hoop dat ik duidelijk ben. Sorry voor het eventuele noob-niveau

  • Thijs!
  • Registratie: Oktober 2002
  • Laatst online: 21:43
Voor de duidelijkheid, classes in gamebase zien er als volgt uit:
code:
1
2
3
4
5
6
7
8
package gamebase;
import java.awt.*; etc..

public class GameClass [extends java-klasse] //dit afhankelijk van de klasse// {
     GameClass (args) {
           bla
     }
}

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik kan er wel antwoord op geven, maar dan moet ik even heel duidelijk weten wat je dir structuur is, waar de files in staan, en welke package declaratie ze hebben. Daar gaat het namelijk ergens fout. Dus als je dat even duidelijk wil neerzetten, dan kan ik je wel meehelpen. (In het begin zijn die packages inderdaad een beetje lastig)

[edit]
ik zie trouwens dat je geen package declaratie hebt bij advLiveClass. En verder hoef je niet overal class achter te zetten hoor :P

  • Thijs!
  • Registratie: Oktober 2002
  • Laatst online: 21:43
Dat Class was eigenlijk om aan te geven dat hier overal een andere naam kwam, als Board, View of Frame.. :-)

Ik heb dus ~/AdvLife/lifebase/gamebase

ik heb in alle Game*.java files in AdvLife/lifebase/gamebase "package gamebase;" gezet
in alle Life*.java files in AdvLife/lifebase staat/stond (afhankelijk van hoe ik aan het prutsen ben geweest) "package lifebase;" en "import gamebase.*;"
en in alle AdvLife*.java files in AdvLife staat "import lifebase.*; import lifebase.gamebase.*;"

Moet de class met daarin de main ook een package-declaratie? En is het handig om AdvLife packagedeclaratie mee te geven?

Ik hoop dat dat duidelijk is. Mocht je geen tijd hebben om het te helpen uitzoeken, dan kun je me ook een goede online uitleg wijzen. Ik zal ook proberen om asap een zipfile ergens online te zetten met daarin m'n dingetjes.

  • Thijs!
  • Registratie: Oktober 2002
  • Laatst online: 21:43
Nog een ander vraagje dat ik ook voor Life gebruik.

Ik wil graag een vector maken met daarin array's die voor elke ronde van conway's life het aantal geborenen, gestorven, en manueel toegevoegde en verwijderde cellen opslaat.
Het probleem is alleen dat ik in een Vector() alleen objecten kan opslaan. Of is het zelfs voor deze 4 waarden nodig om een nieuwe klasse aan te maken?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

ik zie al wat er misgaat bij je naamgeving. Stel dat ik de volgende structuur heb.

~/com/util/
....................Vector
....................List
~/com/
............String

Nu moet Vector in de package com.util zitten. Net zoals List en verder moet String in de package com zitten.

Je maakt dus ergens een begin, en vanaf dat punt moet de relatieve directory verwijzing overeen komen met de package naam.

  • Thijs!
  • Registratie: Oktober 2002
  • Laatst online: 21:43
Dat kan ik zo 1-2-3 niet volgen.. Je bedoelt dat gamebase en lifebase in 1 directory moeten?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Thijs! schreef op 07 November 2002 @ 22:48:
Nog een ander vraagje dat ik ook voor Life gebruik.

Ik wil graag een vector maken met daarin array's die voor elke ronde van conway's life het aantal geborenen, gestorven, en manueel toegevoegde en verwijderde cellen opslaat.
Je wilt een soort history van het spelverloop? (Gaat wel een vrij kostbarte actie worden hoor ipv copieer acties en memory).
Het probleem is alleen dat ik in een Vector() alleen objecten kan opslaan. Of is het zelfs voor deze 4 waarden nodig om een nieuwe klasse aan te maken?
Helaas wel ja. Je moet inderdaad een class aanmaken waarin je al die gegevens plaatst.

  • Thijs!
  • Registratie: Oktober 2002
  • Laatst online: 21:43
oh wacht ff,
zou ik de bestanden in gamebase de volgende declaratie moeten geven?
"package lifebase.gamebase;"?

  • Thijs!
  • Registratie: Oktober 2002
  • Laatst online: 21:43
Gaat wel een vrij kostbarte actie worden hoor ipv copieer acties en memory).
Elke ronde vergt een manuele klik op de "next" button, dus zo snel loopt m'n geheugen niet vol, dus dat zal wel goed gaan. Moet elke instantie van classes die je toevoegt aan Vector() een andere naam hebben? Of komt de naam weer beschikbaar zodra je vector.addElement() doet?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Thijs! schreef op 07 November 2002 @ 22:51:
Dat kan ik zo 1-2-3 niet volgen.. Je bedoelt dat gamebase en lifebase in 1 directory moeten?
op... ik zit op positie X van mijn schijf, daar maak ik de volgende files aan:
com/util/Vector.java
com/util/List.java
com/String.java

Hoe kom ik nu vanaf X naar Vector?
door com/util als relatieve directory te gebruiken. Daarom is de package van Vector gelijk aan com.util. Je ze dus de relatieve verwijzing van X naar jouw class om naar een package naam (dus '/' vervangen door '.')

Verwijderd

Ik snap niet dat je er zoveel problemen mee hebt, package structuur komt overeen met de directory structuur.. dus het filepath maar dan '/' = '.' Of zie ik nou iets over het hoofd? T is al laat.. ;)

  • Thijs!
  • Registratie: Oktober 2002
  • Laatst online: 21:43
Maar als ik nu in jou voorbeeld van String naar Vector wil, dan zou ik in String willen zetten "import util.*" echter herkent 'ie dan vector niet omdat deze com.util is in plaats van util, toch?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Thijs! schreef op 07 november 2002 @ 22:55:
Moet elke instantie van classes die je toevoegt aan Vector() een andere naam hebben? Of komt de naam weer beschikbaar zodra je vector.addElement() doet?
Je hoeft geen andere naam aan te maken. Je moet die vector gewoon zien als een bakje waarin je objecten kan stoppen. Hoe dat object heet is niet interessant. Tenslotte kan 1 opject in verschillende methodes verschillende namen hebben. vb.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Y{
    Y(){
       Persoon jan = new Persoon("jan",10,etcetc);
       foop(jan)
       fook(jan).
    }

   void foop(Persoon p){
       //jan heet nu p
   }
   
   void fook(Persoon k){
      //jan heet nu k
   }
}


Namen zijn leuk voor de programmeur maar de computer die is het allemaal om het even :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Verwijderd schreef op 07 november 2002 @ 23:00:
Ik snap niet dat je er zoveel problemen mee hebt, package structuur komt overeen met de directory structuur.. dus het filepath maar dan '/' = '.' Of zie ik nou iets over het hoofd? T is al laat.. ;)
hoofdletter fouten misschien? En volgens mij gaat er wel iets fout met je package naam hoor. Jij hebt een class die in de relatieve dir /lifebase/gamebase staat. En zijn package naam = gamebase. Dus er mist een stuk vooraan.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Thijs! schreef op 07 november 2002 @ 23:00:
Maar als ik nu in jou voorbeeld van String naar Vector wil, dan zou ik in String willen zetten "import util.*" echter herkent 'ie dan vector niet omdat deze com.util is in plaats van util, toch?
Je moet niet vergeten com ook mee te nemen. Je moet dus altijd vanaf dat punt X gaan werken. (dus altijd com.util en com)

  • Thijs!
  • Registratie: Oktober 2002
  • Laatst online: 21:43
naja, die statistieken doe ik een ander keer wel, maar ik zit nog flink te klooien met die packages....
Voor zover ik weet moet het nu zo:
in ~/x/y/z/iets.java zet je dan package x.y.z;
en als ik dan vanuit ~ hierbij wil, doe ik import x.y.z.*;
en als ik er vanuit ~/x bij wil, doe ik import y.x.*;

Echter, mijn programma wil vanuit ~ bij klasse in ~/x en die klasse wil weer bij ~/x/y en dat wil javac niet ofzo

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Je moet echt altijd het hele pad vanaf X opgeven :) Dat gaat er fout :)

In jouw geval, moet je dus x.y.z opgeven als import als je vanuit x iets wilt aanspreken.

  • Thijs!
  • Registratie: Oktober 2002
  • Laatst online: 21:43
Je moet niet vergeten com ook mee te nemen. Je moet dus altijd vanaf dat punt X gaan werken. (dus altijd com.util en com)
Zal dit 's proberen..
Morgen...
Ik post wel weer heo het gegaan is
Alvast bedankt!

Verwijderd

Luister naar alarmnummer.. ;) Je hebt als het goed is bij je OS een omgevingsvariable ingesteld die classpath heet, dat is dan de hoofdirectory zeg maar.. als je bij klasse A iets uit klasse B wil gebruiken kijkt hij niet naar waar A zich bevind maar kijkt hij vanaf de hoofddirectory, voorbeeld:

~/x/blaat.java
~/x/y/hoelahoep.java

als je dan bij blaat.java hoelahoep.java wil importen doe je dus:

import x.y.hoelahoep.java ..
Pagina: 1