# Nullpointer bei einfacher Daba query



## IceDragon208 (30. Jul 2014)

Guten Tag, ich habe eine vll. simple Frage.
Allerdings komme ich gerade selbst nicht dahinter.

Ich möchte eine einfache Datenbankabfrage machen.
Wenn ich diese ohne Java direkt über das MyAdmin Tool mache bekomme ich einen richtigen wert raus.
Die Abfrage sollte also eig. passen?

Erkennt jemand vll. den Fehler?


```
private static Connection connect = null;
	private static Statement stmt = null;
	private static ResultSet result = null;
	private int devId = 0;
	
	public int lastDevice() throws SQLException, ClassNotFoundException	
	{
		try
		{
				try
				{		  
					Class.forName("com.mysql.jdbc.Driver");
					connect = DriverManager.getConnection("jdbc:mysql://localhost/dabav2?user=XXXX&password=YYYYY");
				}catch ( SQLException e ){e.printStackTrace();}
				
				result = stmt.executeQuery("SELECT MAX(device_id) FROM device");
				if(result.next())
					devId = result.getInt(1);
				else 
					devId = 0;
		}
		finally
		{
			try { 
				if (connect != null) { connect.close(); }
				if (stmt != null) { stmt.close(); }
			} catch ( SQLException e ) { e.printStackTrace(); }
		}
```

Fehlermeldung zeigt eclipse bei 
result = stmt.executeQuery("SELECT MAX(device_id) FROM device");
an mit dem Text:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Model.pkd_parts.dabaQuery.OtherQuerys.lastDevice(OtherQuerys.java:29)
	at controller.Controller$toWorkSteps.actionPerformed(Controller.java:303)


----------



## Flown (30. Jul 2014)

Sagt doch schon alles aus: Dein stmt is null

Dir fehlt noch sowas wie:


```
stmt = connect.createStatement();
```


----------



## IceDragon208 (30. Jul 2014)

Ach klar, stimmt wieso hab ich das übersehen .
Und schon geht es.
Tut mir leid für die unnütze Frage.


----------



## Joose (30. Jul 2014)

IceDragon208 hat gesagt.:


> Ach klar, stimmt wieso hab ich das übersehen .
> ....



Auch wenn die Lösung schon klar ist:

Selber alles ausprobiert um den Fehler zu suchen =>
Konsolenausgaben/Logausgaben eingebaut und kontrolliert?
Alle "Objekte" in betroffener Zeile kontrolliert?
Debugger angeworfen?

Wenn man diese Fragen wenigstens mit "JA" beantworten kann, dann ist die Frage nicht unnütz 
Davor schon, da sich die meisten Fehler so von selbst finden lassen.


----------



## IceDragon208 (30. Jul 2014)

Naja den Debugger hätte ich noch zum Einsatz bringen können das stimmt.
Den Rest hatte ich kontrolliert und war daher auch irgendwie verwirrt wieso es nicht geht genau an der Stelle. Und irgendwie die Zeile übersehen bei all meinen anderen Query's hab ichs.


----------



## IceDragon208 (30. Jul 2014)

Guten Tag,
heute scheine ich schon etwas arg auf der Leitung zu stehen.
Habe noch ein Problem, wollte aber nicht gleich ein neues Thema dazu eröffnen.
Hoffe das ist i.O. und Ok so.

Ich habe eine Datenbankabfrage in der ich schaue ob ein bestimmtes "device" mit einem bestimmten Namen vorhanden ist.
Auch hier funktioniert die Eingabe direkt in das SQl Tool ohne Probleme.
Beim Ausführen im Java Programm bekomme ich aber eine Sytax Fehlermeldung.
Woran kann das liegen?

createstatement usw. sind deklariert diesesmal. Es erfolgen auch zuvor 4 andere Daba Abfragen

```
String[] inc = incD.split(Pattern.quote(".-."));
for(int k = 2; k < inc.length; k++)
{	
          result = stmt.executeQuery("SELECT device_name, device_Number FROM device"
          + "where device_Number like '"+ inc[k] +"'");
					
          if(result.next() == false){
                  ...
           }
       ...
 }
```

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: 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 'like 'Dev1WP22'' at line 1


----------



## Joose (30. Jul 2014)

IceDragon208 hat gesagt.:


