Aufruf von statischen Methoden einer anderen Klasse

Hallo zusammen

Ich versuche aus der main-class statische Methoden einer anderen class aufzurufen, erhalte aber beim Kompilieren die Fehlermeldung "cannot find symbol". Ich weiss, dass das auf eine fehlende Deklarierung hindeutet. Aber bei statischen Methoden braucht es doch keine Instanz der Klasse, die diese Methode hat, oder?

Die Klasse Functions liegt im gleichen Ordner, sollte als keinen Pfad benötigen. Auch import ist mE unnötig, hab' ich trotzdem getestet, macht keinen Unterschied.

In der class Functions meckert die IDE "The public type Functions must be defined in its own file Java(16777541)", kompiliert wird aber trotzdem anstandslos.

Was überlege ich falsch?
Danke für eure Hilfe.

[CODE lang="java" title="class Master"]package Kapitel35_Autohof;

public class Master {
public static void main(String args[]){

String test1 = Functions.askUser4words("Wie heisst du?");
int test2 = Functions.askUser4values("Welche Zahl willst du?");

System.out.println(
"Hallo "+test1+
"\nDu hast "+test2+" eingetippt.");
}
}[/CODE]
[CODE lang="java" title="class Functions"]package Kapitel35_Autohof;
import java.util.Scanner;

public class Functions {

public static String askUser4words (String question){
System.out.println(question);
Scanner askUser = new Scanner(System.in);
String answer = askUser.nextLine().trim();
askUser.close();
return answer;
}

public static int askUser4values (String question) {
System.out.println(question);
Scanner askUser = new Scanner(System.in);
int answer = askUser.nextInt();
askUser.close();
return answer;
}
}
[/CODE]
 
Mach mal ein Rebuild (Clean & Build) vom Projekt. Cannot find Symbol kann hier nicht sein. Das funktioniert wunderbar (wenn man von einem Laufzeitfehler, den Du nach der Eingabe des Namens bekommen wirst, weil Du den Scanner und damit System.in schließt)
 
Wie übersetzt Du denn die Dateien? Wenn Du es auf der Kommandozeile machst, dann kannst Du z.B. beider Dateien angeben. Oder es muss erst Functions.java übersetzt werden und bei der Übersetzung der zweiten Datei muss die class Datei von Functions im sogenannten classpath sein.
 
@mihe7 : Danke für den Tipp!
Das Scanner-Problem hab' ich bereits auf dem Radar, schau' ich mir später an.

Hmm, diese neue, vereinfachte Variante klappt tadellos:
[CODE lang="java" title="class Master"]public class Master {
public static void main(String[] args) {
System.out.println("du hast "+UI_functions.getNumber()+" eingetippt.");
}
}[/CODE]
Java:
import java.util.Scanner;

public class UI_functions {
    public static int getNumber(){
        System.out.println("Gib ne Zahl ein.");
        Scanner input = new Scanner (System.in);
        return input.nextInt();
    }
}

Da bin ich schon mal beruhigt, dass mein Fehler nicht beim Verständnis static class/method entstanden ist ;-)

Was könnte bei der ursprünglichen Variante die Fehlerursache sein?
 
Wie übersetzt Du denn die Dateien? Wenn Du es auf der Kommandozeile machst, dann kannst Du z.B. beider Dateien angeben. Oder es muss erst Functions.java übersetzt werden und bei der Übersetzung der zweiten Datei muss die class Datei von Functions im sogenannten classpath sein.
In Visual Studio Code (mehr Info unten) tipp' ich "javac Master.java". So viel ich weiss, werden die in Master.java aufgerufenen Klassen automatisch mitkompiliert, es hat nämlich danach jeweils die entsprechenden *.class-files.

Infos zu meiner IDE:
Version: 1.55.1 (user setup)
Commit: 08a217c4d27a02a5bcde898fd7981bda5b49391b
Datum: 2021-04-07T15:06:02.360Z
Electron: 11.3.0
Chrome: 87.0.4280.141
Node.js: 12.18.3
V8: 8.7.220.31-electron.0
Betriebssystem: Windows_NT x64 10.0.19041
 
javac -cp . Functions.java
javac -cp . Master.java
oder kurz
javac -cp . *.java
bzw. hier auch einfach
javac *.java
 
@mihe7 : Danke. Ich kann mit javac *.java zwar alles auf einen Schlag kompilieren, aber die Fehlermeldung "cannot find symbol" bleibt (in der ursprünglichen Variante).

Aber; ich hatte soeben noch ne Idee; Ordner auf Desktop kopiert und Ordnername verkürzt; siehe da, es klappt.
Mögliche Fehlerursachen:
  1. zu lange Adresse: D:\*\*\Programmierung 2\Java Tutorial\Kapitel35_Autohof
  2. Name des Orders: Sind underscores ein Problem?
Danke jedenfalls für eure Hilfe!

Nachtrag: der underscore (_) war's. Änderung hat das Problem gelöst.
 
Ok, meine Vermutung:
Du bist in das Verzeichnis Kapitel35_Autohof gegangen und hast da ein javac Master.java aufgerufen.
==> Er findet Function nicht, weil die Verzeichnisstruktur nicht passt.

Ja, er versucht, ein Function.java zu finden, aber das ist im Package Kapitel35_Autohof, d.h. er will ein .\Packag35_Autohof\Functions.java übersetzen. das gibt es aber nicht.

Ein javac *.java funktionierte in meinen Tests, da er da die Klasse trotz falschem Pfad finden konnte.

Der Fehler ist, dass du es im falschen Verzeichnis aufrufst. Das Source Verzeichnis ist bei Die das Java Tutorial Verzeichnis. Entweder Du rufst es von dort auf oder du setzt den Pfad mit -src.
javac Kapitel35_Autohof\Master.java

Das wäre, was ich mir zusammen gereimt habe aus den Angaben.
 
Ok, meine Vermutung:
Du bist in das Verzeichnis Kapitel35_Autohof gegangen und hast da ein javac Master.java aufgerufen.
==> Er findet Function nicht, weil die Verzeichnisstruktur nicht passt.

Ja, er versucht, ein Function.java zu finden, aber das ist im Package Kapitel35_Autohof, d.h. er will ein .\Packag35_Autohof\Functions.java übersetzen. das gibt es aber nicht.

Ein javac *.java funktionierte in meinen Tests, da er da die Klasse trotz falschem Pfad finden konnte.

Der Fehler ist, dass du es im falschen Verzeichnis aufrufst. Das Source Verzeichnis ist bei Die das Java Tutorial Verzeichnis. Entweder Du rufst es von dort auf oder du setzt den Pfad mit -src.
javac Kapitel35_Autohof\Master.java

Das wäre, was ich mir zusammen gereimt habe aus den Angaben.
das klingt passend, auch deine Vermutung ist zutreffend.

Allerdings hatte der Aufruf aus dem Unterverzeichnis (=Kapitel35) das gewünschte Resultat:
PS D:\*\*\Programmierung 2\Java Tutorial\Kapitel35> javac Master.java
PS D:\*\*\Programmierung 2\Java Tutorial\Kapitel35> java Master
Wie heisst du?
dfdf
Welche Zahl willst du?
Exception in thread "main" java.util.NoSuchElementException
...

Beide files (Master.java und Function.java) sind im Ordner Kapitel35, es gibt darin keine Unterordner.

Ich habe noch einen wichtigen Punkt vergessen zu erwähnen;
package Kapitel35_Autohof; habe ich in beiden files auskommentiert. Wenn ich das nicht mache, erhalte ich wieder dieselbe Fehlermeldung.
Also trifft @kneitzel wohl doch ins Schwarze ;-)
 
Ja, vermutlich, wobei dann nicht der Underscore sondern jedes Verzeichnis ein Problem darstellen müsste.
Weder die Verzeichnislänge noch der Underscore sind das Problem.

Das Problem ist der Aufruf aus dem falschen Verzeichnis und die Angabe der Dateien nicht mit vollem, richtigen Namen.

Wenn das Package p1.p2 ist und die Klasse Klasse heisst, dann ist die Datei p1\p2\Klasse.java und sollte so angegeben werden.
 
Ja, Das Zitat war evtl. ungeschickt gewählt. Mir ging es auch mehr darum, eben diesen zwei Vermutungen vom TE noch einmal deutlich entgegen zu treten und die Ursache deutlich zu beschreiben.

Wie von Dir geschrieben wird das Problem mit jedem Verzeichnis / Package auftreten.
 

Zurück
Oben