Hauptklasse konnte nicht gefunden werden....

Diskutiere Hauptklasse konnte nicht gefunden werden.... im Java Basics - Anfänger-Themen Bereich. -
Also ich habe die Fehlermeldung das die Hauptklasse nicht gefunden werden konnte, jedoch sehe ich den Fehler ehrlich gesagt...
Bitte aktiviere JavaScript!
Kirby_Sike

Kirby_Sike

Also ich habe die Fehlermeldung das die Hauptklasse nicht gefunden werden konnte, jedoch sehe ich den Fehler ehrlich gesagt nicht...immer wenn ich dieser Fehlermeldung bekam, lag es daran dass die main falsch geschrieben war oder ich die Klasse umbenannt habe.

Der Code:

Java:
package database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class MainDatabase {

    public static void main(String[] args) throws Exception{
        createTable();

    }
    
    public static void createTable() throws Exception {
        try {
            Connection conn = getConnection();
            PreparedStatement create = conn.prepareStatement("CREATE TABLE IF NOT EXISTS tablename(id int NOT NULL AUTO_INCREMENT, firstname_varchar(255), lastname_varchar(255), PRIMARY KEY(id)");
            create.executeUpdate();
        }catch(Exception e) {
            System.out.println("Error when creating Table");
            e.printStackTrace();
        }
        finally{
            System.out.println("Table successfully created");
        }
    }
    
    public static Connection getConnection() throws Exception{
        try {
            String driver = "com.sql.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/UniDB";
            String username = "";
            String password = "";
            Class.forName(driver);
            
            Connection conn = DriverManager.getConnection(url, username, password);
            System.out.println("Connected");
            return conn;
        }catch(Exception e) {
            System.out.println("Connection Failed");
            e.printStackTrace();
        }
        return null;
    }

}
Hier ein Screenshot vom Package:

12929
 
J

JustNobody

Was hast Du denn genau wie versucht zu starten? Du musst den Ordner database, das die MainDatabase.class enthält, im Classpath haben und Du musst den vollqualifizierten Namen der Hauptklasse angeben. Also wenn die .class Files in out liegen sollten (also da ein Ordner database mit der .class Datei liegen sollte), dann könntest Du starten:
java -cp ./out database.MainDatabase
bzw
java -cp .\out database.MainDatabase
unter Windows.
 
Kirby_Sike

Kirby_Sike

