Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JAVA] Applicatie crasht na updaten tabel met lege resultset

Pagina: 1
Acties:

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Ja... daar zijn we dus weer... ik zal proberen mijn probleem zo duidelijk mogelijk uit te leggen.

Op dit moment werk ik tussen drie klassen.

Queries
TableData
OrderPanel

Vanuit het orderpanel wordt, na het wijzigen van een selectie in een combobox, de tabel op deze manier geüpdate

Java:
1
2
3
4
5
6
        jcboMaand.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                tabledata.updateTable(Queries.beginQuery(BootID,
                        getMaand(), Jaar));
            }
        });


Vanuit de Query klasse wordt een resultset teruggegeven, en doorgegeven aan de tabledata.

Indien de resultset gevuld is, werkt dit perfect, de tabel wordt geupdate en nieuwe records zijn zichtbaar. Het probleem is wanneer de resultset leeg is geeft hij een NullPointer in de Tabledata klasse.

Bij deze de update methode in de tabledata
Java:
1
2
3
4
5
6
    public void updateTable(ResultSet update) {
        Inhoud.clear();
        results = update;
        vulTabel();
        fireTableRowsInserted(Inhoud.size() - 1, Inhoud.size() - 1);
    }


Bij het opbouwen van de tabellen (dus eerste keer app starten) heeft hij geen problemen met een lege resultset, geen warning niks. De tabel is dan gewoon leeg.

Is de beste manier om dmv een if-statement vooraf te controleren of de resultset leeg is, en dit af te vangen of zit ik het in de verkeerde hoek te zoeken?

  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 06-11 12:24

koli-man

Bartender!!!!

Teeno schreef op donderdag 04 oktober 2007 @ 11:03:


Bij deze de update methode in de tabledata
Java:
1
2
3
4
5
6
    public void updateTable(ResultSet update) {
        Inhoud.clear();
        results = update;
        vulTabel();
        fireTableRowsInserted(Inhoud.size() - 1, Inhoud.size() - 1);
    }


Bij het opbouwen van de tabellen (dus eerste keer app starten) heeft hij geen problemen met een lege resultset, geen warning niks. De tabel is dan gewoon leeg.

Is de beste manier om dmv een if-statement vooraf te controleren of de resultset leeg is, en dit af te vangen of zit ik het in de verkeerde hoek te zoeken?
uhmm...vraagje, in die updateTable. Is de parameter update null? Ik zie dat update geassigned wordt aan results? Die results worden nog ergens anders gebruikt?

En die vultabel() die maakt zeker gebruik van results?? * koli-man kijkt bedenkelijk...

[ Voor 4% gewijzigd door koli-man op 04-10-2007 11:24 ]

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
results is de resultset die werd gebruikt om bij het starten de tabellen op te bouwen... op het moment dat die overschreven wordt door update(de resultset die erin gemikt wordt door de orderpanel) wordt er niets meer mee gedaan.
koli-man schreef op donderdag 04 oktober 2007 @ 11:22:

En die vultabel() die maakt zeker gebruik van results?? * koli-man kijkt bedenkelijk...
Thats correct, maar zoals ik net zei, de results worden eenmalig gebruikt.. het lijkt mij niet dat die in het geheugen moeten blijven hangen.. hierom wordt ook voor elke tabel-update de resultset overschreven door een nieuwe

[ Voor 49% gewijzigd door Teeno op 04-10-2007 11:28 ]


  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 06-11 12:24

koli-man

Bartender!!!!

Kun je niet in de stacktrace kijken waar je nullpointer exception precies plaatsvind?

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Jazeker... hier het stukje waar ik denk dat je het meest mee kan
code:
1
2
3
4
5
6
7
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0

    at java.util.Vector.elementAt(Unknown Source)

    at TableData.getValueAt(TableData.java:73)

    at javax.swing.JTable.getValueAt(Unknown Source)


Wat ik vreemd vind, is dat de methode getValueAt helemaal nergens wordt aangeroepen

--edit--
De getValueAt dus..
Java:
1
2
3
4
5
6
7
    public Object getValueAt(int rowIndex, int columnIndex) {
        if (Inhoud.size() > 0) {
            return ((Vector) Inhoud.elementAt(rowIndex)).elementAt(columnIndex);
        } else {
            return new String(" ");
        }
    }


--edit2--

Nog even voor de duidelijkheid... zodra er gegevens in de resultset staat werkt het prima.. alleen bij een lege resultset geeft ie deze error.

Het opbouwen van de tabel met een lege resultset (doet ie op onderstaande manier) werkt ook prima
Java:
1
2
3
4
5
6
    public TableData(ResultSet results) {
        this.results = results;

        vulTabel();

    }

[ Voor 48% gewijzigd door Teeno op 04-10-2007 11:36 ]


  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 06-11 12:24

koli-man

Bartender!!!!

Teeno schreef op donderdag 04 oktober 2007 @ 11:34:

Wat ik vreemd vind, is dat de methode getValueAt helemaal nergens wordt aangeroepen
De container waarin de tabel zit, roept waarschijnlijk zijn listeners aan.

Kijk eens wat die waarden van rowIndex en columnindex zijn....net voor het moment dat het misgaat.

[ Voor 17% gewijzigd door koli-man op 04-10-2007 12:16 ]

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
code:
1
2
RowIndex: 0
ColumnIndex: 0


Als ik naar een maand switch die wel gegevens bevat doet ie het volgende;

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
De query resultaten: 

RowIndex: 0
ColumnIndex: 0

RowIndex: 0
ColumnIndex: 1

RowIndex: 0
ColumnIndex: 2

RowIndex: 0
ColumnIndex: 3

RowIndex: 0
ColumnIndex: 4

RowIndex: 0
ColumnIndex: 5

RowIndex: 0
ColumnIndex: 6

RowIndex: 0
ColumnIndex: 7

RowIndex: 0
ColumnIndex: 8

RowIndex: 0
ColumnIndex: 9

RowIndex: 0
ColumnIndex: 10

[ Voor 4% gewijzigd door Teeno op 04-10-2007 12:44 ]


  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 06-11 12:24

koli-man

Bartender!!!!

Tja, kijk wat ik me afvraag is eigenlijk het volgende. Je check de Inhoud.size() en alleen als hij > 0 is dan kijk je erin.

Dus wat ik me zo kan bedenken is dat de Inhoud.size() -> 1 teruggeeft. Dus 1 row met 0 elementen.
En dan krijg je de exception.

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Wat stel je nu voor dat ik doe? Als ik die check eruit haal doet ie net zo weinig

Bijdeweg... situaties waarin het wel/niet werkt;

lege tabel --> gevulde tabel niet
gevulde tabel --> lege tabel niet
lege tabel --> lege tabel wel
gevulde tabel --> gevulde tabel wel

[ Voor 57% gewijzigd door Teeno op 04-10-2007 13:41 ]


  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 06-11 12:24

koli-man

Bartender!!!!

Ik weet niet precies wat in Inhoud zit, maar ik verwacht dat het een vector met vector erin is, soort van 2d array is.

Java:
1
2
3
4
5
6
7
8
9
public Object getValueAt(int rowIndex, int columnIndex) { 
    if (Inhoud.size() > 0) { 
        if (((Vector) Inhoud.elementAt(rowIndex)).size() > 0){
            return ((Vector) Inhoud.elementAt(rowIndex)).elementAt(columnIndex); 
            }
        } else { 
            return new String(" "); 
    } 
}


niet echt netjes...maar alla..

[ Voor 3% gewijzigd door koli-man op 04-10-2007 13:41 ]

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Oke, het punt van gevulde tabel naar lege tabel werkt nu wel.. het is niet echt netjes inderdaad omdat hij een lege rij neerzet.. Nu alleen nog het punt wanneer ik van een lege tabel, naar een gevulde tabel wil switchen... ik krijg dan nog steeds een lege tabel te zien (zonder lege rij)

  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 06-11 12:24

koli-man

Bartender!!!!

Dat heeft waarschijnlijk te maken met het moment van updaten van je listener en het vullen van Inhoud.

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Zal ik dan een nieuwe instantie van mijn tabledata moeten maken die het helemaal opnieuw opbouwt, of ligt het meer bij het punt dat ie de tabledata aan de tabel wil hangen?

  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 06-11 12:24

koli-man

Bartender!!!!

Het heeft waarschijnlijk te maken met de inhoud van Inhoud op het moment dat de userinterface een repaint doet.

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Goed, maar waar moet ik nu aanpassingen aanbrengen, ik kom helaas niet verder met de info die ik heb gekregen.

  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 06-11 12:24

koli-man

Bartender!!!!

Nou, ja. Je moet ergens beginnen in je tabel. Check of je een lege rij hebt. Heb je die niet dan maak je eentje. Ik heb maar eens voor je gegoogled. Het lijkt me dat je zoiets wil doen ongeveer.
klik

[ Voor 38% gewijzigd door koli-man op 04-10-2007 15:14 ]

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Ongeveer wel ja, hij hoeft dus alleen een lege row aan te maken als de resultset leeg is... ik ga even puzzelen

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Ik heb er nu een check ingehangen... niet te ingewikkeld.. moet zijn werk gewoon doen lijkt me..

Java:
1
2
3
4
5
6
7
8
9
10
11
    public void resultCheck() {
        try {
            if (results.next()) {
                vulTabel();
            } else {
                System.out.println("Ik ga hem niet vullen"); // TODO: Maak lege rij aan
            }
        } catch (SQLException h) {

        }
    }


Nu nog even zien hoe ik Inhoud een lege rij laat aanmaken

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Ik heb het nu zo
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
    public void resultCheck() {
        try {
            if (results.next()) {
                Kolommen();
                Rijen();
            } else {
                Kolommen();
                legeRij();
            }
        } catch (SQLException h) {
            System.out.println("ResultCheck SQLException");
        }
    }

Java:
1
2
3
4
5
6
7
8
9
10
    public void legeRij() {
        Vector legerij = new Vector();

        // Duik in een loop zolang er kolommen zijn
        for (int i = 0; i < Koppen.size(); i++) {
            // Zet het veld op blanco
            legerij.add("");
        }
        Inhoud.add(legerij);
    }


Helaas gaat ie nu over z'n nek en krijg ik een OutOfMemory(java heap space) error.. ik denk dus dat ie ergens in een oneindige loop belandt... ik zoek nog even verder... weeschT vrij tips te geven _/-\o_

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Update: ik heb de OutOfMemory exception er nog niet uit... hij loopt vast op het moment dat ie de tabel wil vullen met data (bij een gevulde resultset)
De lege resultsets worden nog niet weergegeven als lege rij, maar als lege tabel... hier kom ik dus ook niet mee verder.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public void Rijen() {

        try {
            // wanneer er een volgende record is
            do {

                // toevoegen van nieuwe Vector aan andere Vector
                Inhoud.add(convertRow(results)); // Hier loopt ie op vast

            } while (results.next());
        }

        // afvangen van SQLException
        catch (SQLException SQLex) {
            // weergeven van een println als er een SQLException voorkomt
            System.out.println("SQLException : Rijen Methode");
        }
    }


ConvertRow:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    private Vector convertRow(ResultSet results) {

        Vector rij = new Vector();
        try {

            // maken van for-lus zolang het aantal kolommen berereikt is
            for (int i = 0; i < Koppen.size(); i++) {
                //Voeg de results toe aan de rij
                rij.add(results.getString(i + 1));

            }
        } catch (SQLException i) {

        }

        return rij;
    }


Hoop dat je hier nog even naar wil kijken

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Ik zie nu waar hij precies op blijft hangen... en ik vind het maar een vreemd verhaal... excuses als jullie vinden dat ik teveel code plaats maar ik probeer het zo duidelijk mogelijk te omschrijven..

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public void Main(ResultSet results) {
        this.results = results;
        //Kolommen(); // <--- als deze direct wordt aangeroepen worden de kolommen opgebouwd
        //Rijen();
        resultCheck(); // <---- roep de resultcheck aan
    }
    // Controleer of de resultset gevuld is, zoniet maak een lege rij aan
    public void resultCheck() {        
        try {
            if (results.next()) {
                System.out.println("Resultset bevat gegevens"); // <----- Wordt wel correct geprint.. de if werkt dus correct
                Kolommen(); // <---- doet niets
                Rijen(); // <----- OutOfMemory exception
            } else {
                System.out.println("Lege resultset"); // <--- wordt correct geprint indien resultset leeg is
               // Kolommen(); // <----- niets
               // legeRij(); // <--- geen lege rij, ook geen exception
            }
        } catch (SQLException h) {
            System.out.println("ResultCheck SQLException");
        }
    }


Voor toelichting zie commentaar in code

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

1) Het ResultSet mag nooit zonder enige aanleiding de methode verlaten, laat staan toegewezen worden aan een instance variable. Pass het hooguit als een parameter naar een hulpmethode en roep direct na de verwerking in de hoofdmethode de close() in de finally aan. Anders ben je hier bronnen aan het lekken. Dit geldt overigens ook voor de (Prepared)Statement en Connection.

2) Onderdruk nooit exceptions. Breid minimaal de foutbericht met e.getMessage() om achter te komen wat er precies fout gaat. Gebruik veel liever e.printStackTrace().

3) Methoden en variabelen zouden in Java niet met een hoofdletter beginnen.

Ik heb weinig zin om door deze ondoorzichtelijke code heen te wroeten om te kijken wat er precies misgaat, anders had ik je wel willen helpen. Ik denk dat de betere Java developers hier net zo over denken, gezien het uitblijven van de reacties van de harde kern.

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
BalusC schreef op vrijdag 05 oktober 2007 @ 10:30:
1) Het ResultSet mag nooit zonder enige aanleiding de methode verlaten, laat staan toegewezen worden aan een instance variable. Pass het hooguit als een parameter naar een hulpmethode en roep direct na de verwerking in de hoofdmethode de close() in de finally aan. Anders ben je hier bronnen aan het lekken. Dit geldt overigens ook voor de (Prepared)Statement en Connection.

2) Onderdruk nooit exceptions. Breid minimaal de foutbericht met e.getMessage() om achter te komen wat er precies fout gaat. Gebruik veel liever e.printStackTrace().

3) Methoden en variabelen zouden in Java niet met een hoofdletter beginnen.

Ik heb weinig zin om door deze ondoorzichtelijke code heen te wroeten om te kijken wat er precies misgaat, anders had ik je wel willen helpen. Ik denk dat de betere Java developers hier net zo over denken, gezien het uitblijven van de reacties van de harde kern.
Ik zal de code gaan fatsoeneren... de resultset wordt nu in tabledata gebouwd... hij geeft nu de query als string mee ipv de resultset.

De reden dat het zo rommelig is omdat ik zulke dingen meestal even snel wil proberen "even dit proberen, even snel die methode ertussen".. en dan de code netjes ga maken...

  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 06-11 12:24

koli-man

Bartender!!!!

Teeno schreef op vrijdag 05 oktober 2007 @ 10:43:
[...]
en dan de code netjes ga maken...
Ik zie maar al te vaak (ook professioneel), dat het laatste nooit meer gebeurt. Als het werkt, dan werkt het.....probeer het dus direct netjes te doen.

[ Voor 6% gewijzigd door koli-man op 05-10-2007 10:45 ]

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
duuuuuusss...... ik denk niet dat ik me onder de JAVA gemeenschap nog kan vertonen... anyways;

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public void buildColumns(ResultSet results) {
        try {
            // Tel aantal kolommen
            int columns = results.getMetaData().getColumnCount();
            // Als er gegevens in de resultset staan
            if (results.next()) { // <---- die zorgt ervoor dat er geen kolommen worden gemaakt als de resultset leeg is
                for (int i = 1; i <= columns; i++) {
                    Heads.add(results.getMetaData().getColumnName(
                            i));
                }
            }
        }
        // afvangen van de SQLException
        catch (SQLException e) {
            e.printStackTrace();
        }

    }


Hij doet het nu beter.. ik kwam erachter bij het verschonen van de code... in ieder geval bedankt voor de moeite en opbouwende kritiek... heb weer wat geleerd :)
Pagina: 1