[Java] javac kan class niet vinden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • chronozphere
  • Registratie: Juli 2006
  • Laatst online: 16-12-2020
Hi all,

Ik heb n probleempje. Ik heb twee files, testclass.java en Test2.java in dezelfde directory.

testclass.java:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class TestClass
{

    void start()
    {
        Test2 testObject = new Test2();
        testObject.doeIets();
    }

    public static void main(String[] argv)
    {
        new TestClass().start();
    }
}


Test2.java
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.io.PrintStream;

class Test2
{
    PrintStream out;

    Test2()
    {
        out = new PrintStream(System.out);
    }
    
    void doeIets()
    {
        out.printf("Hello World! \n");
    }
}


javac Test2.java in de commandline gaat prima, maar javac testclass.java geeft het volgende terug:

code:
1
2
3
4
5
6
7
8
9
10
11
testclass.java:6: cannot find symbol
symbol  : class Test2
location: class TestClass
        Test2 testObject = new Test2();
        ^
testclass.java:6: cannot find symbol
symbol  : class Test2
location: class TestClass
        Test2 testObject = new Test2();
                               ^
2 errors


wat dus betekend dat de class Test2 niet gevonden kan worden terwijl hij in dezelfde directory staat. Het is me verteld dat hij dan altijd gevonden zou moeten worden. :?

Iemand ideeen over hoe ik dit werkend kan krijgen?

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:03

Haan

dotnetter

Moet je geen 'public' voor je class zetten? Als ik me goed herinner, krijg je in Java 'package visibility' als je geen access level aangeeft, en aangezien je je classes niet in een package hebt staan, kunnen ze elkaar dus niet zien.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Asator
  • Registratie: December 2009
  • Laatst online: 12-02-2024
Waarmee heb je dit gemaakt want volgens mij moet dit gewoon zo werken. Misschien dat je de package moet aangeven bij de classes, maar als ik dit zo plak in Netbeans werkt het direct.
Haan schreef op zondag 07 maart 2010 @ 12:50:
Moet je geen 'public' voor je class zetten? Als ik me goed herinner, krijg je in Java 'package visibility' als je geen access level aangeeft, en aangezien je je classes niet in een package hebt staan, kunnen ze elkaar dus niet zien.
Public is alleen voor als je de class buiten de package wilt gebruiken, dat lijkt me hier niet het geval.
A class may be declared with the modifier public, in which case that class is visible to all classes everywhere. If a class has no modifier (the default, also known as package-private), it is visible only within its own package (packages are named groups of related classes—you will learn about them in a later lesson.)
Edit: Ik had Haan's berichtje niet goed gelezen hij zei dus ook al dat het aan die packages kan liggen.

[ Voor 5% gewijzigd door Asator op 07-03-2010 13:18 ]


Acties:
  • 0 Henk 'm!

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 07-10 19:52

BHR

Je moet aangeven waar javac Test2 kan vinden. Dit kan met behulp van de classpath parameter
code:
1
javac -classpath . testclass.java


Omdat Test2.class in dezelfde directory staat, volstaat een ".".

Als alternatief kun je ook nog
code:
1
javac *.java

doen. Dan zal javac alle .java bestanden in de huidige directory tegelijk compileren, en omdat je geen andere classes/packeges gebruikt, hoef je nu geen -classpath op te geven.

No amount of key presses will shut off the Random Bug Generator


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
De default package (als je geen package hebt opgegeven) heeft een aantal afwijkende access regels dacht ik. Voor de op: probeer het eens met
code:
1
javac -cp . <classname>


Overigens dacht ik dat sinds java 5 of 6 . altijd impliciet aan het classpath werd toegevoegd, dus dan zou het wel gek zijn.

[ Voor 26% gewijzigd door Remus op 07-03-2010 14:03 ]


Acties:
  • 0 Henk 'm!

  • chronozphere
  • Registratie: Juli 2006
  • Laatst online: 16-12-2020
Bedankt voor de reacties. :)

Ik gebruik alleen vim + javac + java in de commandline.

Het vreemde is dat dit op school wel gewoon werkte. Ze hebben me ook verteld dat classes in verschillende files in dezelfde directory, elkaar gewoon kunnen zien.

Is er misschien iets dat ik moet configureren om het wel werkend te krijgen?

@BHR, Remus: Ik ga jullie oplossingen straks proberen (zodra ik linux weer boot). :)

[ Voor 11% gewijzigd door chronozphere op 07-03-2010 14:02 ]


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
chronozphere schreef op zondag 07 maart 2010 @ 14:00:
Bedankt voor de reacties. :)

Ik gebruik alleen vim + javac + java in de commandline.

Het vreemde is dat dit op school wel gewoon werkte. Ze hebben me ook verteld dat classes in verschillende files in dezelfde directory, elkaar gewoon kunnen zien.

Is er misschien iets dat ik moet configureren om het wel werkend te krijgen?

@BHR, Remus: Ik ga jullie oplossingen straks proberen (zodra ik linux weer boot). :)
Zulke 'gekke' dingen kunnen gebeuren als er al een CLASSPATH in je environment gezet is (dit wordt over het algemeen afgeraden). In dat geval zou je in je CLASSPATH iig . moeten toevoegen.

Ik heb trouwens net even de JLS er op nageslagen en een unnamed package gedraagt zich hetzelfde als een normale named package, maar in theorie kunnen er meerdere unnamed packages bestaan.

Voor de OP: het gebruik van unnamed packages wordt overigens sterk afgeraden.

[ Voor 15% gewijzigd door Remus op 07-03-2010 14:06 ]


Acties:
  • 0 Henk 'm!

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 07-10 19:52

BHR

Ze kunnen elkaar ook "zien". Wat classpath doet is de jvm vertellen waar de code staat. Zodra javac danwel java je classes kent, kunnen jouw classes samenwerken.

No amount of key presses will shut off the Random Bug Generator


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:12

Creepy

Tactical Espionage Splatterer

En vergeet niet dat Linux hoofdlettergevoelig is qua bestandsnamen. Dus je TestClass moet in een bestand staan met de naam TestClass.java en niet testclass.java. Weet je ook 100% zeker dat je Test2 class in Test2.java staat en niet in test2.java?

[ Voor 30% gewijzigd door Creepy op 07-03-2010 14:22 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Bedankt voor deze oplossing! :)
Ik had hetzelfde probleem en heb er meer dan een uur door verloren. 8)7
BHR schreef op zondag 07 maart 2010 @ 13:59:
Je moet aangeven waar javac Test2 kan vinden. Dit kan met behulp van de classpath parameter
code:
1
javac -classpath . testclass.java


Omdat Test2.class in dezelfde directory staat, volstaat een ".".


doen. Dan zal javac alle .java bestanden in de huidige directory tegelijk compileren, en omdat je geen andere classes/packeges gebruikt, hoef je nu geen -classpath op te geven.
Pagina: 1