Also ich habe nachgeschaut, jedoch ist das package im Buildpath :( Woran könnte es denn noch liegen? Wenn mit dem "out" Ordner der binary Ordner gemeint ist, dann liegt die Datei dort nicht drin
 
J

JustNobody

Also was genau versuchst Du wie zu machen? Das ist eine Info, die wichtig ist. Ansonsten ist und bleibt das ein Raten!

Da ich keine Ahnung habe, wie Du was gerade versuchst zu machen konnte ich nur eine allgemeine Information geben...

Generell ist es so, dass java Klassen übersetzt werden. Dabei entstehen .class Dateien. Diese werden irgendwo gespeichert. Der Ordner kann generell so heißen wir du möchtest. Verschiedene Build Tools haben da unterschiedliche Vorlieben. So Du z.B. den initializer von Spring nutzt um dir ein Maven Projekt bauen zu lassen, dann ist es ein Verzeichnis target, das viele weitere Verzeichnisse enthält. Die eigentliche Übersetzung landet dann z.B. in target/classes (Was Maven halt so macht - das ist nicht spring spezifisch!)

"out" umschreibt also lediglich das Ausgabeverzeichnis - wie auch immer dies heißen mag. Das solltest Du wissen oder heraus finden. Aber da ich nicht weiss, was Du wie machst, kann ich dazu nichts sagen.

Und der Fehler klang so, als ob das die Meldung wäre, wenn beim Start die Hauptklasse mit der main methode nicht gefunden wurde. Wenn Du gerade versuchst etwas zu starten -> Beim eigentlichen Start spielt der Build Path keine Rolle!

Also was genau machst Du und wie weit konntest Du das Problem eingrenzen?
 
Kirby_Sike

Kirby_Sike

Puuh also ich versuche eigentlich ersteinmal nur meine Hauptklasse für die Datenbank mit der eigenen Main Methode ausführen...beim Ausführen erhalte ich die oben genannte Fehlermeldung. Ich weiß, dass dies sehr wenige Infos sind :(

Hier noch ein Screenshot des gesamten Projekts:

12931
 
J

JustNobody

Also irgendwie schaffst Du es, weiterhin kaum Informationen her zu geben.

Welche IDE nutzt Du? Ist das immer noch Eclipse?

Evtl. ist es wieder ein einfaches Problem Deiner IDE, wie Du sie schon neulich hattest? ==> Evtl. stimmt also auch an Deiner Installation etwas nicht. Es ist eigentlich nicht normal, ständig in irgendwelche Ausnahmesituationen zu kommen :) Es sei denn, man hat irgend etwas, das dies ständig triggert.
==> Passt Du den Projektordner ständig von außerhalb der IDE an. Also z.B. über eine Versionsverwaltung oder so incl. Entwicklung an mehreren Computern?

Was auffällt ist das rote X - Da muss also irgendwo die Fehlermeldung sein. Mal mit der Maus drauf gegangen? Evtl. wird dann per mouse over Event die Meldung eingeblendet? (==> Generell ist es so, dass ein Starten eines Projektes oft schlicht nicht geht, wenn Fehler da sind. Ist ja auch logisch: Vor dem Start muss übersetzt werden und ohne fehlerfreie Übersetzung kein Start ....)

Dann könnte man schauen:
- Eventuell hat Eclipse selbst irgendwelche Probleme. Also mal Eclipse neu starten und schauen, was Eclipse so an Meldungen bringt. (Meldungen einfach ignorieren ist immer ganz schlecht. Bei Warnungen und Fehlern sollte man dem immer nach gehen. Wenn man verstanden hat, was die Warnung bedeutet, dann kann man ggf. entscheiden, etwas erst einmal zu ignorieren....)
- Prüfen, wie weit Eclipse überhaupt kommt. In der .classpath Datei sollte - so ich mich richtig erinnere - auch ein Eintrag sein, wo die class Dateien angelegt werden. Dann könnte man da prüfen ob und was da ist...

Generell aber erst einmal mit offenen Augen nach Meldungen und Fehlern schauen.
 
Kirby_Sike

Kirby_Sike

Also irgendwie schaffst Du es, weiterhin kaum Informationen her zu geben.

Welche IDE nutzt Du? Ist das immer noch Eclipse?

Evtl. ist es wieder ein einfaches Problem Deiner IDE, wie Du sie schon neulich hattest? ==> Evtl. stimmt also auch an Deiner Installation etwas nicht. Es ist eigentlich nicht normal, ständig in irgendwelche Ausnahmesituationen zu kommen :) Es sei denn, man hat irgend etwas, das dies ständig triggert.
==> Passt Du den Projektordner ständig von außerhalb der IDE an. Also z.B. über eine Versionsverwaltung oder so incl. Entwicklung an mehreren Computern?

Was auffällt ist das rote X - Da muss also irgendwo die Fehlermeldung sein. Mal mit der Maus drauf gegangen? Evtl. wird dann per mouse over Event die Meldung eingeblendet? (==> Generell ist es so, dass ein Starten eines Projektes oft schlicht nicht geht, wenn Fehler da sind. Ist ja auch logisch: Vor dem Start muss übersetzt werden und ohne fehlerfreie Übersetzung kein Start ....)

Dann könnte man schauen:
- Eventuell hat Eclipse selbst irgendwelche Probleme. Also mal Eclipse neu starten und schauen, was Eclipse so an Meldungen bringt. (Meldungen einfach ignorieren ist immer ganz schlecht. Bei Warnungen und Fehlern sollte man dem immer nach gehen. Wenn man verstanden hat, was die Warnung bedeutet, dann kann man ggf. entscheiden, etwas erst einmal zu ignorieren....)
- Prüfen, wie weit Eclipse überhaupt kommt. In der .classpath Datei sollte - so ich mich richtig erinnere - auch ein Eintrag sein, wo die class Dateien angelegt werden. Dann könnte man da prüfen ob und was da ist...

Generell aber erst einmal mit offenen Augen nach Meldungen und Fehlern schauen.
Jap ich benutze noch Eclipse :)


Ich habe 2 mal per Terminal Dateien im Ordner herum geschoben, es könnte daran liegen :) Ich werde mir den Build Path nochmal im Detail anschauen und schaue mir ebenfalls die Error Meldungen an :)
 
Kirby_Sike

Kirby_Sike

Sooo ich habe einfach mal Eclipse neu geöffnet und zumindest habe ich jetzt eine detailliertere Fehlermeldung xD

Code:
Connection Failed
java.lang.ClassNotFoundException: com.sql.jdbc.Driver
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:315)
    at database.MainDatabase.getConnection(MainDatabase.java:34)
    at database.MainDatabase.createTable(MainDatabase.java:16)
    at database.MainDatabase.main(MainDatabase.java:10)
Error when creating Table
java.lang.NullPointerException
    at database.MainDatabase.createTable(MainDatabase.java:17)
    at database.MainDatabase.main(MainDatabase.java:10)
Table successfully created
Das liegt scheinbar am SQL Code :) Ich gehe den einfach mal durch :)
 
J

JustNobody

Erst einmal super, dass Du jetzt eine Fehlermeldung hast.

Aber erst noch ein kleiner Hinweis bezüglich Aktionen auf Dateien von außen, damit das nicht missverstanden wurde:

Also die reinen Source Dateien zu verschieben / zu modifizieren ist unkritisch. Das ist eine Operation mit der Eclipse sozusagen rechnet. Da kann es maximal kleine Anzeigeprobleme geben, wenn Eclipse sowas nicht sofort merkt. (Typisch, da dies z.B. auch im Rahmen der Versionierung regelmäßig auftritt. Dann verändert z.B. git die Source Dateien.)

Die typischen Probleme treten auf, wenn z.B. Daten synchronisiert werden, die dafür nicht gedacht sind oder Pfade schlich falsch sind. (Also ich kenne es nur von IntelliJ und Visual Studio. Da gibt es dann Dateien, die halt wirklich spezifisch für die Arbeitsumgebung sind. Diese sind dann nicht in die Versionsverwaltung einzuchecken.

Und zu der Fehlermeldung: Da dürfte einfach der JDBC Treiber der Datenbank nicht im Classpath eingebunden worden sein. Also die jar Datei noch hinzufügen. Bei einem Eclipse Java Project könntest Du z.B. ein Verzeichnis lib anlegen (neben src), da die jar Datei ablegen und dann in dem Classpath einbinden (Das ging über externe Jar oder so ... aber rechtsklick auf die jar Datei sollte ein entsprechenden Menüeintrag haben.
 
Kirby_Sike

Kirby_Sike

So ich hatte den Connector vorher im Ordner database, jedoch war der schon classpath eingebunden. Ich habe eine wage Vermutung, ich benutze MySQL Community Workspace und wenn ich für Benutzer Accounts anlege, verändert sich die länge des Passwort
 
Kirby_Sike

Kirby_Sike

ich hatte auch Probleme mit diesem Driver ,probiere diesen->
com.mysql.cj.jdbc.Driver
und auch url mit folgenden Parameter ->
String url = "jdbc:mysql://localhost:3306/UniDB?useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC
Danke :) Jetzt bekomme ich nur noch eine Meldung, dass er keine Zugriffsrechte für die DB hat und das liegt vermutlich am Passwort :) Danke
 
