Nullpointer bei einfacher Daba query

IceDragon208

Mitglied
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?

Java:
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)
 
Sagt doch schon alles aus: Dein stmt is null

Dir fehlt noch sowas wie:

Java:
stmt = connect.createStatement();
 
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.
 
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. 🙁
 
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
Java:
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
 
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 😉


Beim Ausführen im Java Programm bekomme ich aber eine Sytax Fehlermeldung.
Java:
          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

Probiere statt den einfachen
Code:
'
einfach doppelte
Code:
"
im Statement! (escapen nicht vergessen)
 
Ok.
Dann beim nächsten mal. Tut mir leid.

hatte es Anfangs so:
Java:
result = stmt.executeQuery("SELECT device_name, device_Number FROM device"          
+ "where device_Number like \""+ inc[k] +"\"");

War aber der gleiche Fehler.
 
Java:
result = stmt.executeQuery("SELECT device_name, device_Number FROM device"          
+ "where device_Number like \""+ inc[k] +"\"");

War aber der gleiche Fehler.

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 "=".
 
Moin,

Java:
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
 
Zuletzt bearbeitet:
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?
 
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:
Java:
// 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()) {
    ....
}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben