import.* statement in Java

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • zoutepopcorn
  • Registratie: September 2007
  • Laatst online: 24-05-2023
Hallo,

Eigenlijk heb ik zelf nooit echt packages van java gamaakt. Maar omdat mijn hele map vol stond met java bestanden leek me het handig om wat dingen te gaan bundelen.

Ik heb een package aangemaakt namelijk:
nl.jobo.live

In eerste instantie dacht ik in het uitvoerende java bestand gewoon de import instructie te geven:
import nl.jobo.live.*;
Zoals je ook veel gebruikt bij de standaard imports als java.io.*;

Het vreemde dat mijn import statement niet voldeed. Hij kon de import wel compileren maar als ik een bestaande klasse opvroeg als:
MijnPackage pakketje = new MijnPackage(); // dan werkte dit niet.
de compiler gaf aan: Cannot acces MijnPackage (line 5)

Na wat prutsen kwam ik erachter dat het zo wel werkte:
nl.jobo.live.MijnPackage pakketje = new nl.jobo.live.MijnPackage();

Daarna kwam ik er ook achter dat als ik de import gaf: import nl.jobo.live.MijnPackage dat de compiler nu wel MijnPackage kon vinden en ik mijn programma goed kon uitvoeren.

Weet iemand waarom de * bij mij niet werkt?

De code die ik gebruikt heb

Java:
1
2
3
4
5
6
7
import nl.jobo.live.MijnPackage;

public class Apl {
   public static void main(String[] args) {
            MijnPackage m = new MijnPackage();         
   }
} 


Java:
1
2
3
4
5
6
7
8
9
10
11
12
package nl.jobo.live;

public class MijnPackage {  
    private Live live;
    private KaartActie kaart;
    
    private int tmpHandNummer = 0;
    
    public MijnPackage() {
        live = new Live();  
    }
.....

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
De import met .* zou gewoon moeten werken. In welk package zit Apl?

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • zoutepopcorn
  • Registratie: September 2007
  • Laatst online: 24-05-2023
De Apl.java staat los, niet in een package. Die heb ik nu los in een dir.
de package staat in "/nl/jobo/live" staat in de classpath.
Dit heb ik gedaan omdat ik later ook nog andere packages samen wil brengen in Apl of in een andere classe.

Acties:
  • 0 Henk 'm!

  • bomberboy
  • Registratie: Mei 2007
  • Laatst online: 18:26

bomberboy

BOEM!

zoutepopcorn schreef op donderdag 23 april 2009 @ 20:48:
de package staat in "/nl/jobo/live" staat in de classpath.
Bedoel je nu dat je "/nl/jobo/live" aan je classpath toegevoegd hebt? Dat is immers niet de bedoeling, Je moet de root-dir waar je class files staan toevoegen aan je classpath. De JVM gaat dan zelf in de juiste subdirs naar de relevante class bestanden op zoek.

En ipv "dan werkt dit niet" geef je ook beter de exacte foutmelding mee. Dat maakt het iets eenvoudiger om een zinnig antwoorde te geven.

Werk je in een of andere IDE trouwens?

Acties:
  • 0 Henk 'm!

  • zoutepopcorn
  • Registratie: September 2007
  • Laatst online: 24-05-2023
bomberboy
1. Bedoel je nu dat je "/nl/jobo/live" aan je classpath toegevoegd hebt?
Mijn nl/jobo/live staat (zoals het hoort) in mijn classpath namelijk: "C:\!Java\classpath\"

2. En ipv "dan werkt dit niet" geef je ook beter de exacte foutmelding mee. Dat maakt het iets eenvoudiger om een zinnig antwoorde te geven.
De foutmelding stond onder // dan werkt dat dus niet
de compiler gaf aan: Cannot acces MijnPackage (line 5).
N.b.: Ik had nog niet de volledige foutmelding gezien die het dos-prompt mij gaf, die staat onder de code van Apl

Verder werk ik niet in een bepaalde omgeving. Ik compileer het met JCreator of met het Dos-prompt...

>> Wat ik wel moet opmerken is dat als ik een package heb van iemand anders lukt het wel om deze met een import xx.xx.package.*; te importeren.....

Dat zou dus betekenen dat ik een fout heb in mijn bestanden in de package.

Ik heb maar even een testpackage gemaakt, omdat het een beetje moeilijk is om alle source hier te posten:

Eerst heb ik twee bestanden aangemaakt als in de package: nl.jobo.verwerk
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package nl.jobo.verwerk;
public class DoeIets {
    public DoeIets() {
    }
    