Kirby_Sike

Kirby_Sike

Nach 30 Jahren hab ich es endlich geschafft auf die DB zu zugreifen xD Lag daran, das es zwar eine localhost Instanz gab, jedoch gab es kein Schema mit dem Namen "unidb" xD Jetzt musst ich nur noch vernünftig SQL können und dann läuft der Kram xD
 
Kirby_Sike

Kirby_Sike

Was mich noch verwirrt ist diese Error Meldung:

Java:
java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1347)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025)
    at database.MainDatabase.createTable(MainDatabase.java:18)
    at database.MainDatabase.main(MainDatabase.java:10)
Das einzige was in meiner SQL Datenbank steht ist das:
SQL:
CREATE DATABASE `unidb`;
Ich habe schon das ausprobiert, jedoch kommt dann schon in der MySQL Workbench ein SQL Syntax Error:

SQL:
CREATE DATABASE 'unidb';
Hier ist noch meine Java File:

Java:
package database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class MainDatabase {

    public static void main(String[] args) throws Exception{
        createTable();

    }
    
    public static void createTable() throws Exception {
        try {
            Connection conn = getConnection();
            PreparedStatement create = conn.prepareStatement("CREATE TABLE IF NOT EXISTS login (id int NOT NULL AUTO_INCREMENT, firstname varchar(255), lastname varchar(255), PRIMARY KEY(id)");
            create.executeUpdate();
        }catch(Exception e) {
            System.out.println("Error when creating Table");
            e.printStackTrace();
        }
        finally{
            System.out.println("Table successfully created");
        }
    }
    
    public static Connection getConnection() throws Exception{
        try {
            String driver = "com.mysql.cj.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/UniDB?useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC";
            String username = "";
            String password = "";
            Class.forName(driver);
            
            Connection conn = DriverManager.getConnection(url, username, password);
            System.out.println("Connected");
            return conn;
        }catch(Exception e) {
            System.out.println("Connection Failed");
            e.printStackTrace();
        }
        return null;
    }

}
 
J

JustNobody

Die Fehlermeldung ist doch deutlich: Der SQL Befehl ist ungültig.

CREATE TABLE IF NOT EXISTS login (
id int NOT NULL AUTO_INCREMENT,
firstname varchar(255),
lastname varchar(255),
PRIMARY KEY(id)

Also ganz offensichtlich hast Du eine öffnende Klammer mehr als schließende Klammern.

Sowas kann man doch auch direkt austesten in der Workbench....
 
T

TM69

Was mich noch verwirrt ist diese Error Meldung:

Java:
java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1347)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025)
    at database.MainDatabase.createTable(MainDatabase.java:18)
    at database.MainDatabase.main(MainDatabase.java:10)
Das einzige was in meiner SQL Datenbank steht ist das:
SQL:
CREATE DATABASE `unidb`;
Ich habe schon das ausprobiert, jedoch kommt dann schon in der MySQL Workbench ein SQL Syntax Error:

SQL:
CREATE DATABASE 'unidb';
Hier ist noch meine Java File:

Java:
package database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class MainDatabase {

    public static void main(String[] args) throws Exception{
        createTable();

    }
   
    public static void createTable() throws Exception {
        try {
            Connection conn = getConnection();
            PreparedStatement create = conn.prepareStatement("CREATE TABLE IF NOT EXISTS login (id int NOT NULL AUTO_INCREMENT, firstname varchar(255), lastname varchar(255), PRIMARY KEY(id)");
            create.executeUpdate();
        }catch(Exception e) {
            System.out.println("Error when creating Table");
            e.printStackTrace();
        }
        finally{
            System.out.println("Table successfully created");
        }
    }
   
    public static Connection getConnection() throws Exception{
        try {
            String driver = "com.mysql.cj.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/UniDB?useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC";
            String username = "";
            String password = "";
            Class.forName(driver);
           
            Connection conn = DriverManager.getConnection(url, username, password);
            System.out.println("Connected");
            return conn;
        }catch(Exception e) {
            System.out.println("Connection Failed");
            e.printStackTrace();
        }
        return null;
    }

}
Ich würde jetzt mal ganz stumpf Behaupten, daß in
Code:
PreparedStatement create = conn.prepareStatement("CREATE TABLE IF NOT EXISTS login (id int NOT NULL AUTO_INCREMENT, firstname varchar(255), lastname varchar(255), PRIMARY KEY(id)");/
eine abschließende Klammer vor dem letzten " fehlt :D
 