> Habe noch ein Problem, wollte aber nicht gleich ein neues Thema dazu eröffnen.
> Hoffe das ist i.O. und Ok so.



Naja wenn es wieder mit einer NullPointerException zu tun hätte dann passt es.
Da es sich um einen SQL Syntaxfehler handelt wäre ein neuer Thread besser gewesen -> Suche/Google finde es leichter.
Beim nächsten mal dann 




IceDragon208 hat gesagt.:


> Beim Ausführen im Java Programm bekomme ich aber eine Sytax Fehlermeldung.
> 
> ```
> result = stmt.executeQuery("SELECT device_name, device_Number FROM device"
> ...



Probiere statt den einfachen 
	
	
	
	





```
'
```
 einfach doppelte 
	
	
	
	





```
"
```
 im Statement! (escapen nicht vergessen)


----------



## IceDragon208 (30. Jul 2014)

Ok.
Dann beim nächsten mal. Tut mir leid.

hatte es Anfangs so:

```
result = stmt.executeQuery("SELECT device_name, device_Number FROM device"          
+ "where device_Number like \""+ inc[k] +"\"");
```

War aber der gleiche Fehler.


----------



## Joose (30. Jul 2014)

IceDragon208 hat gesagt.:


> ```
> result = stmt.executeQuery("SELECT device_name, device_Number FROM device"
> + "where device_Number like \""+ inc[k] +"\"");
> ```
> ...



Warum schreibst du dieses Statement aufgeteilt auf 2 Zeilen? 
Mir fällt auf dass zwischen "device" und "where" kein Abstand ist. 
Ansonsten warum verwendest du "LIKE"? Verwende einfach "=".


----------



## VfL_Freak (30. Jul 2014)

Moin,



IceDragon208 hat gesagt.:


> ```
> result = stmt.executeQuery("SELECT device_name, device_Number FROM device"
> + "where device_Number like '"+ inc[k] +"'");
> ```
> com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: 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 'like 'Dev1WP22'' at line 1


Von allem anderen mal abgesehen: das Problem ist hier nur das fehlende Leerzeichen, so dass die fertige Abfrage so aussieht:
"[.....] FROM *devicewhere* device_Number like [.....]"
und das ist nun mal keine SQL-Syntax !!

Also immer schön Obacht bei Zeilenumbrüchen!

Gruß
Klaus


----------



## dzim (30. Jul 2014)

Warum kein PreparedStatement? Nur mal so am Rande gefragt...


----------



## IceDragon208 (31. Jul 2014)

Joose hat gesagt.:


> Warum schreibst du dieses Statement aufgeteilt auf 2 Zeilen?
> Mir fällt auf dass zwischen "device" und "where" kein Abstand ist.
> Ansonsten warum verwendest du "LIKE"? Verwende einfach "=".



Ja es war das Leerzeichen, ich hoffe mir passieren heute nicht derartige Leichtsinnsfehler.
Zeilenumbrüche mache ich hauptsächlich wegen der Übersicht da mein Bildschirm nicht gerade die größte Auflösung hat.
Und ich verwende Like weil ich dachte ich hätte mal gelesen das es zum vergleichen von Zeichenketten besser ist. Stimmt das nicht?

Wäre es besser ein PreparedStatment zu verwenden?


----------



## dzim (31. Jul 2014)

PreparedStatement ist sinnvoll, wenn du die selbe Anfrage mehrfach stellst, aber auch so bringt es vor allem die Sicherheit, das die gesuchten Parameter richtig übergeben werden. Statt wie du konkrete Werte einzufügen, wird ein Fragezeichen als Platzhalter verwendet und dann später [c]#setInt(int parameterIndex, int value)[/c] aufgerufen (im Gegensatz zu vielen anderen Java-Indizes, beginnt es hier bei 1 und nicht bei 0).

Beispiel:

```
// vorbereitung
Connection conn= ...;

PreparedStatement stmt = conn.prepareStatement("SELECT device_name, device_Number FROM device WHERE device_Number LIKE ?");

// in der Schleife, in der "k" bestimmt wird... falls das eine Schleife ist...
stmt.setInt(1, inc[k]);
ResultSet rs = stmt.executeQuery();

while (rs.next()) {
    ....
}
```


----------

