[Java]get probleem

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • XTREEMRaGE
  • Registratie: April 2003
  • Laatst online: 19:25

XTREEMRaGE

XTRËËM|RåGË

Topicstarter
Ik ben java aan het leren en ik kom een probleem tegen. Ik wilde een thermometer app. maken(celsius -> fahrenheit). In deze kleine app. kan je simpelweg het aantal graden intypen en deze berekent dan de uitkomst. Deze heb ik in 1 file gemaakt, daar loopt het goed. Maar zodra ik de classes apart wil zetten, krijg ik een error met empty string. Waarom krijg ik deze melding en hoe kan ik deze oplossen? Want het lijkt net of de 'invoerVak' niks kan uitlezen?!

Ik heb ook comments erbij gezet om het voor mij duidelijk te maken wat ik doen :P, als ik hier en daar fouten heb gemaakt plz let me know. Dan leer ik het tenminste niet verkeerd! ;)

Ik maak de apps in Eclipse, os win xp. Op java 1.6

Deze doet het:
Java:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

//maak class TH aan en maak het een 'verlengstuk' van de class JFrame
@SuppressWarnings("serial")
public class Test2 extends JFrame{ 
    
    //methode beschrijft hoe de gedragingen worden uitgevoerd
    //is een groepje bij elkaar horende opdrachten
    public static void main(String[] args){
        //maak een object van de klasse
        JFrame frame = new Test2();
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Thermometer");
        frame.setContentPane(new ThermometerPaneel());
        frame.setVisible(true);
    }
}



@SuppressWarnings("serial")
class ThermometerPaneel extends JPanel {
    //Ik wil dit object gebruiken met de naam ..
    public JTextField invoerVak; 
    private JButton knop;
    private JLabel invoerLabel;
    public String mededeling;
    
    public ThermometerPaneel(){
        setLayout(null); //layout manager uitschakelen
        
        invoerVak = new JTextField(10); //maak tekstvak aan
        invoerVak.setHorizontalAlignment(JTextField.LEFT); //zet hem links
        invoerVak.setBounds(10, 20, 90, 20); //coordinaten
        
        invoerLabel = new JLabel("Celcius");
        invoerLabel.setHorizontalAlignment(JLabel.RIGHT);
        invoerLabel.setBounds(72, 20, 90, 20);
        
        mededeling = "0 Fahrenheit"; //Deze string heeft de tekst
        
        knop = new JButton("Convert");
        knop.setHorizontalAlignment(JButton.LEFT);
        knop.addActionListener(new CelsiusHandler());
        knop.setBounds(10, 50, 90, 20);
        
        add(invoerVak);
        add(invoerLabel);
        add(knop);
    }
    
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        g.drawString(mededeling, 120, 67);
    }
    
    class CelsiusHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String invoer = invoerVak.getText();
            double celsius = Double.parseDouble(invoer);
            
            if(!invoerVak.equals("")){
                double fahrenheit = celsius * 1.8 + 32;
                mededeling = "" + fahrenheit + " fahrenheit";
            }
            else{
                mededeling = "Voer een getal in";
            }
            repaint();          
        }
    }
}


En nu de aparte classes, hier krijg ik een empty string:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import javax.swing.*;

//maak class TH aan en maak het een 'verlengstuk' van de class JFrame
@SuppressWarnings("serial")
public class Thermometer extends JFrame{ 
    
    //methode beschrijft hoe de gedragingen worden uitgevoerd
    //is een groepje bij elkaar horende opdrachten
    public static void main(String[] args){
        //maak een object van de klasse
        JFrame frame = new Thermometer();
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Thermometer");
        frame.setContentPane(new ThermometerPaneel());
        frame.setVisible(true);
    }
}


Java:
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
35
36
37
38
39
40
41
import javax.swing.*;
import java.awt.*;

@SuppressWarnings("serial")
public class ThermometerPaneel extends JPanel {
    //Ik wil dit object gebruiken met de naam ..
    JTextField invoerVak; 
    private JButton knop;
    private JLabel invoerLabel;
    String mededeling;
    
    public ThermometerPaneel(){
        setLayout(null); //layout manager uitschakelen
        
        invoerVak = new JTextField(10); //maak tekstvak aan
        invoerVak.setHorizontalAlignment(JTextField.LEFT); //zet hem links
        invoerVak.setBounds(10, 20, 90, 20); //coordinaten
        
        invoerLabel = new JLabel("Celcius");
        invoerLabel.setHorizontalAlignment(JLabel.RIGHT);
        invoerLabel.setBounds(72, 20, 90, 20);
        
        mededeling = "0 Fahrenheit"; //Deze string heeft een tekst
        
        knop = new JButton("Convert");
        knop.setHorizontalAlignment(JButton.LEFT);
        knop.addActionListener(new CelsiusHandler());
        knop.setBounds(10, 50, 90, 20);
        
        add(invoerVak);
        add(invoerLabel);
        add(knop);
    }
    
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        g.drawString(mededeling, 120, 67);
    }
    
    
}


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.awt.event.*;

class CelsiusHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        ThermometerPaneel th = new ThermometerPaneel();
        //double fahrenheit;
        
        String invoer = th.invoerVak.getText();
        double celsius = Double.parseDouble(invoer);
        
        //Als deze niet gelijk is aan een lege string
        if(!th.invoerVak.equals("")){
            double fahrenheit = celsius * 1.8 + 32;
            th.mededeling = "" + fahrenheit + " fahrenheit";
        }
        else{
            th.mededeling = "Voer een getal in";
        }
        
        th.repaint();
    }
}

GöÐ, ®Ë§þËÇT åñÐ Höñöµ® | LÜ©K>SkïLL | XT®ËËM|®åGË ||Funky Monkeys || Fm


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:00

Creepy

Tactical Espionage Splatterer

En waar precies krijg je die melding? (welke class, regel etc)? dat zal Eclipse je namelijk precies melden. Alleen de foutmelding en een shitload aan code betekent dat wij nogal wat zoekwerk moeten doen wat Eclipse al voor je doet en waar je natuurlijk in eerste instantie zelf ook naar moeten kijken ;)
Daarnaast: kan je een klein test geval maken? Dit is nogal een aardige lap aan code ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Als je code post, post dan enkel relevante(!) code aub. Verder zijn wij hier niet om voor jou te debuggen, dat kun je prima zelf (Debuggen: Hoe doe ik dat?) en ook niet om te gaan speuren naar eventuele fouten (quickfix). Kleed het dus even uit naar een testcase; daar hebben we meer aan.

[edit]
* RobIII mept engerd :P

[ Voor 12% gewijzigd door RobIII op 08-05-2009 16:33 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Laatst online: 16:49
blame the vrijmibo

[ Voor 91% gewijzigd door 418O2 op 08-05-2009 18:46 ]


Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 12:56
Kijk goed welke classes je aanmaakt (en onthoud wat er gebeurd als je een classe aanmaakt) !!

Java:
1
2
3
4
public class ThermometerPaneel extends JPanel {
    //blablabla
    CelsiusHandler ch = new CelsiusHandler();
}


en

Java:
1
2
3
4
5
class CelsiusHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        ThermometerPaneel th = new ThermometerPaneel();
    }
}


Wat gebeurd daar? ;)

spoiler: hint
Je maakt in je main classe een ThermometerPaneel aan (dat is 1). Echter, je doet dit in je CelsiusHandler ook (dat is 2). Je leest daarna de waardes van 2. Deze is nooit getoond en ingevuld, dus is het een lege string. Je moet de waardes van 1 lezen.

spoiler: mogelijke oplossing
Je kan het oplossen door de th te vullen vanuit waardes vanuit de event. Een andere mogelijkheid is om bij het aanmaken van de CelsiusHandler de ThermometerPaneel mee te geven.

let the past be the past.


Acties:
  • 0 Henk 'm!

  • XTREEMRaGE
  • Registratie: April 2003
  • Laatst online: 19:25

XTREEMRaGE

XTRËËM|RåGË

Topicstarter
RobIII schreef op vrijdag 08 mei 2009 @ 16:33:
Als je code post, post dan enkel relevante(!) code aub. Verder zijn wij hier niet om voor jou te debuggen, dat kun je prima zelf (Debuggen: Hoe doe ik dat?) en ook niet om te gaan speuren naar eventuele fouten (quickfix). Kleed het dus even uit naar een testcase; daar hebben we meer aan.

[edit]
* RobIII mept engerd :P
Dat was niet de bedoeling dat jullie het voor mij gingen oplossen ;), maar enige pointers waren wel mooi geweest, overigens compileerd ie wel goed. Dus qua code is ie compileerbaar :P. De 1e lap code is het java bestand, waar alle classes bij elkaar zitten. Deze werkt goed en doet wat ie moet doen! Nu wilde ik de classes gaan opsplitsen, dit gaat opzich ok en ik kan hem compileren, maar als ik een waarde invul voor celsius en ik druk op de knop convert, krijg ik een fout in de Ecplise console.

Java:
1
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: empty String


Dus vandaar dat ik 'zoveel' code had staan. Zodat m'n vraag duidelijk was/is, maar kennelijk werkte dat averechts.

GöÐ, ®Ë§þËÇT åñÐ Höñöµ® | LÜ©K>SkïLL | XT®ËËM|®åGË ||Funky Monkeys || Fm


Acties:
  • 0 Henk 'm!

  • XTREEMRaGE
  • Registratie: April 2003
  • Laatst online: 19:25

XTREEMRaGE

XTRËËM|RåGË

Topicstarter
SPee schreef op vrijdag 08 mei 2009 @ 17:16:
Kijk goed welke classes je aanmaakt (en onthoud wat er gebeurd als je een classe aanmaakt) !!

Java:
1
2
3
4
public class ThermometerPaneel extends JPanel {
    //blablabla
    CelsiusHandler ch = new CelsiusHandler();
}
Deze was idd een fout van mij! ik was aan het spelen en ik heb m'n spulletjes niet netjes opgeruimd ;). Ik zal je tips vanaaf of morgen ff verder bekijken, tnx.

GöÐ, ®Ë§þËÇT åñÐ Höñöµ® | LÜ©K>SkïLL | XT®ËËM|®åGË ||Funky Monkeys || Fm


Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 18-09 22:40

Nick_S

++?????++ Out of Cheese Error

En nog een ander tipje:
Java:
1
2
3
4
5
6
7
if(!invoerVak.equals("")){
                double fahrenheit = celsius * 1.8 + 32;
                mededeling = "" + fahrenheit + " fahrenheit";
            }
            else{
                mededeling = "Voer een getal in";
            } 

Heb je hier wel eens de mededeling "Voer een getal in" gekregen?
spoiler:
invoerVak is niet van hetzelfde type als "" en dit zal dus altijd true opleveren


En zoals je al gezien hebt:
Java:
1
2
            String invoer = invoerVak.getText();
            double celsius = Double.parseDouble(invoer); 

Komt hier je NumberFormatException vandaan.
spoiler:
Als invoer geen geldige double waarde heeft, gaat dit dus goed fout.


Offtopic: Waarom gaat iedereen altijd gelijk met Swing of AWT aan de gang? Bij mij op school was het altijd
[list]
• stap 1, zorg dat je programma zonder uitvoer van buitenaf werkt
• stap 2, kijk eens of je commandline parameters naar binnen krijgt
• stap 3, kijk dan eens of je er een user interface omheen kan maken
[/list]

[ Voor 19% gewijzigd door Nick_S op 08-05-2009 19:18 ]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • XTREEMRaGE
  • Registratie: April 2003
  • Laatst online: 19:25

XTREEMRaGE

XTRËËM|RåGË

Topicstarter
Nick_S schreef op vrijdag 08 mei 2009 @ 19:16:
En nog een ander tipje:
Java:
1
2
3
4
5
6
7
if(!invoerVak.equals("")){
                double fahrenheit = celsius * 1.8 + 32;
                mededeling = "" + fahrenheit + " fahrenheit";
            }
            else{
                mededeling = "Voer een getal in";
            } 

Heb je hier wel eens de mededeling "Voer een getal in" gekregen?
spoiler:
invoerVak is niet van hetzelfde type als "" en dit zal dus altijd true opleveren


En zoals je al gezien hebt:
Java:
1
2
            String invoer = invoerVak.getText();
            double celsius = Double.parseDouble(invoer); 

Komt hier je NumberFormatException vandaan.
spoiler:
Als invoer geen geldige double waarde heeft, gaat dit dus goed fout.


Offtopic: Waarom gaat iedereen altijd gelijk met Swing of AWT aan de gang? Bij mij op school was het altijd
[list]
• stap 1, zorg dat je programma zonder uitvoer van buitenaf werkt
• stap 2, kijk eens of je commandline parameters naar binnen krijgt
• stap 3, kijk dan eens of je er een user interface omheen kan maken
[/list]
Bear with me! Ik neem aan dat je dit van de 1e lap code hebt? Deze werkt, het gaat om andere lapjes code :). Want de eerste lapcode werkt gewoon en deze geeft geen fout als ik een waarde invul. En helaas zit ik niet meer op school (werk al), dus heb ik een studenten boek aangeschaft en hiermee begon the fun ;).
Java:
1
2
            String invoer = invoerVak.getText();
            double celsius = Double.parseDouble(invoer); 

Komt hier je NumberFormatException vandaan.
Als invoer geen geldige double waarde heeft, gaat dit dus goed fout.[/code]
In de eerste lap code gaat het niet fout. Daar krijg ik netjes het antwoord op m'n scherm als ik een waarde invul. De getText() levert de inhoud van de tekstvak af als een stringobject, de string die getText() aflevert, wordt opgeborgen in een variable met de naam invoer. En deze converter ik naar een double, dit zou dus niet fout mogen zijn. Als ik zo m'n boek mag geloven :P.

GöÐ, ®Ë§þËÇT åñÐ Höñöµ® | LÜ©K>SkïLL | XT®ËËM|®åGË ||Funky Monkeys || Fm


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:00

Creepy

Tactical Espionage Splatterer

XTREEMRaGE schreef op vrijdag 08 mei 2009 @ 18:55:
[...]


Java:
1
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: empty String


Dus vandaar dat ik 'zoveel' code had staan. Zodat m'n vraag duidelijk was/is, maar kennelijk werkte dat averechts.
Meestal zit er een volledige stacktrace aanvast zodat je precies kan zien in welke regel dit gebeurd. Daar kan je dan weet meer uit afleiden. Kan je die volledige stackstrace geven (dus inclusief alle classes, regelnummers etc) of krijg je alleen maar deze melding en verder niks? Daarnaast ben je nu zelfs aan het uitleggen dat er in een aantal stukken code blijkbaar niks mis gaat, en lijken die lappen code dus inderdaad niet relevant. Dus inderdaad, het werkt averechts ;)

Om het voor jezelf duidelijker te maken (!) vroeg ik om een kleiner test geval. Dat geeft jou meer inzicht en dan kan je ons ook meer vertellen. Je laat ook gelijk zien er zelf mee bezig geweest te zijn. Nu komt het namelijk op mij nog steeds over als "dit is mijn code, dit is een foutmelding, doe eens fixen voor me".
XTREEMRaGE schreef op vrijdag 08 mei 2009 @ 23:25:
[...]


In de eerste lap code gaat het niet fout. Daar krijg ik netjes het antwoord op m'n scherm als ik een waarde invul. De getText() levert de inhoud van de tekstvak af als een stringobject, de string die getText() aflevert, wordt opgeborgen in een variable met de naam invoer. En deze converter ik naar een double, dit zou dus niet fout mogen zijn. Als ik zo m'n boek mag geloven :P.
En als die String nu eens geen nummer is? Of leeg is?

Echt, lees die stacktrace en pak dat regelnummer er even bij. Zet er een brakepoint op en controleer vervolgens de variabelen die je hebt ;) Grote kans dat je direct ziet wat er mis is. Overigens is dit gewoon een kwestie van (leren) debuggen.

[ Voor 55% gewijzigd door Creepy op 09-05-2009 14:43 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

De foutmelding is vrij gemakkelijk te verklaren. En ook de reden waarom het wel werkt als je de classes niet gescheiden hebt.

In CelsiusHandler ga je proberen om de String invoer te converteren naar een double de String die je hiervoor gebruikt haal je uit invoerVak.getText(). Echter als je de classes scheid heeft de class CelsiusHandler geen idee wat invoerVak is. Dit component is immers gedifineerd in een andere class. Dit heeft het gevolg dat String invoer leeg blijft.
Als je dan een Double.parseDouble doet over die string krijg je een exception, je kunt van iets wat leeg is geen double maken.

Sowieso snap ik niet zo goed waarom je die buttonhandler class in een apparte class wilt zetten. inner classes worden juist gebruikt voor component handler, mede omdat je dan niet tegen dit soort problemen aan loopt. Je hebt namelijk bij handlers vaak values van componenten nodig.

Mijn advies is om de CelsiusHandler class als inner class in ThermometerPaneel te laten staan. Als je perse er een apparte class van wilt maken kun je een referentie naar het component invoerVak meegeven in de constructor van CelsiusHandler, hiermee zou je dan binnen de class kunnen refereren naar invoerVak en alsnog daar de waarde ophalen. Maar ik zou dit zeker niet adviseren!

Verder heb ik nog een tip voor je. Je krijgt nu een lelijke exception en crash op het moment dat dit gebeurt. Maar als ik in jou programma in het invoerVak in plaas van een getal bijvoorbeeld een woord in type, dan krijg ik dezelfde exception en crash.

Je zou een parse altijd in een try en catch blok moeten stoppen zodat je dat soort dingen af kunt vangen en een nette melding kunt geven, en het programma niet crashed.
Bijvoorbeeld:
code:
1
2
3
4
5
6
try {
  double celsius = Double.parseDouble(invoerVak.getText());
}
catch (NumberFormatException e) {
  JOptionPane.showMessageDialog(this,"U heeft geen geldige temperatuur ingevoerd");
}


EDIT: overigens ben ik van mening dat het juist lekker makkelijk helpen is als je zoveel mogelijk van je code plaatst ;)

[ Voor 3% gewijzigd door Verwijderd op 09-05-2009 17:45 ]


Acties:
  • 0 Henk 'm!

  • XTREEMRaGE
  • Registratie: April 2003
  • Laatst online: 19:25

XTREEMRaGE

XTRËËM|RåGË

Topicstarter
@pheanix
Idd, er zal een sowieso een exception error komen als ik niks invul. Bij dat hoofdstuk ben ik nog niet, maar deze komt nog aanbod(Tnx voor de tip). En voor mij was het nog niet duidelijk waarom ik een error kreeg. Tnx voor de heldere uitleg ;).

Tnx @ de rest voor de input en creepy, ik moet idd nog leren te debuggen ;).

[ Voor 3% gewijzigd door XTREEMRaGE op 09-05-2009 22:52 ]

GöÐ, ®Ë§þËÇT åñÐ Höñöµ® | LÜ©K>SkïLL | XT®ËËM|®åGË ||Funky Monkeys || Fm


Acties:
  • 0 Henk 'm!

Verwijderd

Als je gaat debuggen kun je in het begin hhet beste starten met een breakpoint te zetten aan het begin van de methode die een aktie aanroept. Vervolgens gewoon door alle lines heenstappen tot je in de error komt, je kunt dan continu zien wat alle waardens zijn en wat er veranderd. Meestal zie je dan vrij snel waar het fout gaat en kom je met een nette oplossing..
Pagina: 1