    public void geefWeer() {
        System.out.println("geef weer");
    }
}

package nl.jobo.verwerk;
public class Verwerk {
    public Verwerk() {  
    }
    public static void main(String[] args) {
        }
    public void geefWeer() {
        System.out.println("Hij doet het");
    }
}


Deze bestanden compileeerden normaal.

Daarna heb ik de Apl.java aangemaakt (niet in een package maar gewoon los ergens in een willekeurige dir)

Java:
1
2
3
4
5
6
7
8
import nl.jobo.verwerk.*;

public class Apl {
   public static void main(String[] args) {
            DoeIets doe = new DoeIets();  
       doe.geefWeer();
   }
}


Compiler: Apl.java:6: cannot access DoeIets
bad class file: .\DoeIets.java file does not contain class DoeIets
Please remove or make sure it appears in the correct subdirectory of the classpath.
DoeIets doe = new DoeIets();
^
1 error

Blijkbaar heeft het iets te maken waar mijn DoeIets.java bestand staat...

Java:
1
2
3
4
5
6
7
8
import nl.jobo.verwerk.DoeIets;

public class Apl {
   public static void main(String[] args) {
            DoeIets doe = new DoeIets();  
       doe.geefWeer();
   }
}


Bovenstaande code compileert wel als een tierelier...

Acties:
  • 0 Henk 'm!

  • zoutepopcorn
  • Registratie: September 2007
  • Laatst online: 24-05-2023
Hallo,

Sorry voor de post, ik had eerst alleen maar de foutmelding van JCreator gelezen. Nu bleek de foutmelding van het Dos-prompt uitgebreider te zijn.

Doordat ik het bestand DoeIets.java bestand nog in de Classpath had staan wilde hij niet compileren. Toen ik dit bestand verwijderde draaide hij wel. Blijkbaar is er dus toch een verschil met
import nl.jobo.verwerk.* en nl.jobo.verwerk.DoeIets. Bij de eerste mag het bestand DoeIets.java dus niet in de classpath staan.

Bedankt in ieder geval voor het meedenken. Hij mag op slot.....

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
zoutepopcorn schreef op donderdag 23 april 2009 @ 22:27:
Hallo,

Sorry voor de post, ik had eerst alleen maar de foutmelding van JCreator gelezen. Nu bleek de foutmelding van het Dos-prompt uitgebreider te zijn.

Doordat ik het bestand DoeIets.java bestand nog in de Classpath had staan wilde hij niet compileren. Toen ik dit bestand verwijderde draaide hij wel. Blijkbaar is er dus toch een verschil met
import nl.jobo.verwerk.* en nl.jobo.verwerk.DoeIets. Bij de eerste mag het bestand DoeIets.java dus niet in de classpath staan.

Bedankt in ieder geval voor het meedenken. Hij mag op slot.....
Dat zou gewoon moeten werken en ik begrijp dan ook niet helemaal wat er misgaat.

Het kan overigens ook een oorzaak hebben in het feit dat je de default package gebruikt voor je opstartende applicatie. Dat is in principe 'deprecated' en wordt afgeraden, zet dus in ieder geval ook je applicatie zelf in een package.

Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 18-09 22:40

Nick_S

++?????++ Out of Cheese Error

Ik denk dat ik hem zie.

Je had dus in de directory classpath een bestand DoeIets.java staan met daarin een package declaratie "package nl.jobo.verwerk;"?

Dus:
/classpath
    /DoeIets.java
   /nl
      /jobo
         /verwerk
             /DoeIets.java 


Dan ziet de compiler de eerste DoeIets.java met daarin een package declaratie. Dat gaat niet werken, want dat bestand verwacht de compiler daar niet.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • zoutepopcorn
  • Registratie: September 2007
  • Laatst online: 24-05-2023
Yep, dat was m Out of Cheese error :D

Dat mag niet van de compiler..... Ik vond het namelijk wel praktisch werken. Het mocht blijkbaar wel met import jobo.verwerk.DoeIets, dan kijkt hij niet in de classpath of daar DoeIets.java staat.

Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 18-09 22:40

Nick_S

++?????++ Out of Cheese Error

Dat is ook logisch. Met de expliciete import vertel je de compiler welke versie hij moet hebben. Met de impliciete import (import *) moet de compiler zelf op zoek en dan komt hij eerst bij de huidige package (de default package) uit, waar hij wel de klasse DoeIets vind, maar welke onjuiste package informatie bevat.

Als je aan het proberen bent om Java te leren, zou ik toch eens naar een IDE als Netbeans of Eclipse kijken. Ben je echt geinteresseerd in classpath en compilers dan ben je op de goede weg. :)

[ Voor 23% gewijzigd door Nick_S op 24-04-2009 11:50 ]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • zoutepopcorn
  • Registratie: September 2007
  • Laatst online: 24-05-2023
Ok,

tnx Nick_S... Ik heb Eclipse al geprobeerd. Zal mij er toch maar eens meer in gaan verdiepen. Bedankt voor jullie tips.

Ik zal er zeker wat mee doen.
Pagina: 1