# Vector in Array -->NullPointerException



## Alex2xm (25. November 2003)

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:

```
...
           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  :-(


----------



## Christian Fein (25. November 2003)

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.


----------



## Alex2xm (25. November 2003)

Hi ,



> _Original geschrieben von Christian Fein _
> Teste ob
> v.size()  = null ist
> oder ob
> ...



Beide sind NICHT null, da ich bei beiden die Werte bekommmen.

```
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())
> {
> ...



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


----------



## Christian Fein (25. November 2003)

> _Original geschrieben von Alex2xm _
> *Hi ,
> 
> 
> ...



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


----------



## Alex2xm (25. November 2003)

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



```
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


----------



## Christian Fein (25. November 2003)

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


----------



## Alex2xm (25. November 2003)

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*


----------



## Christian Fein (25. November 2003)

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.


----------



## Tobander (21. Dezember 2003)

*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:
	
	
	



```
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();

    }
}
```


----------



## Thomas Darimont (21. Dezember 2003)

Servus!

Dein Erg_Select String Array ist auch mit Platz für nur ein Element etwas unterdimensioniert ...

Mach mal folgendes ..

http://www.tutorials.de/forum/showthread.php?threadid=133885&highlight=count

(Zeilen zählen) ... -> int count = ...

nun 
erg_select = new String[count];

damit wäre dein String Array groß genug um alle Zeilen Elemente aufzunehmen ...

Gruß Tom


----------



## Tobander (16. Januar 2004)

*in DB zurückschreiben*

Hey,dank dir das war die Lösung.
Hab jetzt folgendes Problem.Ich hab die Ergebnisse der DB_-Abfrage
in einem DefaultTableModel ausgegeben.Jetzt möchte ich,wenn
ich in der Tabelle etwas ändere,daß diese Änderung auch gespeichert
wird.Ich hab deswegen einen TableModelListener hinzugefügt
und lasse mir den Wert,der geändert wurde ausgeben.Aber wie bekomme
ich diesen neuen Wert dann in meine DB?
Hier der Code:


    public void tableChanged(TableModelEvent e) {
                c = e.getColumn();
                r = jTable1.getSelectedRow();
                value=jTable1.getValueAt(r,c);

wenn ich jetzt setValueAt(value,r,c) aufrufe gibts ein StackOverflowError
mfg
Toby


----------

