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)
 

Flown

Administrator
Mitarbeiter
Sagt doch schon alles aus: Dein stmt is null

Dir fehlt noch sowas wie:

Java:
stmt = connect.createStatement();
 

Joose

Top Contributor
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

Mitglied
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

Mitglied
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
 

Joose

Top Contributor
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)
 

IceDragon208

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

Joose

Top Contributor
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 "=".
 

VfL_Freak

Top Contributor
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:

IceDragon208

Mitglied
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

Top Contributor
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:

Ähnliche Java Themen


Oben