# Ein haufen Fehlermeldungen aber keine Ahnung warum...



## Zakon (25. Jan 2021)

[CODE lang="java" highlight="28"]Exception in Application init method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)
Caused by: java.lang.RuntimeException: Exception in Application init method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:895)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.lang.StackOverflowError
    at java.base/java.util.EnumSet.allOf(EnumSet.java:132)
    at javafx.graphics/javafx.scene.Node.<init>(Node.java:633)
    at javafx.graphics/javafx.scene.Parent.<init>(Parent.java:1418)
    at javafx.graphics/javafx.scene.layout.Region.<init>(Region.java:584)
    at javafx.controls/javafx.scene.control.Control.<init>(Control.java:431)
    at javafx.controls/javafx.scene.control.TextInputControl.<init>(TextInputControl.java:137)
    at javafx.controls/javafx.scene.control.TextField.<init>(TextField.java:152)
    at javafx.controls/javafx.scene.control.TextField.<init>(TextField.java:143)

at Main.view.View.<init>(View.java:92)
    at Main.model.DBConnection.<init>(DBConnection.java:13)
    at Main.model.DBConnection.getInstance(DBConnection.java:20)
    at Main.logic.Controller.boxFirmafuellen(Controller.java:15)[/CODE]

Ab Zeile 28 wiederholt sich das ganze 100000 mal.

Beim 1.Fehler:
[CODE lang="java" title="Klasse View"] private List<FirmenDetails> listefirma = controller.boxFirmafuellen();[/CODE]

Beim 2.
[CODE lang="java" title="Klasse DB Connection"]public class DBConnection{
    View view = new View();
[/CODE]

Beim 3.Fehler
[CODE lang="java" title="Klasse DB Connection" highlight="3"]public static DBConnection getInstance () {
        if (INSTANCE == null) {
            INSTANCE = new DBConnection();
        }
        return INSTANCE;
    }[/CODE]

Beim 4. Fehler
[CODE lang="java" title="Klasse Controller" highlight="2"] public List<FirmenDetails> boxFirmafuellen() {
        List<FirmenDetails> listefirma = DBConnection.getInstance().loadfirmen();
        return listefirma;
    }[/CODE]

Das Porgramm hat eigentlich ganz normal Funktioniert dann auf einmal nicht mehr ich weiss nicht was ich geändert habe das es nicht mehr funktioniert 🤔

Danke im Vorraus.


----------



## kneitzel (25. Jan 2021)

Also erst einmal die logische Frage: Du hast eine Datenbank-Connection. Wozu muss die denn die View kennen? Das erscheint mir erst einmal ein schlechtes Design zu sein und produziert auch entsprechende Kreise. So siehst Du das dann auch:
- Du rufst irgendwo das erste mal getInstance auf.
-> INSTANCE ist null -> new DBConnection() 
-> new View() 
-> View ruft im Konstruktor das Box Befüllen auf was wieder getInstance aufruft und der Kreis ist komplett!

Lösung: Vernünftig bauen, so dass die View die Connection nutzt aber die Connection die View nicht kennt. Schon kannst Du so einen Kreis nicht mehr haben!


----------



## Zakon (25. Jan 2021)

Ich brauche aber für ein SQL Statement in der Connection ein Value aus der Box in der View dann wäre doch der einfacshte weg das direkt zu übergeben oder?


----------



## kneitzel (25. Jan 2021)

Ja genau, bei so einer Abfrage übergibst Du dann die Werte. So bist Du bei der Datenbankverbindung unabhängig von der Oberfläche.

Das macht ja auch Sinn, denn so kannst Du dann die Datenbankklasse normal weiter verwenden, wenn Du es z.B. als Web Applikation brauchst ...


----------



## Zakon (25. Jan 2021)

Ich glaube ich verstehe dich nicht ganz richtig  Ich brauche ein wert in der DBConnection von der View. Somit muss die DB Connection doch auch die View kennen damit ich den wert direkt übergeben kann oder?

```
"SELECT * FROM Frimen F JOIN Mitarbeiter M ON F.ID=M.Firmen_ID " +
                    "JOIN Produkte P ON P.ID=M.ID WHERE F.Name LIKE '%" + view.getBoxFirma().getValue() + "%'");
```


----------



## kneitzel (25. Jan 2021)

Du rufst das doch von irgendwo auf. Also gibst Du der Methode, die Du da aufrufst, einen Parameter. Und dann kannst Du diesen Parameter verwenden. Und die Abfrage der Datenbank bitte mit einem Prepared Statement so dass DU den SQL String so nicht zusammen setzt sondern statt dessen Parameter verwendest!


----------



## Zakon (25. Jan 2021)

Also dann so ?
[CODE lang="java" title="Klasse View"]public String auswahlFirmaBox(){
        String auswahlFirma = boxFirma.getValue().toString();
        return auswahlFirma;
    }[/CODE]
[CODE lang="java" title="Klasse Controller"]public String uebergabeBoxFirma(){
        String firmauebergabe=view.auswahlFirmaBox();
        return firmauebergabe;
    }[/CODE]
[CODE lang="java" title="Klasse DB Connection"]"SELECT * FROM Frimen F JOIN Mitarbeiter M ON F.ID=M.Firmen_ID " +
                    "JOIN Produkte P ON P.ID=M.ID WHERE F.Name LIKE '%" + controller.uebergabeBoxFirma() + "%'")[/CODE]

jetzt gehe ich ja von der View über den Controller in die DBConnection.
Und die Prepared Statements werde ich noch nachtragen


----------



## kneitzel (25. Jan 2021)

Du scheinst ja ein MVC Model implementieren zu wollen. Der Controller ist dann dafür zuständig, die Daten zu laden und dann als Model an die View zu geben.

Damit kennt der Controller dann das Data Access Layer. Das DAL kennt aber nur die Daten und sonst nichts. Kann also Daten lesen und schreiben ... im DAL hast Du dann irgendwas a.la.


```
List<WhatEver> getWhatEver(final String suchString) {
    // ....
    String SQL = "SELECT * FROM Frimen F JOIN Mitarbeiter M ON F.ID=M.Firmen_ID " +
                 "JOIN Produkte P ON P.ID=M.ID WHERE F.Name LIKE '%" + suchString + "%'";
    // ...
}
```
Das DAL hat keine Kenntnis von Controller oder View oder sonst irgend etwas Deiner Applikation! Es kennt nur die Entities und so ...


----------



## thecain (25. Jan 2021)

kneitzel hat gesagt.:


> Der Controller ist dann dafür zuständig, die Daten zu laden und dann als Model an die View zu geben.


mMn geschieht der DataAccess im Model und der Controller verbindet nur View und Model


----------



## kneitzel (25. Jan 2021)

thecain hat gesagt.:


> mMn geschieht der DataAccess im Model und der Controller verbindet nur View und Model


Ja, ist natürlich richtig und ich habe zu schnell getippt.


----------