Kirby_Sike

Kirby_Sike

Die Fehlermeldung ist doch deutlich: Der SQL Befehl ist ungültig.

CREATE TABLE IF NOT EXISTS login (
id int NOT NULL AUTO_INCREMENT,
firstname varchar(255),
lastname varchar(255),
PRIMARY KEY(id)

Also ganz offensichtlich hast Du eine öffnende Klammer mehr als schließende Klammern.

Sowas kann man doch auch direkt austesten in der Workbench....
Ohh xD Da hat wieder meine Dummheit zugeschlagen xD Dankeschön

Kaum hat man die Klammer hinzugefügt, läuft alles wie am Schnürchen XD
 
mihe7

mihe7

Ja, das ist eine der schmerzlichsten Erfahrungen beim Programmieren: Du kannst Dich ärgern, Du kannst um Dich schlagen, der Tischplatte ein Stück rausbeißen, Du kannst ihn verfluchen... am Ende hat der Compiler immer recht :mad:
 
mihe7

mihe7

Nachtrag: ach, es geht hier ja um das Runtime... Egal, was für den Compiler gilt, gilt für das Runtime auch :p
 
J

JustNobody

Ja, leider ist die Formatierung verloren gegangen, da ich das nicht in code Tags gesetzt hatte.

Da kann man es oft recht schön einrücken und so lesbarer machen. Alle Zeilen ab der 2ten waren eingerückt und die ( wäre dann sozusagen wie in Java die } - und die letzte Zeile mit der "}" hätte man dann gut gesehen (so man das halt von Java her etwas gewohnt ist und diese Paralleltät sehen würde).

Aber das ist natürlich eine ganz pers. Vorliebe - die kann man für sich ausprobieren und dann für gut oder schlecht befinden. Es ist kein "Best Practice" oder so, das besagen würde, dass man es so machen sollte.

Und mir war halt noch etwas wichtig, Dir diesen Ansatz zur Selbsthilfe an die Hand zu geben: Probier so Befehle dann in der Workbench aus und so. (Das war am Ende also kein genervtes "Mach das doch alleine statt zu fragen" oder so. Nicht dass dies falsch verstanden wurde.)
 
J

JustNobody

Das mit "mihes Tischplatte" erinnert mich an den Versuch vor ein paar Jahren etwas nach Indien auszulagern. Im Vergleich zu manch einem da erscheint manch einer der Studienanfänger schon fast als Senior Software Engineers :)

Kollegen hatten mir dann vorsichtshalber noch so ein paar alte IBM Tastaturen hingestellt. Kennt die hier noch jemand? Das waren die Teile unten mit Metallplatte, massives Kunstoffgehäuse und jede Taste hatte eine abziehbare Umrahmung mit Aufdruck, die man halt zur Reinigung abziehen konnte (abziehen, in ein Wäschesäckchen stecken und in der Waschmaschine mitwaschen ... die Tasten waren immer sauber!). Die waren halt dann für den Fall da, dass bei meinen "Kopf -> Tischplatte" Reaktionen bei gewissen Aussagen der Kollegen aus Indien mal der Kopf die Tastatur treffen sollte :)

Und das mit den Biss-Spuren ist meinem Arbeitsplatz auch immer nachgesagt worden :).
 
Thema: 

Hauptklasse konnte nicht gefunden werden....

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben