Vector in Array -->NullPointerException

Alex2xm

Mitglied
Hallo Leute,

habe mal wieder ein Problem.
Ich habe eine Datenbankabfrage. Das ResultSet lass ich in ein Vector schreiben. Nun möchte ich den Vector in ein Array kopieren. Das Problem ist, dass ich eine NullPointerException bekomme.
Hier mal der Code:
Code:
...
           while (r.next())
            {
                v.add(r.getString("name"));
                System.out.println(r.getString("name"));
            }
            String[] KEYWORDS2 = new String[v.size()];
            System.out.println("Size"+v.size() ); // gibt auch die Größe des Arrays aus!
            v.toArray(KEYWORDS2);
...

Sobald ich auf das Array mit KEYWORDS2[0] aufrufe bekomme ich eine Exception.

Ich verzweifele hier bald :-(
 
Teste ob
v.size() = null ist
oder ob
v = null ist
eines von Beiden ist null.

Hast du deinen Vector auch erstellt oder nur definiert?
Kann es sein
while (r.next())
{
}

ab und zu keinen Schleifendurchlauf hat (da keine Werte)?
Wenn ja dann duerfte
String[] KEYWORDS2 = new String[v.size()];

Ein String der Groesse 0 werden, sprich null.
 
Hi ,

Original geschrieben von Christian Fein
Teste ob
v.size() = null ist
oder ob
v = null ist
eines von Beiden ist null.

Beide sind NICHT null, da ich bei beiden die Werte bekommmen.
Code:
public class mySQLConnection
{

    private Connection con = null;
    public static Vector v = new Vector(); //deklarieren des Vektors
    public static String[] KEYWORDS2; // deklarieren des Arrays

    private Statement s = null;
    private String dbdriver = "org.gjt.mm.mysql.Driver";
    private String dbuser = "xxx";
    private String dbpassword = "yyy";
    private String database = "zzz";
    private String dbhost = "localhost";
    private String dbport = "3306";
    private String dburl = "jdbc:mysql://" + dbhost + ":" + dbport + "/" + database;

    private Connection connect()
    {
        try
        {
            Class.forName(dbdriver);
            return DriverManager.getConnection(dburl, dbuser, dbpassword);
        }
        catch (Exception e)
        {
            System.out.println("Can't connect");
            e.printStackTrace();
            return null;
        }
    }

    public ResultSet execute(String query)
    {
        ResultSet r;
        try
        {
            s = con.createStatement();
            r = s.executeQuery(query);
            return r;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.exit(1);
        }
        return null;
    }

    public void fillarray()
    {
        ResultSet r;
        String theQuery = new String("select * from test_db");
        try
        {
            con = connect();
            r = execute(theQuery);
            // ToDo: Fill Vector v with results form database
            while (r.next())
            {
                v.add(r.getString("name"));
                System.out.println(r.getString("name"));
            }
            String[] KEYWORDS2 = new String[v.size()];
            System.out.println("Size: " + v.size());  // output: 4 (entspicht den Einträgen in der DB)
            System.out.println("v:" + v); // gibt [test 0, test 1, test 2, test 3], sprich den DB Inhalt wieder
            v.toArray(KEYWORDS2);
            con.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

    }
    public static void main(String args[])
    {
        mySQLConnection db = new mySQLConnection();
        db.fillarray();
        System.out.println(KEYWORDS2);

    }
}

Original geschrieben von Christian Fein
Kann es sein
while (r.next())
{
}

ab und zu keinen Schleifendurchlauf hat (da keine Werte)?
Wenn ja dann duerfte
String[] KEYWORDS2 = new String[v.size()];

Ein String der Groesse 0 werden, sprich null.

Das r.next hat immer Werte aus der DB, da hier momentan nur 4 Werte hinterlegt sind.

Nun ne Idee wo der Fehler sein kann
 
Original geschrieben von Alex2xm
Hi ,



Beide sind NICHT null, da ich bei beiden die Werte bekommmen.
Code:
public class mySQLConnection
{

    private Connection con = null;
    public static Vector v = new Vector(); //deklarieren des Vektors
    public static String[] KEYWORDS2; // deklarieren des Arrays

    private Statement s = null;
    private String dbdriver = "org.gjt.mm.mysql.Driver";
    private String dbuser = "xxx";
    private String dbpassword = "yyy";
    private String database = "zzz";
    private String dbhost = "localhost";
    private String dbport = "3306";
    private String dburl = "jdbc:mysql://" + dbhost + ":" + dbport + "/" + database;

    private Connection connect()
    {
        try
        {
            Class.forName(dbdriver);
            return DriverManager.getConnection(dburl, dbuser, dbpassword);
        }
        catch (Exception e)
        {
            System.out.println("Can't connect");
            e.printStackTrace();
            return null;
        }
    }

    public ResultSet execute(String query)
    {
        ResultSet r;
        try
        {
            s = con.createStatement();
            r = s.executeQuery(query);
            return r;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.exit(1);
        }
        return null;
    }

    public void fillarray()
    {
        ResultSet r;
        String theQuery = new String("select * from test_db");
        try
        {
            con = connect();
            r = execute(theQuery);
            // ToDo: Fill Vector v with results form database
            while (r.next())
            {
                v.add(r.getString("name"));
                System.out.println(r.getString("name"));
            }
            String[] KEYWORDS2 = new String[v.size()];
            System.out.println("Size: " + v.size());  // output: 4 (entspicht den Einträgen in der DB)
            System.out.println("v:" + v); // gibt [test 0, test 1, test 2, test 3], sprich den DB Inhalt wieder
            v.toArray(KEYWORDS2);
            con.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

    }
    public static void main(String args[])
    {
        mySQLConnection db = new mySQLConnection();
        db.fillarray();
        System.out.println(KEYWORDS2);

    }
}




Das r.next hat immer Werte aus der DB, da hier momentan nur 4 Werte hinterlegt sind.

Nun ne Idee wo der Fehler sein kann

Hier deklarierst du das Array:
public static String[] KEYWORDS2; // deklarieren des Arrays
Hier deklarierst du es erneut:
String[] KEYWORDS2 = new String[v.size()];

Einmal als Static und einmal als Lokale Variable. Das macht kein Sinn.
Dann duerfte bei System.out.println(KEYWORDS2) ein Nullpointer entstehen. Da
die Statische Klassenvariable KEYWORDS2 nie erstellt wird.


Wobei da 2 bösartige Stilfehler sind:
public static Variablen sollte mann vermeiden, und lieber Werte zurueckgeben, oder per get / set Methoden darauf zugreifen.

Eine Statische Variable niemals mit NULL definieren.

Schreib das also so um

public void fillarray() {
ändern in
public String[] fillarray() {

String[] KEYWORDS2 = new String[v.size()]; bleibt bestehen.

Am Schluss :
con.close();
return v.toArray(KEYWORDS2).toString();
}

weil v.toArray gibt Object[] zurueck.

gruesse
 
Hi,
bin glaube ich mittlerweile zu blöd das hier zu korrigieren. :-(.
Habe nun alle static Deklarationen raus gemacht.
Ebenfalls habe ich die Methode umbenannt, sowie die doppelt deklarierte Variable entfernt.
Leider bekomme ich eine Fehlermeldung bei return sowie bei dem Zugriff auf die KEYWORDS2 Variable in main.

HILEFE :-o


Code:
public class mySQLConnection
{
    private Connection con = null;
    public Vector v = new Vector();

    // Variablen für Datenbank
    private Statement s = null;
    private String dbdriver = "org.gjt.mm.mysql.Driver";
    private String dbuser = "xxx";
    private String dbpassword = "yyy";
    private String database = "zzz";
    private String dbhost = "localhost";
    private String dbport = "3306";
    private String dburl = "jdbc:mysql://" + dbhost + ":" + dbport + "/" + database;


    private Connection connect()
    {
        try
        {
            Class.forName(dbdriver);
            return DriverManager.getConnection(dburl, dbuser, dbpassword);
        }
        catch (Exception e)
        {
            System.out.println("Can't connect");
            e.printStackTrace();
            return null;
        }
    }

    public ResultSet execute(String query)
    {
        ResultSet r;
        try
        {
            s = con.createStatement();
            r = s.executeQuery(query);
            return r;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.exit(1);
        }
        return null;
    }

    public String[] fillarray()
    {
        ResultSet r;
        String theQuery = new String("select * from test_db");
        try
        {
            con = connect();
            r = execute(theQuery);

            // ToDo: Fill Vector v with results form database
            while (r.next())
            {
                v.add(r.getString("name"));
                System.out.println(r.getString("name"));
            }
            String[] KEYWORDS2 = new String[v.size()];
            System.out.println("Size: " + v.size());  // output: 4 (entspicht den Einträgen in der DB)
            System.out.println("v:" + v); // gibt [test 0, test 1, test 2, test 3], sprich den DB Inhalt wieder
            // v.toArray(KEYWORDS2).toString();
            con.close();
            return v.toArray(KEYWORDS2).toString(); //Incompatible types, Found java.lang.Strting, required: java.lang.String[]
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String args[])
    {
        mySQLConnection db = new mySQLConnection();

        db.fillarray();

        System.out.println(KEYWORDS2[0]); // sollte eigentlich den 1. Wert zurückgeben  aber kann nicht auf KEYWORDS2 zugreiffen

    }
}

Bin für jede rettende Idee dankbar...

Danke
 
KEYWORDS2 = db.fillarray();

Wandle String[] in Object[] um in der deklaration, weil die konvertierung von Object[] in String[] nicht so einfach durchfuehrbar ist.
Andere Frage wieso willst du ein String[] haben wenn du schon einen vector hast?

Waehre noch geschickter als vector zurückzuliefern
 
Hi,

danke für deine schnelle Hilfe!
Ich möchte das Array später in einer Suche weiterverarbeiten.
Wenn du dir den Thread hier (http://www.tutorials.de/tutorials138285.html) anschaust siehst du wie die Keywords weiterverarbeitet werden.

Ich bin mit Arrays besser vertraut als mit Vectoren, deshalb meine Entscheidung für ein Array. Eigentlich wollte ich schon das ResultSet in ein Array zurück geben, aber leider geht das nicht :-(.

Ich werde nun mal ein wenig weiterbasteln (hoffentlich ohne weiter Probleme).

Danke

Alex

PS: Leider habe ich immer noch das Problem, dass ich bei return eine Fehlermeldung bekomme. Ebenfalls kann ich auch nicht mit KEYWORDS2 = db.fillarray(); auf die Variable zugreifen :-(? *nun wirklich an seinen JAVA-Kenntnissen zweifelt*
 
Zuletzt bearbeitet:
Problematik ist das Sich object[] nicht so ohne weiteres in String[] umwandeln lässt.
Du hast aber schon einen vector, nutze diesen, alles was ein Array kann, kann auch der Vector und noch viel mehr.
Zudem hast du die schöne möglichkeit diesen mit einem Iterator auszulesen, was bei einem Array nicht so einfach moeglich ist.
 
array

Hey,
habe folgendes Problem:
Lese Daten aus einer DB-Abfrage in ein ResultSet aus und will
jetzt ein String-Array damit füllen,allerdings bekomme ich immer
die Fehlermeldung: array out of bounds.
Was mache ich falsch?
Hier der Code:
Code:
import java.util.*;
import javax.swing.*;
import java.sql.*;
import java.awt.*;
import java.awt.event.*;
public class Testat9 extends JFrame {
    static String url;
    static String Driver;
    static String sql;
    static int nummer;
    static String autor,titel;
    static Connection con;
    static Statement stmt;
    static ResultSet result;
    static String[] erg_select={""};
      public static void main(String[] args) throws Exception{
       
        System.out.println("\n\n\n\n\n");
        System.out.println("Datenbankzugriff mit JDBC");
        System.out.println("=========================\n\n");
        
        url = "jdbc:odbc:Bücher";           
        try { 
             Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            con = DriverManager.getConnection(url,"admin","");
            System.out.println("Verbinden ...");
        }
        
        catch (SQLException e){
            System.out.println("Fehler beim Verbindungsaufbau");
            System.exit(0);
        }
        catch (ClassNotFoundException e){
            System.out.println("JDBC over ODBC Treiber nicht gefunden!");
            System.exit(0);
        }
        System.out.println("Verbindungsaufbau erfolgreich\n");
               try {
                   sql = "SELECT * FROM buch1 ORDER BY autor,titel ASC";
                 stmt = con.createStatement()
                 result = stmt.executeQuery(sql);
            int i=0;            
            while (result.next()){            
                autor = result.getString("Autor");
                titel = result.getString("Titel");                                                                         
                erg_select[i]=autor+" "+titel+" ";
                i++;           
            }
                     result.close();
                    stmt.close();
                    con.close();
            
        }
        
        catch (SQLException e){
            System.out.println("Fehler bei der Ausgabe");
            System.out.println(e);
        }
        
        JFrame frame = new JFrame("Ausgabe");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JList liste = new JList(erg_select); 
        frame.getContentPane().add(new JScrollPane(liste));
        frame.pack();
        frame.show();

    }
}
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück