# CommunicationLinkError - NullPointer Exception



## MurderItachi (10. Dez 2015)

Hey Leute, bin gerade dabei ein SQl Insert Statement zu machen, doch Irgendwas ach ich falsch. Muss ich die Serveradresse umformulieren?


```
package test;

import java.sql.BatchUpdateException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import com.mysql.jdbc.PreparedStatement;

public class test1 {
    public String scan_result= "haus";
    public String price="maus";
       public static String url= "jdbc:mysql://sql4.freesqldatabase.com:3306";
        public static String user= "******";
        public static String pw="******";

        public static String scan_rs;
        public static String price_rs;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Connection con = null;     
         try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                // Bl�d: Treiber konnte nicht geladen werden.
                e.printStackTrace();
            }
            try {
                con = DriverManager.getConnection(url, user, pw);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                // create a Statement from the connection
            //    Statement statement = con.createStatement();

                // insert the data
                //statement.executeUpdate("INSERT INTO barcode VALUES (13846, 12,23)");
         
               //("INSERT INTO barcode VALUES (" +"'"+ scan_rs + "'" + ", " + "'" + price_rs + "'" + ")");
           
                PreparedStatement stmt = (PreparedStatement) con.prepareStatement("INSERT INTO table_name(email, pass) VALUES (?, ?)");
                stmt.setString(1, scan_rs);
                stmt.setString(2, price_rs);
                stmt.executeUpdate();
            } catch (SQLException e) { System.out.println("fehler2");}

            try
            {
                con.close();
            }
            catch(SQLException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
}
```


----------



## InfectedBytes (10. Dez 2015)

du oder ein Mod sollte dringend deinen Post bearbeiten und deine Login Daten entfernen.


----------



## kneitzel (11. Dez 2015)

Die Punkte, die ich sehe:
a) Wie schon gesagt sollte man User / Passwort nicht mit posten
b) Wieso man Text als Bild (in diesem Fall den Fehler) hochlädt und dabei dann wichtige Dinge abschneidet kann ich nicht verstehen. Da sieht man eine Fehlerbeschreibung und schneidet die ab ... "Can't get" was? Da steht ja, was er nicht hat und was ihm fehlt.
c) Was mir im Code aufgefallen ist: Du gibst keinerlei Datenbank an. Das würde ich normalerweise erwarten. Also noch ein /Datenbankname an die URL ran. (Ist nicht zwingend erforderlich, aber evtl. ist dies ja schon die Lösung.

Konrad


----------



## MurderItachi (11. Dez 2015)

Can't get hostname, mein Bildschirm war nicht breit genug...


----------



## MurderItachi (11. Dez 2015)

Also das verbinduungsproblem lag an dem Fehlenden Datenbanknamen.Den hab ich jetzt Ergänzt. Jetzt spuckt er mir in der Konsole fehler2 aus, was bedeutet, dass im Statement etwas falsch sein muss. Sieht da jemand was?


----------



## kneitzel (11. Dez 2015)

Wenn Du uns noch die Fehler wissen lassen würdest. Das würde uns das Leben sehr erleichtern und wir müssten nicht unsere Glaskugeln bemühen.

Konrad


----------



## kneitzel (11. Dez 2015)

Ach ja - scan_rs und price_rs werden von Dir nicht gesetzt und sind daher null! Das könnte ein Problem sein je nachdem, wie die Tabelle aufgebaut wurde.

Konrad


----------



## MurderItachi (11. Dez 2015)

Das habe ich bereits getan, es kommt immer noch fehler2. Das wird geworfen durch den Try/catch Block vom Statement.


----------



## MurderItachi (11. Dez 2015)

Ok es Funktioniert, hatte vergessen im Statement den Tabellen Namen anzugeben. Danke fürr eure Hilfe


----------



## kneitzel (11. Dez 2015)

Super, dass es jetzt funktioniert.

Aber ein paar Punkte möchte ich noch erwähnen:
Das Passwort von Deinem User hast Du hoffentlich bereits geändert? Zumindest den Code scheinst Du noch nicht geändert zu haben!

Und da ich es in Deinen Kommentaren gesehen habe: NIEMALS baut man ein SQL Befehl über das Zusammenfügen von Strings auf. Das ist ein absolutes NO GO.
- Wenn der User Einfluss auf den Inhalt der Variablen hat, sind ggf. SQL Injection Angriffe möglich.
- Es kann zu Problemen bei der Übertragung der Daten geben. So ist z.B. nicht eindeutig, was für ein Wert die folgende Zeichenkette hat: 1,234. (Je nach Einstellung der Datenbank könnte die Datenbank in dem , entweder den Trenner für die Nachkommastellen sehen oder eben ein Tausender-Trennzeichen.) Bei der Übermittlung von anderen Datentypen ist es noch viel kritischer wie z.B. von einem Datum.
==> Also immer so wie Du es gemacht hast mit dem PreparedStatement! 
- Und bei catch: Nimm da immer etwas sinnvolles rein. Leere Catch Blöcke oder ein "println("Fehler2")" sind nichts sinnvolles. Also wenigstens ein e.printStackTrace(); sollte doch immer drin sein. Von dieser Regel mag es auch durchaus Ausnahmen geben, aber diese sind wirklich sehr selten. In diesem Fall hat es wohl dafür gesorgt, dass Du keine aussagekräftige Fehlermeldung hattest.

Konrad


----------



## MurderItachi (11. Dez 2015)

Danke für deine Tipps, bei dem Passwort hab ich gestern nicht geschaltet, dummer rookie Fehler. Ist geändert. den Stacktrace print mach ich noch dazu.


----------



## Joose (11. Dez 2015)

MurderItachi hat gesagt.:


> ....., doch Irgendwas ach ich falsch.



Beim nächsten mal bitte einen sprechenden Threadtitel wählen.
Damit man anhand des Titel schon erkennen kann um welches Thema es sich dreht, danke!

EDIT: Username & Password habe ich ersetzt


----------

