Hey,
in meinem Code habe ich diese Variable: this.priceShopCursor = shopData.getPrice_Shop_Cursor(); Auf sie wird auch die Exception verwiesen.
java.lang.NullPointerException
at de.m_ver.cookieclicker.gui.CookieShop.initialVariables(CookieShop.java:62)
at de.m_ver.cookieclicker.gui.CookieShop.<init>(CookieShop.java:42)
at de.m_ver.cookieclicker.gui.CookieClickerGUI.<init>(CookieClickerGUI.java:82)
at de.m_ver.cookieclicker.main.Main$1.run(Main.java:15)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Die Exception java.lang.NullPointerException sagt doch, dass eine Variable mit null initialisiert ist, was bei mir nicht der Fall ist, meine Variable ist mit shopData.getPrice_Shop_Cursor(); initialisiert. Dieser Wert wird aus meiner Datenbank-Klasse geholt price_Shop_Cursor = resultSet.getInt("PRICE_SHOP_CURSOR"); Diese Variable enhält einen Wert der Datenbank, welcher definitif auch nicht null ist. Dies hab ich mit einem sysout auch üerprüfen können: Preis Cursor: 400(Beim allerersten Start des programmes wird der Wert in der Datenbank auf 400 gesetzt) Weiß zufällig jemand, woran das Problem liegen kann? Vielen Dank für potentielle Hilfe!
Ah stimmt, ich hab die Inztanz der Klasse nicht initialisiert. Ich dachte das wäre bei Klassen nicht umbedingt nötig. Allerdings weiß ich dann nicht, wie ich eine Inztanz der Klasse erstellen kann ohne sie damit aufzurufen.
Wenn man eine Klasse hat welche einen Kontruktor mit Befehlen hat, diese Klasse dann in einer anderen Klasse inztanziert, TestKlasse irgendeineKlasse = new TestKlasse()
wird die Klasse/der Konstruktor aufgerufen.
Und genau dass will ich nicht. Ich rufe diese Klasse schon in einer anderen Klasse auf, und doppelt aufrufen führ nur zu Fehlern. Ich brauche bloß eine Instatztvariable um aif die Werte ihrer Klasse zugreifen zu können.
Dann musst du die erste Instanz der Klasse mittels Dependency Injection in die Klasse übergeben, wo du auf die Werte zugreifen musst.
Hier mal ein Minimalbeispiel:
Dass heißt also, ich nehme einfach die Inztanz die noch nicht initialisiert ist und übergebe sie den Kontruktor als Parameter?
Ich habe meine Klasse einfach so instanziert gehabt. TestKlasse test; Und dann immer test benutzt um auf die Klasse der Inztanz zuzugreifen
Und ich brauche aber den Parameter? Was soll ich denn da einsetzen, wenn ich den Kontruktor der Klasse in einer anderen Klasse brauche?
#Edit: Mit new Foo() ?
Ich habe jetzt einen Beitrag dazu in Google gefunden. Hab es alllerdings nur halb verstanden. Es gibt wohl irgendwie 3 Möglichkeiten dazu(?), also irgendwas mit Interfaces und noch 2 andere, 1 wharsxheinlich dann die, die dur mir hier gezeigt hast.
ich glaube du hast da ein paar zentrale Konzepte noch nicht verstanden. Woran das genau liegt kann man noch nicht ganz genau sagen. Ich versuche einmal einen kleinen Grundbedarf an Begriffen und Funktionalitäten zu decken:
Deklarierung
Java:
Object someObject;
Initialisierung
Code:
someObject = new Object();
Der Zugriff auf eine Instanz der Klasse Object
Code:
String hashCode = someObject.hashCode();
Erst nachdem du ein Object initialisiert hast kannst du es in dem Sinne auch verwenden. Versuchst du, auf eine nicht initialisierte Variable zuzugreifen bekommst du eine NullPointerException. Was würdest du tun, wenn jemand sagt: "Hüpf!"? Bist du gemeint? Vielleicht meinte man auch jemand anderen?
Und ich brauche aber den Parameter? Was soll ich denn da einsetzen, wenn ich den Kontruktor der Klasse in einer anderen Klasse brauche?
#Edit: Mit new Foo() ?
Ich habe jetzt einen Beitrag dazu in Google gefunden. Hab es alllerdings nur halb verstanden. Es gibt wohl irgendwie 3 Möglichkeiten dazu(?), also irgendwas mit Interfaces und noch 2 andere, 1 wharsxheinlich dann die, die dur mir hier gezeigt hast.
Ich kann leider nur raten, was du mir damit sagen oder was du mich fragen willst. Du hast oben bereits ein kleines Beispiel bekommen, wie es aussehen kann. Danke dafür @Robat. Egal wie du es angehst, ob Dependency Injection, ganz egal, ein Code wie
ist keine Initialisierung und die Variable 'test' verweist nach dieser Anweisung noch auf keine Instanz der Klasse 'TestKlasse'. Es wäre toll, wenn du erklären würdest, auf was du dich mit
Im Grunde macht DI auch nichts anderes als ein Singleton zu definieren, sofern man den standard scope belässt und nicht auf "prototype" umschaltet.
----
Aber mich persönlich würde es interessieren, warum man das Pattern vermeiden sollte, habe ich jetzt zum ersten Mal gehört. Falls es hier in diesem Thread unpassend ist, schreibe mir mal bitte eine PN.
Im Grunde macht DI auch nichts anderes als ein Singleton zu definieren, sofern man den standard scope belässt und nicht auf "prototype" umschaltet.
----
Aber mich persönlich würde es interessieren, warum man das Pattern vermeiden sollte, habe ich jetzt zum ersten Mal gehört. Falls es hier in diesem Thread unpassend ist, schreibe mir mal bitte eine PN.
DI kennt keinen Scope Das ist nur eine Umsetzung dieses Patterns.
Verpönt ist das Singleton-Pattern, nicht, dass es einzelne Instanzen einer Klasse gibt.
Die Klasse selbst besorgt sich beim Singleton-Pattern ihr Abhängigkeiten selbst über meist statische Methoden, und nach außen hin ist nicht sichtbar, welche Abhängigkeiten überhaut benötigt wird.
Dadurch hat man als "Client" kaum Möglichkeit, die Abhängigkeiten zu tauschen und schränkt sich zB bei der Testbarkeit massiv ein.
Bei DI hat man einerseits ganz explizite Abhängigkeiten, und andererseits kann man die Implementierungen beliebig austauschen, zB mit einer gemockten Instanz
Database shopData = Database.getInstance(); funktioniert ohnehin irgendwie nicht... der Fehler gibt Pries, dass die Methode getInstance(); nicht in der Klasse Database vorhanden ist. Somit muss ich eigentlich mit DI arbeiten. Ich habs jetzt so probiert:
Java:
privateDatabase shopData;publicCookieShop(Database shopData){this.shopData = shopData;}//Und in der Klasse in der CookieShop aufgrerufen wird:this.cookieShop =newCookieShop(newDatabase());//Das hier im Konstruktor
Java:
privateDatabase shopData;publicCookieShop(Database shopData){this.shopData = shopData;}//Und in der Klasse in der CookieShop aufgrerufen wird:this.cookieShop =newCookieShop(newDatabase());//Das hier im Konstruktor
Database shopData = Database.getInstance(); funktioniert ohnehin irgendwie nicht... der Fehler gibt Pries, dass die Methode getInstance(); nicht in der Klasse Database vorhanden ist
Ich habe keine Ahnung was in so eine get Instance methode reinmuss... Wenn ichs wüsste wäre ich bestimmt schon drauf gekommen. (Oder vielleicht auch nicht)
Deine Klasse muss ein wenig verändert werden, sie braucht eine Methode mit getInstance(), die eine Instanz der Klasse zurück gibt, sofern es bereits eine gibt - ansonsten eine neue Instanz erstellen...
Ok, danke. Mit getInctance() die Inztanz zu holen macht echt keinen Sinn. Wie mache ich dass nun mit DI? @Robat 's Vorlschlag enötigt einen Parameter im Konstruktor der Klasse, in dem man eine Inztanz einer anderen Klasse haben möchte. Das will ich eigentlich nicht, da ich eigentlich auch nicht so genau weiß, wass ich später als Parameter benutzen soll. Bei Google verstehe ich das Prinzig von DI auch nicht komplett. Kann mir vielleicht jemand noch eine guten Link schicken, der zu meinem Thema passt, oder mich ein wenig aufklären?
Hier nochmal ein paar relevante Informationen:
Java:
//Von dierser Klasse will ich eine Inztanz in der Folgenden Klasse haben. Allerdings soll durch das Erstellen der Inztanz nicht diese Klasse aufgerufen werden.publicclassDatabase{publicDatabase;}
Java:
publicclassCookieShop{//Die Klasse, in der ich eine Inztanz von Database haben will.privateDatabase shopData;// Das hier geht nicht, weil die Variable nicht mit null initialisiert sein darfpublicCookieShop(){//hier irgendwelche anderen Methoden, welche durch den Kontruktor in der Hauptklasse aufgerufen werden.}}
Dann solltest du dich erstmal hinsetzen und dir mit Blatt und Papier die Abhängigkeiten der einzelnen Klassen aufmalen / dir überlegen. Hier jetzt zu raten um am Ende doch die falsche Lösung zu nennen ist nicht im Sinne des Erfinders. Überleg dir in welchen Klassen du welche Objekte brauchst und wie die dein Projekt gescheit strukturierst - dann fällt sowas auch wesentlich leichter.
Dann solltest du dich erstmal hinsetzen und dir mit Blatt und Papier die Abhängigkeiten der einzelnen Klassen aufmalen / dir überlegen. Hier jetzt zu raten um am Ende doch die falsche Lösung zu nennen ist nicht im Sinne des Erfinders. Überleg dir in welchen Klassen du welche Objekte brauchst und wie die dein Projekt gescheit strukturierst - dann fällt sowas auch wesentlich leichter.
Ich weiß wie ich mein Projekt strukturieren muss und welche Klassen/Objekte ich brauche. Der letzte Schritt zu fertigstellen meines Programms ist eigentlich nur noch die Inztanz der Database-Kalsse zu bekommen ohne dass die Klasse damit aufgerufen wird.
Dann musst du eine bereits existierende Instanz an die Klasse, die die Instanz benötigt, übergeben. Gibt es eine Klasse wo du eine Instanz von Database und CookieShop anlegst?
Dann musst du eine bereits existierende Instanz an die Klasse, die die Instanz benötigt, übergeben. Gibt es eine Klasse wo du eine Instanz von Database und CookieShop anlegst?
Ja in der GUI-Main-Klasse. Aber um die getter davon zu bekommen brauche ich auch erstmal die Inztanz dieser GUI-Klasse.(Also es führ kein Weg dran vorbei) Oder gibts da eine andere Möglichkeit? Wäre jetzt so meine Idee.
Oh ja es hat geklappt, ich hab es mal mit new Database probiert gehabt. Das hatte nicht geklappt. Danke.
Und wenn ich jetzt eine Inztanz der Main in der CookieShop-Klasse brauche, was muss ich da machen? Da kann ich ja schlecht das gleiche machen, da sonst die Main in der Shop-Klasse aufgerufen wird. Oder kann ich in der Main einfach eine Inztanz der Main erstellen, ohne dass die Main dann doppelt aufgerufen wird.