# could not find main class obwohl da



## Piotre19910 (3. Apr 2016)

Hallo leute im compiler zeigt er mir an "could not find or load main class"

schaut euch mal den code an eigentlich sollte alles laufen.

```
class Isprim
{
    public static void main( String [] args)
    {
            int a = Integer.parseInt(args[0]);
            int k= 0;
            // algo
            for(int i= 1; i<a; i++)
                {
                    if ( a%k==0) k++;
                }
            if ( k ==2) System.out.println("ist ne primzahl");
            else System.out.println("ist keine Primzahl");
    }
}
```

also er zeigt bei publis static void main einen fehler an


----------



## Piotre19910 (3. Apr 2016)

er kann die hauptklasse nicht finden ich versteh nicht was er meint das ist ja die hauptklasse


----------



## Flown (3. Apr 2016)

Wie kompilierst und startest du dein Programm?


----------



## thet1983 (3. Apr 2016)

Die eckigen Klammern müssen in Verbindung mit String stehen
also

```
public static void main (String[] args){//......}
```


----------



## kneitzel (3. Apr 2016)

@thet1983: Das ist egal. Du kannst alle möglichen Varianten machen:

```
public static void main(String[] args) {}
public static void main(String [] args) {}
public static void main(String args[]) {}
```

Zumindest bei mir funktionieren alle 3 Varianten.


----------



## thet1983 (3. Apr 2016)

Sag ich ja.... Er hat aber ein Leerzeichen drinnen...schau mal seinen Code an


----------



## kneitzel (3. Apr 2016)

Also im code sehe ich erst einmal keinen Compile-Fehler. Die Frage ist also das genaue Handling. Wenn keine IDE benutzt wird und das die ganze Datei war (keine Zeile mit package dabei), dann ist der Compiler Aufruf per
javac isprim.java
möglich.

Der Aufruf selbst wäre dann
java Isprim 5
Hier ist wichtig:
a) kein .java
b) Groß- / Kleinschreibung!

Was aber auffällt sind Logik-Fehler.
a) die % operation ist falsch. Da willst Du eher ein %i statt %k rechnen.
b) die Überprüfung ist falsch. Eine Primzahl ist eine Zahl, die durch 1 und sich selbst teilbar ist. Da wäre k==2 prinzipiell richtig. Aber da Du den Test, ob die Zahl durch sich selbst teilbar ist, nicht durchführst, wird k bei Primzahlen nur 1 sein.


----------



## kneitzel (3. Apr 2016)

thet1983 hat gesagt.:


> Sag ich ja.... Er hat aber ein Leerzeichen drinnen...schau mal seinen Code an


Das Leerzeichen ist kein Fehler. In der zweiten Zeile sollte ein Leerzeichen sein. Habe meinen Beitrag noch einmal editieren und das Leerzeichen einfügen können.


----------



## thet1983 (3. Apr 2016)

ok wieder was dazu gelernt


----------



## Piotre19910 (4. Apr 2016)

Danke für eure antworten, an dem leerzeichen lag es nicht, danke für die logik berechtigung. Ich habe wohl selbst etwas falache informationen weitergegeben. Er kann das programm schon compiliere(javac)
aber beim aufruf mit java Isprim zeigt er mir an er kann die hauptklasse nicht finden


----------



## X5-599 (4. Apr 2016)

Wie sieht denn dein Aufruf aus?


----------



## kneitzel (4. Apr 2016)

Evtl. ist es ein Problem mit dem classpath, dass das aktuelle Verzeichnis nicht Bestandteil des classpaths bei dir ist.

So Du "javac isprim.java" und "java Isprim" aufrufst un du im aktuellen Verzeichns eine Datei Isprim.class erhalten hast, dann solltest Du einmal ausprobieren:
java -cp . Isprim


----------



## Piotre19910 (4. Apr 2016)

Ich weis nicht wieso aber bei dem programm läufts auf einmal. Aber bei einer anderen Datei kommt der selbe fehler. Könnte vll echt was mit dem classpath zusammenhängen aber damit kann ich noch nciht soviel anfangen. Die dateien sind alle in einem ordner.

Das ist die Datei: 
scheint iwie allgemein zu sein oda so 

```
class schleifen
{
    public static void main(String [] args)
    {
        // alle zahlen die durch 3 teilbar sind zwischen 10 und 40

            for(int i=10;i <= 40;i++)
                    {
                    if ( i %3 == 0) System.out.print(i+" ");
                    }
    }
}
```

Im anhang der cmd

hoffe ihr könnt was damit anfangen ich hab kein plan was er will


----------



## Piotre19910 (4. Apr 2016)

scheise kann man nicht lesen ich tipps mal ein:

..... javac Schleifen.java
(ohne probleme compiliert)
.....java Schleifen
Error: could not find or load main class


----------



## Jardcore (4. Apr 2016)

Zumindestens in deinem Beispielcode oben steht "schleifen" und nicht "Schleifen". Probiere mal public class statt nur class zu verwenden. http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html


----------



## kneitzel (4. Apr 2016)

Entgegen meiner ersten Aussage: Die main Methode muss tatsächlich public sein.

Jetzt wunder ich mich nur, wie ich darauf gekommen bin, dass dies nicht der Fall sein muss. Evtl. war es in C# anders. Aber egal. In Java muss die main Methode tatsächlich public sein sonst kann die Methode nicht gefunden werden. (Eben vorsichtshalber einmal ausprobiert)


----------



## Piotre19910 (4. Apr 2016)

ok auf einmal läuft die schleifen datei auch.. seltsam das einzige was passiert ist ich hab neugestartet. checkt einer wieso die dateien plötzlich gehen? wär nützlich zu wissen ansonsten kann man den post denke ich schliesen


----------



## Neumi5694 (9. Apr 2016)

Nein, dein Problem war die Groß / Kleinschreibung.
Das hier funktioniert beides:

javac schleifen.java
javac Schleifen.java

Warum? Weil du direkt auf die Datei zugreifst, DOS/WINDOWS unterscheidet nicht zwischen Groß- und Kleinschreibung. javac untersucht die .java-Dateien und kompiliert den darin enthaltenen Text.

Jetzt zur Ausführung
java schleifen ... funktioniert
java Schleifen ... Fehler

Grund: Es existiert keine Klasse namens "Schleifen" 

"java Schleifen" ruft NICHT die Datei Schleifen.java auf.

"java Schleifen" sagt dem Classloader "Finde doch bitte mal die Klasse 'Schleifen'"
Der Classloader in der Standard-Implementierung geht dann mal davon aus, dass die Klasse "Schleifen" in der Datei Schleifen.class gespeichert ist. Die Datei findet er, allerdings sucht er IN der Datei nach "Schleifen" und nach nichts anderem und diese Klasse existiert eben nicht. Die dort gespeicherter Klasse heißt "schleifen"

Bei der Ausführung eines Java-Programms musst du unterscheiden zwischen Klassen und Dateien. Der Class-Loader lässt sich nämlich auch ersetzen, du könntest einen eigenen verwenden, der die Klassen in völlig unterschiedlichen Dateien sucht.


----------

