Compiler-Fehler Klasse in einem Package wird nicht gefunden bzw. akzeptiert

HansD

Mitglied
Wir haben bisher die Lösung nicht gefunden.

Soweit ich bisher weiß, kann ich Klassen eines Package auch pauschal importieren, und ich habe es übungshalber wie folgt versucht:

Java:
import hans.daten.*;

public class Programm2
{
  public static void main(String[] args)
  {
    Eins obj1 = new Eins();
    Zwei obj2 = new Zwei();

    obj1.hallo();
    obj2.hallo();
  }
}

Die Klassen Eins und Zwei gehören zum Package "hans.daten", und beispielsweise Zwei sieht so aus:

Java:
package hans.daten;

public class Zwei
{
  public void hallo()
  {
    System.out.println("2");
  }
}

Eins auch nicht viel anders:

Java:
package hans.daten;

public class Eins
{
  private String outp;

  public void Eins()
  {
      this.outp = "In Eins";
  }

  public void hallo()
  {
    System.out.println(this.outp);
  }
}

Ich habe wie folgt kompiliert:

$ javac -d . {Eins,Zwei}java
$ javac Programm2.java

Die Verzeichnistruktur ist wie folgt:

Bash:
.
├── hans
│   └── daten
│       ├── Eins.class
│       ├── Programm.class
│       └── Zwei.class
├── Eins.java
├── Programm2.java
├── Programm.java
└── Zwei.java

Importiere ich in Programm2.java explizit wie folgt funktioniert es.
Java:
import hans.daten.Eins;
import hans.daten.Zwei;

Aber nicht, wenn ich pauschal importiere:

Java:
import hans.daten.*;

Dann geschieht Folgendes:

Bash:
-rw-rw-r-- 1 230 Mai 16 14:47 Programm2.java
hans@bodhi-desktop:~/Java/java1/06_tag$ javac Programm2.java
Programm2.java:8: error: cannot access Eins
    Eins obj1 = new Eins();
    ^
  bad source file: ./Eins.java
    file does not contain class Eins
    Please remove or make sure it appears in the correct subdirectory of the sourcepath.
1 error
hans@bodhi-desktop:~/Java/java1/06_tag$

Warum?
 

HansD

Mitglied
Die Antwort gibt Dir der Compiler:
Das habe ich selbstverständlich gelesen. Der Unterordner von "Programm2.java" aus gesehen ist "hans/daten" und genau das habe ich auch beim Import in der Datei "Programm2.java" angegeben als "import hans.daten.*". Ich sehe keinen Unterschied.

PS: Wenn diese Pfadangabe falsch wäre, dann müsste, scheint mir, "import hans.daten.Eins" genauso falsch sein; aber das wird klaglos akzeptiert.
 

KonradN

Super-Moderator
Mitarbeiter
Du hast die Struktur doch aufgezeigt:
Code:
├── hans
│   └── daten
│       ├── Eins.class
│       ├── Programm.class
│       └── Zwei.class
├── Eins.java
├── Programm2.java
├── Programm.java
└── Zwei.java

Somit sind die Dateien nicht an dem von dir beschriebenen Ort. Du brauchst eine Verzeichnisstruktur, die der Package Struktur entspricht.

Und dann musst Du entweder angeben, wo das Source Verzeichnis ist oder Du musst Dich in dem Source Verzeichnis befinden. Und die Dateien sind dann nicht nur Eins.java sondern hans\daten\Eins.java und so.

Aber ich würde Dir generell empfehlen, recht zügig zu einer IDE Deiner Wahl zu wechseln um dann nicht mehr von Hand auf der Kommandozeile zu arbeiten.
 

HansD

Mitglied
Aber ich würde Dir generell empfehlen, recht zügig zu einer IDE Deiner Wahl zu wechseln um dann nicht mehr von Hand auf der Kommandozeile zu arbeiten.
Ich komme mit der Kommandozeile hervorragend zurecht; aber ich werde wohl später der Effizienz willen und damit meine Arbeitskraft dem Zeitgeist entsprechend besser ausgenutzt werden kann auf eine IDE umsteigen. Ich habe gestern nebenher Eclipse installiert.
 

KonradN

Super-Moderator
Mitarbeiter
Ja und nein.

Beim Import ist in erster Linie der Classpath wichtig, damit die übersetze Klasse gefunden wird. Daher hat der Java Compiler die class Dateien in entsprechenden Verzeichnissen abgelegt.

Der Compiler sucht aber auch bei der Übersetzung nach der Klasse. Wenn die Klasse auf dem Classpath nicht zu finden ist, dann sucht er auch nach der Source Datei. Aber diese sucht er dann in daten/hans/ und nicht im aktuellen Verzeichnis.

Daher kommt der Fehler bei der Übersetzung. Du sagst ihm, dass er die Datei Eins.java übersetzen soll und dann kommt die Meldung:
file does not contain class Eins
Die Datei enthält nicht die Klasse Eins sondern die Klasse daten.hans.Eins - das macht einen kleinen Unterschied. Erstes ist eine Klasse EIns im unnamed package. Zweites eine Klasse Eins in hans.daten.

Das es bei irgendwelchen Versuchen auch mal geklappt hat, liegt dann daran, dass Du eine Klasse übersetzt hast, die EIns und Zwei braucht und diese Klassen im Classpath gefunden wurden. Es wurde da also vermutlich nur Programm.java übersetzt und EIns / Zwei aus den class Dateien gelesen (Die ja in .\hans\daten zu finden waren nach Deiner Aufstellung).

Also nur um es noch einmal deutlich zu sagen:

Es spielt für dein Programm.java keinen Unterschied ob Du da die Klassen einzeln per Import hinzufügst:
Java:
import hans.daten.Eins;
import hans.daten.Zwei;
Oder ob Du den ganzen Namespace einbindest:
import hans.daten.*;

Generell ist aber ein Import auf den Namespace selbst, wie ihn @Samka vorgeschlagen hat, nicht notwendig. Also kein:
import hans.daten;

Ich komme mit der Kommandozeile hervorragend zurecht; aber ich werde wohl später der Effizienz willen und damit meine Arbeitskraft dem Zeitgeist entsprechend besser ausgenutzt werden kann auf eine IDE umsteigen. Ich habe gestern nebenher Eclipse installiert.
Ok, es ist schön, dass Du mit der Kommandozeile zurecht kommst. Die kann auch zukünftig sehr interessant sein. Nur eben bestehen Java Programme oft aus einigen Dateien und haben auch Abhängigkeiten. Das alles auf der Kommandozeile zu machen wird dann sehr mühselig.
Daher ist es schon eine gute Idee, da auf ein Build Tool zu setzen. Ob das nun ein IDE Internes Projekt ist oder ein Tool wie Maven oder Gradle verwendet wird, ist da erst einmal nebensächlich. (Ich würde aber mittelfristig auf jeden Fall zu Maven oder Gradle raten!)

Ein großer Vorteil ist auch die Unterstützung beim schreiben von Java Code, da die IDE viele hilfreiche Vorschläge macht und man beim Schreiben schon Hinweise bekommt.
 

HansD

Mitglied
Ich danke für alle Hinweise und Hilfeversuche! Nach längerer Lektüre am heutigen Abend in einschlägiger Literatur habe ich es jetzt offenbar richtig gemacht. Die erfolgreiche Vorgehensweise habe ich in der angehängten Datei dokumentiert.

Falls jemand dazu aus seinem Kenntnis- und Erfahrungsschatz noch Hilfreiches anmerken möchte, lese ich es gerne und denke darüber nach.
 

Anhänge

  • package_compilation_h.txt
    1,8 KB · Aufrufe: 4

HansD

Mitglied
Wenn heute jemand in meiner Gegenwart auf der Straße das Wort "Package" benutzt, dann kann ich für nichts garantieren. ;-)

Ich hoffe, ich habe nur zu wenig geschlafen; eine ähnliche Fehlermeldung nervt mich heute schon den halben Nachmittag.
 

KonradN

Super-Moderator
Mitarbeiter
Evtl. hilft Dir der Gedanke: Wenn Du erst einmal eine IDE nutzt, dann hat sich diese Problematik eigentlich erledigt. Da hast Du dann eine kompetente Unterstützung und die Entwicklungsumgebung macht sehr viel für Dich. Und gewisse Fehler werden auf Knopfdruck korrigiert für Dich.
 

HansD

Mitglied
  • Gibt es eine Möglichkeit, ein frei zugängliches Hilfsmittel, um den Fehler "error: cannot find symbol" genauer zu untersuchen?
  • Könnte mir jdb helfen, das Problem genauer zu verstehen und einzugrenzen?
Nach 18 Uhr werde ich noch einmal einen systematischen Versuch unternehmen, das aktuelle Problem einzugrenzen.
Bis dahin afk.
 

KonradN

Super-Moderator
Mitarbeiter
Also in der Regel braucht es nicht mehr als eine Entwicklungsumgebung. Und wir können Dir gerne helfen, das Problem einzugrenzen. Wenn Du mich direkt anschreibst, dann kann man von mir aus auch gerne eine kurze Online Session machen, in der man das angeht. Oder Du stellst mir Dein Projekt mal als ZIP zur Verfügung und ich schaue dann mal.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Q Aufruf einer Klasse in einem Package Java Basics - Anfänger-Themen 7
R Klasse in einem Package soll auf Hauptverzeichnis zugreifen Java Basics - Anfänger-Themen 7
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
Igig1 Welche Werte sind als default Werte in einem Array, der als Datentyp eine Klasse hat? Java Basics - Anfänger-Themen 1
M Von einem Menü Methode aus anderer Klasse ausführen, die errechnete Werte in Datei schreibt. Java Basics - Anfänger-Themen 8
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
A regulären Ausdruck mit Hilfe der Klasse Scanner in einem String finden Java Basics - Anfänger-Themen 2
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
E Attribute von einem Objekt einer anderen Klasse ändern Java Basics - Anfänger-Themen 4
N Kann man in einem Projekt nur eine Klasse ausführen? Java Basics - Anfänger-Themen 6
D OOP Zugriff auf eine Klasse aus einem Interface-Objekt Java Basics - Anfänger-Themen 7
K Klassen Objekt mit einem Namen von einer bestimmten Klasse instanziieren Java Basics - Anfänger-Themen 10
A Mehrere Instanzen einer eigenen Klasse in einem Array Java Basics - Anfänger-Themen 5
Antoras Klasse in einem Textfeld zeichnen Java Basics - Anfänger-Themen 4
G Klasse von einem beliebigen Ordner aus starten Java Basics - Anfänger-Themen 2
G kein Zugriff auf eine Klasse in einem Unterordner Java Basics - Anfänger-Themen 11
G Problemme mit: Aufruf einer Klasse aus einem Frame Java Basics - Anfänger-Themen 5
G Klasse einem Packet hinzufügen Java Basics - Anfänger-Themen 3
P Funktion einer anderen Klasse aus einem Dialog aufrufen Java Basics - Anfänger-Themen 8
I @Inject in normaler Klasse? Java Basics - Anfänger-Themen 4
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Klasse in Runden Klammern bei Objektimplementierung Java Basics - Anfänger-Themen 4
J Klassen Klasse als Komponententyp bei Feldern Java Basics - Anfänger-Themen 2
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
Detlef Bosau nichtstatische Innere Klasse, this Pointer. Java Basics - Anfänger-Themen 47
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
B Klasse statisch erstellen da n-mal geladen Java Basics - Anfänger-Themen 3
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
XWing Random Punkte erstellen mit der Random klasse Java Basics - Anfänger-Themen 15
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
frager2345 Optional Klasse Java Java Basics - Anfänger-Themen 2
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
H Klassen Typ und Intitialisierungs-Klasse, wer bestimmt was? Java Basics - Anfänger-Themen 1
P Array vom Typ Klasse Java Basics - Anfänger-Themen 18
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
frager2345 Java Klasse Buch verwalten Java Basics - Anfänger-Themen 0
frager2345 Java eigen Klasse zum verwalten von Büchern Java Basics - Anfänger-Themen 3
T Zugriff auf Control anderer Klasse Java Basics - Anfänger-Themen 5
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
G zwei Instanzen einer Klasse Java Basics - Anfänger-Themen 29
C Int an andere Klasse übergeben Java Basics - Anfänger-Themen 26
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
B Klasse "Character" Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
D Array in Main Methode aus anderer Klasse aufrufen Java Basics - Anfänger-Themen 3
I Array Länge in Klasse festlegen Java Basics - Anfänger-Themen 1
L Klassen Vektor Klasse Java Basics - Anfänger-Themen 2
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
X Was ist der Unterschied zwischen materialisierten und nichtmaterialisierten Attributen einer Klasse? Java Basics - Anfänger-Themen 1
W Klasse existiert prüfen Java Basics - Anfänger-Themen 5
U Wie ein Attribut von einer Klassenmethode in der Klasse speichern= Java Basics - Anfänger-Themen 2
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 4
W Verschiedene Methoden in einer Klasse in der Main aufrufen? Java Basics - Anfänger-Themen 8
M Eclipse kennt keine String Klasse mehr Java Basics - Anfänger-Themen 1
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
J Fehler bei array aus anderer Klasse Java Basics - Anfänger-Themen 3
D Einen boolischen Wert aus einer Methode in einer anderen Klasse aufrufen? Java Basics - Anfänger-Themen 11
W n verschiedene Arrays zufällig ausgeben - mit der Random-Klasse? Java Basics - Anfänger-Themen 8
R TreeSet Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 8
C Auf die Methode einer anderen Klasse zugreifen Java Basics - Anfänger-Themen 1
B Static Attribute in einer Klasse, wie geht das? :O Java Basics - Anfänger-Themen 19
KogoroMori21 Objektvariable anderer Klasse übernehmen, Getter/Setter Java Basics - Anfänger-Themen 11
Vivien Auf eine Variable von einer anderen Klasse aus zugreifen Java Basics - Anfänger-Themen 3
M Aufruf von statischen Methoden einer anderen Klasse Java Basics - Anfänger-Themen 15
tony241188 Implementieren Sie die Klasse Hersteller, welche die folgenden Elektrogeräte produziert Java Basics - Anfänger-Themen 3
J Junit4 Klasse erstellen Java Basics - Anfänger-Themen 5
T Auf Instanz der selben Klasse aus überschriebener Methode in Methode zugreifen. Java Basics - Anfänger-Themen 2
M Scanner Klasse Java Basics - Anfänger-Themen 4
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
E Warum lässt sich eine Klasse nicht starten, wenn eine andere Klasse in dem Modul fehlerhaft ist? Java Basics - Anfänger-Themen 1
CptK Vererbung Attributtyp in Super-Klasse noch nicht festlegen Java Basics - Anfänger-Themen 1
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
I JaxB und Klasse "Object" ? Java Basics - Anfänger-Themen 7
H Quellcode Scanner Klasse Java Basics - Anfänger-Themen 2
L Attribute aus Klasse in berechnungs Methode übergeben Java Basics - Anfänger-Themen 1
A Klasse Menge mit Objekten der Klasse Person Java Basics - Anfänger-Themen 8
C Meldung einer Klasse nach "oben" Java Basics - Anfänger-Themen 6
A Methode in einer anderen Klasse verwenden Java Basics - Anfänger-Themen 1
D Attribut Telefonnummer - eigene Klasse oder String Java Basics - Anfänger-Themen 13
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
jonny_2k12 Wie kann ich eine ArrayList aus einer Klasse in eine andere übergeben? Java Basics - Anfänger-Themen 21
L Datentypen Deklarierte Felder einer Generic Klasse bestimmen Java Basics - Anfänger-Themen 7
C Methoden können nicht auf Instanzvariable der Klasse zugreifen Java Basics - Anfänger-Themen 3
J Scanner-Klasse Java Basics - Anfänger-Themen 2
itsmejo Erste Schritte Auf Attribut einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 14
P NoClassDefFoundError: org/apache/commons/collections4/ListValuedMap trotz vorhandener Klasse? Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben