# Abfrageergebnis richtig, trotzdem Fehlermeldung



## cam (11. Aug 2009)

Hallo,

in folgendem Codeabschnitt frage ich die Login-Daten ab. Das funktioniert auch soweit ganz gut, nur wird dann die Login-Maske nicht unsichtbar gesetzt und die nächste sichtbar und es kommt eine Fehlermeldung, dass die Verbindung fehlgeschlagen ist.

Code:

```
/**
 * Lokale Klasse für Button-Events
 */
class EvtListenerAction implements ActionListener{

   //Event-Handler
   public void actionPerformed(ActionEvent event) {
	int count = 0; //nach 3. Versuch wird die Applikation geschlossen
	//Button Anmelden
	if(event.getActionCommand().equals(ANMELDEN_LABEL)){
		//Benutzername auslesen und testen
		String benName1;
		benName1 = txtBenName1.getText();
		benName1 = benName1.trim();
		System.out.println(benName1);
				
		try{
    			PreparedStatement stmBenName1 = (PreparedStatement) cn.prepareStatement
                                                                         ("SELECT nutz_name FROM nutzer WHERE nutz_name = ?");
    			stmBenName1.setString(1, benName1);
    			rs = stmBenName1.executeQuery();
    			if (!rs.next()) {
    				if(count < 2){
    					System.out.println("Falscher Benutzername");
    					txtBenName1.setText(null);
    					txtPass1.setText(null);
    					count++;
    				}
    				else{
    					//Message.login(); 
    				}
			}
		}catch(Exception ex){
			System.out.println("Keine Verbindung (login-user): " + ex);
			ex.printStackTrace();
		}
				
		//Passwort auslesen und testen
		String pass1;
		pass1 = txtPass1.getText();
		pass1 = pass1.trim();
		System.out.println(pass1);
				
    		try{
    			CallableStatement callPasswortEntschl = cn.prepareCall("{call PasswortEntschl(?, ?)}");
    			callPasswortEntschl.setString(1, benName1);
    			callPasswortEntschl.registerOutParameter(2, Types.VARCHAR);
    			callPasswortEntschl.execute();
    			String passw1 = callPasswortEntschl.getString(2);
    			passw1 = passw1.trim();
    			System.out.println(passw1);
    			if(count < 2){
   				if(passw1.equals(pass1)){ 
  				        System.out.println("Richtiges Passwort");
   					txtBenName1.setText(null);
   					txtPass1.setText(null);
   					login.setVisible(false);
   					start1.setVisible(true);
   				}
   				else{
   					System.out.println("Falsches Passwort");
   					txtBenName1.setText(null);
   					txtPass1.setText(null);
   					count++;
   				}
    			}
    			else{
    				//Message.login(); 
    			}    				
    		}catch(Exception ex){
    			System.out.println("Keine Verbindung (login-password): " + ex);
			ex.printStackTrace();
    		}
	}
        ...
}
```

Fehler:

Verbindung hergestellt.
Demo
java.lang.NullPointerException
	at main.Main$EvtListenerAction.actionPerformed(Main.java:270)
	at java.awt.Button.processActionEvent(Unknown Source)
	at java.awt.Button.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(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)
demo
demo
Richtiges Passwort
Keine Verbindung (login-password): java.lang.NullPointerException


----------



## SlaterB (11. Aug 2009)

welche Zeile ist denn 270?
nach
>   System.out.println("Richtiges Passwort");
kommen ja noch diverse Codezeilen,

> txtBenName1.setText(null);
>                    txtPass1.setText(null);
>                   login.setVisible(false);
>                    start1.setVisible(true);

usw.,
wenn davon was null ist -> schon ne NullPointerException

> und es kommt eine Fehlermeldung, dass die Verbindung fehlgeschlagen ist.

es kommt irgendeine Exception, nur deine Ausgabe behautet dann, dass 'die Verbindung fehlgeschlagen ist'


----------



## cam (11. Aug 2009)

Zeile 270: login.setVisible(false);


----------



## SlaterB (11. Aug 2009)

login ist null


----------



## cam (11. Aug 2009)

Ich verstehe aber nicht warum.
Ich habe login doch public deklariert und in der main-Methode funktioniert auch alles, aber nicht mehr im ActionListener.


----------



## SlaterB (11. Aug 2009)

ich kann mitfühlen, aber ohne Code den Fehler nicht erkennen 

andere Objekte, andere Variablen, wieder auf null gesetzt, nie initialisiert sondern nur mit einer lokalen Variable gearbeitet,
vieles möglich


----------



## cam (11. Aug 2009)

```
package main;

import java.awt.*;
import java.awt.event.*;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Types;

public class Main extends Frame{
	
	public static final Color	COLOR_BACKGROUND_LOGIN	= new java.awt.Color(218, 218, 218);
	public static final Color 	COLOR_BACKGROUND_MASK	= new java.awt.Color(255, 255, 196);
	public static final Color	COLOR_BACKGROUND_RUECK	= new java.awt.Color(217, 255, 255);

	public static final int		DLG_WIDTH_LOGIN			= 319;	//Login-Breite
	public static final int		DLG_HEIGHT_LOGIN		= 169;	//Login-Höhe
	
	public static final int		DLG_WIDTH_MASK			= 290;	//Masken-Breite
	public static final int		DLG_HEIGHT_MASK			= 210;	//Masken-Höhe
	
	public static final int		DLG_X_MARGIN			= 6;	//Rand links/rechts
	public static final int		DLG_X_MARGIN_START1		= 50;	//Rand links/rechts - Hauptmenü
	public static final int		DLG_Y_MARGIN			= 8;	//Rand oben/unten
	public static final int		DLG_ITEM_PADDING		= 4;	//Zwischenraum
	public static final int		DLG_ITEM_PADDING_LOGIN	= 10;	//Zwischenraum Login
	public static final int		DLG_ITEM_HEIGHT			= 20;	//Item-Höhe
	public static final int     DLG_LABEL_WIDTH         = 200;  // Label-Breite
	
	public static Frame			login;
	public static Frame			start1;
	
	public static final String	ANMELDEN_LABEL			= "Anmelden";
	public static final String	ABBRECHEN_LABEL			= "Abbrechen";
	
	//Datenbankverbindung
	public static Connection 	cn 						= null;
	public static Statement 	st 						= null;
	public static ResultSet 	rs 						= null;
	
	//Event-Handler
	private EvtListenerWindow	EvtHandlerWindow		= new EvtListenerWindow();
	private EvtListenerAction	EvtHandlerAction		= new EvtListenerAction();
	
	//Layout-Komponenten
	//Login
	private Label			lBenName1		= new Label("Benutzername");
	private TextField		txtBenName1		= new TextField();
	private Label			lPass1			= new Label("Passwort");
	private TextField 		txtPass1		= new TextField();	
	private Button			btAnmelden		= new Button(ANMELDEN_LABEL);
	private Button			btAbbrechen		= new Button(ABBRECHEN_LABEL);
	
	//start1 - Hauptmenü
	private Label			lNeuEinlagern	= new Label("F1 - Neu Einlagern");
	private Label			lWiederEinlagern= new Label("F2 - Wieder Einlagern");
	private Label			lMaterialanf	= new Label("F3 - Materialanforerung");
	private Label			lAuslagern		= new Label("F4 - Auslagern");
	private Label			lBenAbmelden	= new Label("F5 - Benutzer abmelden");
	private Label			lBeenden		= new Label("F6 - Programm beenden");
	
	/**
	 * Konstruktor
	 */
	public Main(String title) throws Exception{
		//Basisklasse initialisieren
		super(title);
		//Event-Handler registrieren
		addWindowListener(EvtHandlerWindow);
		btAnmelden.addActionListener(EvtHandlerAction);
		btAbbrechen.addActionListener(EvtHandlerAction);
		//Focus setzen
		txtBenName1.requestFocus();
	}

	public static void main(String[] args) throws Exception{
		
		//Datenbankverbindung aufbauen
		try{
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			cn = DriverManager.getConnection("jdbc:sqlserver://192.168.5.99; databaseName = db; user = xyz; password = abc");
			st = cn.createStatement();			
			System.out.println("Verbindung hergestellt.");
		}catch(Exception ex){
			System.out.println("Keine Verbindung hergestellt: " + ex);
			ex.printStackTrace();
		}
		
		Dimension 	ParentFrame;
		Dimension 	MyFrame;
		Insets		MyInsets;
		int			xOffset, yOffset;
		int			LineHeight;
		
		//Runtime-Objekt erzeugen
		Main login = new Main("Login");
		Main start1 = new Main("Hauptmenü");
	
		//Bildschirmgröße erfragen
		ParentFrame = Toolkit.getDefaultToolkit().getScreenSize();
		
		//Login
		//Höhe einer Zeile
		LineHeight = DLG_ITEM_HEIGHT + DLG_ITEM_PADDING_LOGIN;
		//Maskengröße
		MyFrame = new Dimension(DLG_WIDTH_LOGIN, DLG_HEIGHT_LOGIN);
		//Hintergrundfarbe
		login.setBackground(COLOR_BACKGROUND_LOGIN);
		//freies Layout setzen
		login.setLayout(null);
		//Position und Größe des Login-Fensters setzen
		login.setBounds((ParentFrame.width - MyFrame.width) / 2, (ParentFrame.height - MyFrame.height) / 2, MyFrame.width, MyFrame.height);
		//Maske nicht größenveränderbar
		login.setResizable(false);
		//Fenster sichtbar
		login.setVisible(true);
		//Erfrage die Abmessungen vom Dialog-Rand und Titelbalken
		MyInsets = login.getInsets();
		//Komponenten hinzufügen
		//Offset links
		xOffset = MyInsets.left + DLG_X_MARGIN;
		//Offset oben
		yOffset = MyInsets.top + 2 * DLG_Y_MARGIN;
		//Benutzername
		login.lBenName1.setBounds(xOffset, yOffset, 90, DLG_ITEM_HEIGHT);
		login.add(login.lBenName1);
		login.txtBenName1.setBounds(xOffset + 90 + DLG_ITEM_PADDING_LOGIN, yOffset, 200, DLG_ITEM_HEIGHT);
		login.add(login.txtBenName1);
		//Passwort
		yOffset += LineHeight;
		login.lPass1.setBounds(xOffset, yOffset, 90, DLG_ITEM_HEIGHT);
		login.add(login.lPass1);
		login.txtPass1.setBounds(xOffset + 90 + DLG_ITEM_PADDING_LOGIN, yOffset, 200, DLG_ITEM_HEIGHT);
		login.txtPass1.setEchoChar('*'); //eingegebene Zeichen werden als "*" angezeigt
		login.add(login.txtPass1);
		//Buttons
		xOffset += 60;
		yOffset += 60;
		login.btAnmelden.setBounds(xOffset, yOffset, 80, 25);
		login.add(login.btAnmelden);
		login.btAbbrechen.setBounds(xOffset + 80 + 30, yOffset, 80, 25);
		login.add(login.btAbbrechen);
		
		//start1 - Hauptmenü
		LineHeight = DLG_ITEM_HEIGHT + DLG_ITEM_PADDING;
		MyFrame = new Dimension(DLG_WIDTH_MASK, DLG_HEIGHT_MASK);
		start1.setBackground(COLOR_BACKGROUND_MASK);
		start1.setLayout(null);
		start1.setBounds((ParentFrame.width - MyFrame.width) / 2, (ParentFrame.height - MyFrame.height) / 2, MyFrame.width, MyFrame.height);
		start1.setResizable(false);
		start1.setVisible(false);
		MyInsets = start1.getInsets();
		xOffset = MyInsets.left + DLG_X_MARGIN_START1	;
		yOffset = MyInsets.top + 2 * DLG_Y_MARGIN;
		start1.lNeuEinlagern.setBounds(xOffset, yOffset, DLG_LABEL_WIDTH, DLG_ITEM_HEIGHT);
		start1.add(start1.lNeuEinlagern);
		yOffset += LineHeight;
		start1.lWiederEinlagern.setBounds(xOffset, yOffset, DLG_LABEL_WIDTH, DLG_ITEM_HEIGHT);
		start1.add(start1.lWiederEinlagern);
		yOffset += LineHeight;
		start1.lMaterialanf.setBounds(xOffset, yOffset, DLG_LABEL_WIDTH, DLG_ITEM_HEIGHT);
		start1.add(start1.lMaterialanf);
		yOffset += LineHeight;
		start1.lAuslagern.setBounds(xOffset, yOffset, DLG_LABEL_WIDTH, DLG_ITEM_HEIGHT);
		start1.add(start1.lAuslagern);
		yOffset += LineHeight;
		start1.lBenAbmelden.setBounds(xOffset, yOffset, DLG_LABEL_WIDTH, DLG_ITEM_HEIGHT);
		start1.add(start1.lBenAbmelden);
		yOffset += 35;
		start1.lBeenden.setBounds(xOffset, yOffset, DLG_LABEL_WIDTH, DLG_ITEM_HEIGHT);
		start1.add(start1.lBeenden);
	}
	
	/**
	 * Beenden der Applikation
	 */
	private void Shutdown(){
		//Fenster verdecken
		setVisible(false);
		//Resourcen freigeben
		dispose();
		//Beenden
		System.exit(0);
	}

	/**
	 * Lokale Klasse für Window-Events
	 */
	class EvtListenerWindow extends WindowAdapter{
		/**
		 * Handler für Close-Event
		 */
		public void windowClosing(WindowEvent event){
			Shutdown();
		}
	}
	
	/**
	 * Lokale Klasse für Button-Events
	 */
	class EvtListenerAction implements ActionListener{

		//Event-Handler
		public void actionPerformed(ActionEvent event) {
			int count = 0; //nach 3. Versuch wird die Applikation geschlossen
			//Button Anmelden
			if(event.getActionCommand().equals(ANMELDEN_LABEL)){
				//Benutzername auslesen und testen
				String benName1;
				benName1 = txtBenName1.getText();
				benName1 = benName1.trim();
				System.out.println(benName1);
				
				try{
    				PreparedStatement stmBenName1 = (PreparedStatement) cn.prepareStatement("SELECT nutz_name FROM nutzer WHERE nutz_name = ?");
    				stmBenName1.setString(1, benName1);
    				rs = stmBenName1.executeQuery();
    				if (!rs.next()) {
    					if(count < 2){
    						System.out.println("Falscher Benutzername");
    						//Message.loginBen(); 
    						txtBenName1.setText(null);
    						txtPass1.setText(null);
    						count++;
    					}
    					else{
    						//Message.login();
    					}
					}
				}catch(Exception ex){
					System.out.println("Keine Verbindung (login-user): " + ex);
					ex.printStackTrace();
				}
				
				//Passwort auslesen und testen
				String pass1;
				pass1 = txtPass1.getText();
				pass1 = pass1.trim();
				System.out.println(pass1);
				
    			try{
    				CallableStatement callPasswortEntschl = cn.prepareCall("{call PasswortEntschl(?, ?)}");
    				callPasswortEntschl.setString(1, benName1);
    				callPasswortEntschl.registerOutParameter(2, Types.VARCHAR);
    				callPasswortEntschl.execute();
    				String passw1 = callPasswortEntschl.getString(2);
    				passw1 = passw1.trim();
    				System.out.println(passw1);
    				if(count < 2){
   						if(passw1.equals(pass1)){ 
  							System.out.println("Richtiges Passwort");
   							txtBenName1.setText(null);
   							txtPass1.setText(null);
   							login.setVisible(false);
   							start1.setVisible(true);
   						}
   						else{
   							System.out.println("Falsches Passwort");
   							//Message.loginPass(); 
   							txtBenName1.setText(null);
   							txtPass1.setText(null);
   							count++;
   						}
    				}
    				else{
    					//Message.login(); 
    				}    				
    			}catch(Exception ex){
    				System.out.println("Keine Verbindung (login-password): " + ex);
					ex.printStackTrace();
    			}
			}
			//Button Abbrechen
			if(event.getActionCommand().equals(ABBRECHEN_LABEL)){
				Shutdown();
			}
		}
		
	}
}
```


----------



## SlaterB (11. Aug 2009)

in der main-Methode definierst du eine lokale Variable login:
> Main login = new Main("Login");

das statische Klassenattribut bleibt null

schreibe
login = new Main("Login");
oder
Main.login = new Main("Login");
statt
> Main login = new Main("Login");


----------



## cam (11. Aug 2009)

Ok, nachdem ich nun alle Label, Textfelder und Buttons auf static gesetzt habe, funktioniert es. Allerdings kommt jetzt folgende Fehlermeldung:

Verbindung hergestellt.
Demo
java.lang.NullPointerException
demo
demo
Richtiges Passwort

Falscher Benutzername

Keine Verbindung (login-password): java.lang.NullPointerException
	at main.Main$EvtListenerAction.actionPerformed(Main.java:262)
	at java.awt.AWTEventMulticaster.actionPerformed(Unknown Source)
	at java.awt.Button.processActionEvent(Unknown Source)
	at java.awt.Button.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(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)

Zeile 262: passw1 = passw1.trim();


----------



## SlaterB (11. Aug 2009)

muss ich jetzt wirklich wieder "passw1 ist null" schreiben, bevor es weitergeht?
zu testen übrigens mit
System.out.println("passw1: "+passw1);
vor dem trim-Aufruf,

ob der Rückgabewert von   CallableStatement null sein kann oder nicht, kann ich nicht beurteilen


----------



## cam (11. Aug 2009)

Darauf bin ich auch gekommen...
Aber da ich schon eine Testausgabe gemacht habe und auch eben deine Testausgabe probiert habe und das richtige Passwort da steht, sich das Ergebnis aber nicht geändert hat, dachte ich, ich frage noch mal.


----------



## cam (11. Aug 2009)

Hab's gefunden - du hast recht, passw1 ist null, weil ich die Textfelder lösche. Wenn ich das auskommentiere, funktioniert es.


----------

