Avatar billede nbj1 Praktikant
28. februar 2003 - 15:59 Der er 72 kommentarer og
1 løsning

typeCast

hejsa igen :)
Et array med objekter eks kontonr , beloeb, rente
der er så en metode til saldo()
som return saldo
saldo er double og jeg skal fange den saldo i gui
jeg har prøvet med return (String) saldo
prøvet skrive der hvor jeg skal bruge det ((saldo)konto).saldo() den sidste er jeg meget i tviv med men på en eller anden måde skal den castes hvordan????
Avatar billede miknil Nybegynder
28. februar 2003 - 16:05 #1
Hvis du har et Double objekt

return saldo.toString();

Hvis din double er en simpel type

Double aTmp = new Double(saldo);

return aTmp.toString();


eller på den grimme facon:

return ""+saldo;

miknil
Avatar billede arne_v Ekspert
28. februar 2003 - 16:12 #2
Det er lidt svært at sige udfra dine oplysninger, men jeg vil tro at:

Object o = a.get(i);
double saldo = ((konto)o).saldo();

eller den mere kompake:

double saldo = ((konto)a.get(i)).saldo();

er det du søger.
Avatar billede nbj1 Praktikant
28. februar 2003 - 16:15 #3
metoden er denne i klassen Konto:
    public double Saldo()
    {   
        return (String) saldo;
    } // saldo

og skal bruge den i denne her metode
    public void saldo()
    {
        String s = ("" + konto.Saldo());
        lab2.setText(saldoTxt + s + "" + result + " Kr.");
        lab2.setVisible(true);
        txt1.setVisible(false);
        pack();
    }               
håber det hjælper lidt
Avatar billede nbj1 Praktikant
28. februar 2003 - 16:16 #4
String s = ("" + konto.Saldo());
        lab2.setText(saldoTxt + s + "" + result + " Kr.");
disse to er test jeg har prøvet men uden resultat desvære :(
Avatar billede arne_v Ekspert
28. februar 2003 - 16:18 #5
Du kan ikke have en metode som du erklærer til at returnere en double
men faktisk returnerer en String.
Avatar billede arne_v Ekspert
28. februar 2003 - 16:20 #6
public double Saldo()
    {   
        return saldo;
    } // saldo

eller:

    public String Saldo()
    {   
        return Double.tostring(saldo);
    } // saldo
Avatar billede arne_v Ekspert
28. februar 2003 - 16:21 #7
Og du behøver slet ikke lave en masse konverteringer:

lab2.setText(saldoTxt + konto.saldo() + "" + result + " Kr.");

bør virke fint (med begge saldo metoderne).
Avatar billede nbj1 Praktikant
28. februar 2003 - 16:21 #8
jo men Saldo er jo en double men den skal bruges i gui
Avatar billede nbj1 Praktikant
28. februar 2003 - 16:23 #9
Opgave6.java:165: cannot resolve symbol
symbol  : method saldo  ()
location: class Konto
        lab2.setText(saldoTxt + konto.saldo() + "" + result + " Kr.");
                                            ^
1 error
Avatar billede nbj1 Praktikant
28. februar 2003 - 16:26 #10
den er lidt trigi men result viser fint nok at det konto nr jeg taster ind ligger på eks plads 0 men skal have beløbet med i et tekst felt alså indestående
Avatar billede arne_v Ekspert
28. februar 2003 - 16:27 #11
Hov undskyld.

Du har jo Saldo med stort ikke saldo med småt.

Jeg prøver igen:
lab2.setText(saldoTxt + konto.Saldo() + "" + result + " Kr.");
Avatar billede arne_v Ekspert
28. februar 2003 - 16:29 #12
Nu er der ikke nogle af dine kode fragmenter som viser hvordan
du bruger array.

Så jeg tror vi skal have lidt mere kode.
Avatar billede nbj1 Praktikant
28. februar 2003 - 16:30 #13
Konti.getInstance().addKonto(new Konto("1111111", 2323.0, 2.5));
Avatar billede nbj1 Praktikant
28. februar 2003 - 16:34 #14
fint med stort S i saldo men så får jeg det som jeg desvære hele tiden får:
Exception occurred during event dispatching:

java.lang.NullPointerException

    at Opgave6.saldo(Opgave6.java:165)

    at Opgave6$RadioListener.actionPerformed(Opgave6.java:182)

    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1450)

    at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1504)

    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:378)

    at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:268)

    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:216)

    at java.awt.Component.processMouseEvent(Component.java:3715)

    at java.awt.Component.processEvent(Component.java:3544)

    at java.awt.Container.processEvent(Container.java:1164)

    at java.awt.Component.dispatchEventImpl(Component.java:2593)

    at java.awt.Container.dispatchEventImpl(Container.java:1213)

    at java.awt.Component.dispatchEvent(Component.java:2497)

    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:2451)

    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:2216)

    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:2125)

    at java.awt.Container.dispatchEventImpl(Container.java:1200)

    at java.awt.Window.dispatchEventImpl(Window.java:926)

    at java.awt.Component.dispatchEvent(Component.java:2497)

    at java.awt.EventQueue.dispatchEvent(EventQueue.java:339)

    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:131)

    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:98)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)

    at java.awt.EventDispatchThread.run(EventDispatchThread.java:85)

og det jeg får udaf det er at jeg er løbet udover mit array men ????
Avatar billede arne_v Ekspert
28. februar 2003 - 16:42 #15
En null pointer exception kan meget vel skyldes at du er kørt
ud over antal elementer.
Avatar billede arne_v Ekspert
28. februar 2003 - 16:43 #16
Hvis du bruger en ArrayList (eller en af de andre collections)
er der en size() metode der returnerer antal elementer i arrayet.
Avatar billede nbj1 Praktikant
28. februar 2003 - 17:02 #17
yes arne ved jeg men det der gør jeg løver udover mit array er at den ikke kan finde den saldo efter min mening da den finder konto nr godt nok men så skal jeg have trukket beløbet ud arrayet bliver kørt igen med en forløkke i
  public int findKontoNummer(String nummer) {
        for( int i = 0; i < konti.size(); i++ ) {
            if( ((Konto)konti.get(i)).getnummer().equals(nummer) )
                return i;
        }
        return -1;
Avatar billede nbj1 Praktikant
28. februar 2003 - 17:03 #18
men jeg skal vel ikke lave en ny løkke for at finde beløb ?
Avatar billede arne_v Ekspert
28. februar 2003 - 17:09 #19
Nej.

int ix = findKontoNummer(nr);
if(ix >= 0) {
  Konto kto = (Konto)konti.get(ix);
  System.out.println("saldo for konto " + nr + " er " + kto.saldo());
} else {
  System.out.println("Konto " + nr + " eksisterer ikke");
}
Avatar billede nbj1 Praktikant
28. februar 2003 - 17:50 #20
ørh nu er du jo ikke system.out jeg skal bruge da det anvendes i gui
Avatar billede miknil Nybegynder
28. februar 2003 - 17:58 #21
Hvis du får en null pointer exception så kunne det jo tænkes at

konti.get(i)

eller

((Konto)konti.get(i)).getnummer()

returnerede null.


for( int i = 0; i < konti.size(); i++ )
{
    Konto aKonto = (Konto)konti.get(i);
    if (aKonto == null)
        throw new Exception("Konto = null  - i=" + i);   

    String aNummer = aKonto.getnummer();
    if (aNummer == null)
        throw new Exception("Nummer = null  - i=" + i);   

    if (aNummer.equals(nummer))
        return i;
}
return -1;

miknil
Avatar billede miknil Nybegynder
28. februar 2003 - 17:59 #22
Så får du da i det mindste en mere sigende exception.
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:06 #23
for at vende tilbage til cast :)
    public double Saldo()
    {   
        Double aTmp = new Double(saldo);

        return aTmp.toString();
        }
skulle det så virke den påstår dette
Konto.java:26: incompatible types
found  : java.lang.String
required: double
        return aTmp.toString();
Avatar billede miknil Nybegynder
28. februar 2003 - 18:08 #24
To muligheder

public String Saldo()  {   
        Double aTmp = new Double(saldo);
        return aTmp.toString();
}

eller

public double Saldo(){   
        Double aTmp = new Double(saldo);
        return aTmp.doubleValue();       
  }
Avatar billede miknil Nybegynder
28. februar 2003 - 18:09 #25
Du fortæller compileren du ønsker at returnere en double

public double Saldo()

Men istedet returnerer du en String

return aTmp.toString();


miknil
Avatar billede miknil Nybegynder
28. februar 2003 - 18:13 #26
Hvis du ønsker at returnere en double og din member variable saldo er af samme type er der ingen grund til at involvere Klassen Double, istedet kan du returnere den direkte.

public double Saldo()
{   
  return saldo;
}
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:14 #27
ørh jo var det ikke lige hensigten at jeg skulle lave en double om til en String da det vel kan bruges direkte i GUI ?
Avatar billede arne_v Ekspert
28. februar 2003 - 18:15 #28
Se lige mit 16:20:06 indlæg.
Avatar billede arne_v Ekspert
28. februar 2003 - 18:17 #29
Det betyder ikke så meget om det er console eller GUI bare
erstat System.out.println med label.setText:

Nej.

int ix = findKontoNummer(nr);
if(ix >= 0) {
  Konto kto = (Konto)konti.get(ix);
  label.setText("saldo for konto " + nr + " er " + kto.saldo());
} else {
  label.setText("Konto " + nr + " eksisterer ikke");
}
Avatar billede miknil Nybegynder
28. februar 2003 - 18:17 #30
Så bruger du

public String Saldo() 
{   
        Double aTmp = new Double(saldo);
        return aTmp.toString();
}
Avatar billede arne_v Ekspert
28. februar 2003 - 18:17 #31
Og der bør slet ike være nogle konverterings-problemer.
Avatar billede miknil Nybegynder
28. februar 2003 - 18:18 #32
Som i mit 16:05:20 indlæg
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:19 #33
public String Saldo()
    {   
        return Double.tostring(saldo);
    } // saldo
rigtigt nok skulle bare være et stort S arne
Avatar billede arne_v Ekspert
28. februar 2003 - 18:24 #34
miknil>

    public String Saldo()
    { 
        return Double.tostring(saldo);
    } // saldo

er meget bedre end:

public String Saldo()

        Double aTmp = new Double(saldo);
        return aTmp.toString();
}

[der er ikke nogen grund til at create et temporært objekt]
Avatar billede miknil Nybegynder
28. februar 2003 - 18:25 #35
Nej Arne det er det ikke!

Fordi
  return Double.tostring(saldo);

Giver en compile fejl
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:27 #36
godt nu er metoden saldo en String så skulle jeg da kunne hente den sådan ik ?
lab2.setText(saldoTxt + konto.Saldo() + " Kr.");
Avatar billede arne_v Ekspert
28. februar 2003 - 18:27 #37
nbj1>

En af de ting der forvirrer os er at man traditionelt har klasse
navne startende med store bogstaver og metode navne startende med
små bogstaver.
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:28 #38
nej den gør ikke miknil mangler bare et S string :)
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:30 #39
arne klassen starter oxo med stort og metoden med småt ??????
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:30 #40
hvis du hentyder til String er det en klasse arne
Avatar billede arne_v Ekspert
28. februar 2003 - 18:30 #41
miknil>

uppercase det s fra tostring til toString, så virker det !
Avatar billede arne_v Ekspert
28. februar 2003 - 18:32 #42
nbj1>

Jeg havde fået det indtryk at metoden saldo var med stort Saldo.

Jeg kan jave taget fejl.
Avatar billede miknil Nybegynder
28. februar 2003 - 18:33 #43
Interessant nok er Saldo_2() ca dobbelt så hurtig på min maskine

    double saldo=12;
    public String Saldo_1()    { 
        return Double.toString(saldo);
    }

    public String Saldo_2()  { 
        Double aTmp = new Double(saldo);
        return aTmp.toString();
    }

  public static void main(String[] args) {
        Test aTester = new Test();
       
        long aStart = System.currentTimeMillis();
        for(int i=0;i<100000;i++)
            aTester.Saldo_1();
       
        long aEnd = System.currentTimeMillis();
       
        System.out.println("1 = "+(aEnd-aStart));
 

        aStart = System.currentTimeMillis();
        for(int i=0;i<100000;i++)
            aTester.Saldo_2();
       
        aEnd = System.currentTimeMillis();
       
        System.out.println("2 = "+(aEnd-aStart));
  }


miknil
Avatar billede miknil Nybegynder
28. februar 2003 - 18:34 #44
> Arne

"uppercase det s fra tostring til toString, så virker det !"

I know
Avatar billede miknil Nybegynder
28. februar 2003 - 18:37 #45
> 18:33:23
Lidt for upræcist! Et par nuller extra, og så er de lige hurtige:
Avatar billede miknil Nybegynder
28. februar 2003 - 18:38 #46
Sku man gætte på der kommer præcis det samme bytecode ud i den anden ende ?
Avatar billede miknil Nybegynder
28. februar 2003 - 18:39 #47
Så muligvis dit forslag ikke er

"meget bedre end:"

mit ?
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:40 #48
hee det er da godt med scrol mouse så lang dette tema er ved at blive det er ligegyldigt om det tager en tidel sekundt længre/kortere
lab2.setText(saldoTxt + konto.saldo() + " Kr.");
det der er at konto.saldo() ikke fanger saldoet :)
Avatar billede miknil Nybegynder
28. februar 2003 - 18:43 #49
>nbj1
Beklager, jeg lod mig rive med :-(
miknil.
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:44 #50
med dette kan jeg få alle konti´s skrevet ud men jeg skal kun have på det specifige kontonr??
lab2.setText(saldoTxt + Konti.getInstance().getKonti() + " Kr.");
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:47 #51
bare ok miknil :)
Avatar billede miknil Nybegynder
28. februar 2003 - 18:49 #52
Hvad præcis får du ud på din GUI,
efter

lab2.setText(saldoTxt + konto.saldo() + " Kr.");

Bliver konto.saldo() til "0" eller "" ? eller andet

miknil
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:50 #53
null pointer miknil
Avatar billede miknil Nybegynder
28. februar 2003 - 18:53 #54
Hvis du får en nullpointer Exception så må konto==null

I så fald må det være koden der finder konto frem der er problemet.
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:57 #55
nej for når jeg skriver eks kontonr 1111111 så får jeg at kontoen er på plads 1
det giver  + result
lab2.setText(saldoTxt + "" + result + " Kr.");
Avatar billede nbj1 Praktikant
28. februar 2003 - 18:58 #56
for at komme ind skriver jeg
    int result = Konti.getInstance().findKontoNummer(kontonummerTextField.getText());
                if( result > -1  )
                    kontrol();
Avatar billede miknil Nybegynder
28. februar 2003 - 18:59 #57
Lidt uddybning ville hjælpe.
Konti.getInstance() er en singleton "?" der returnerer et objekt af typen
Konti ?

Konti.getInstance().getKonti() returner et array (collection af en slags) af Konto objekter ?







Konto aKonto = (Konto)konti.get(i);
Avatar billede miknil Nybegynder
28. februar 2003 - 19:05 #58
Prøv at tilføje lidt ektra checks før du opdaterer lab2

Konto konto = (Konto)konti.get(i);
  if (konto == null) 
    lab2.setText("konto = null");
Avatar billede miknil Nybegynder
28. februar 2003 - 19:06 #59
Jeg kommer til at smutte nu, held og lykke - håber du får løst dit problem!

miknil
Avatar billede arne_v Ekspert
28. februar 2003 - 19:06 #60
miknil>

De generere ikke samme byte code.

Og Saldo_2 er ca. 7 % langsommere end Saldo_1, hvilket du kan
se ved at loope tilstrækkeligt mange gange.

Det snyder ved få loops, fordi cost ved Saldo_2 delvist ligger ved
når de temporære objekter skal GC'es. Og ved få loops sker det
efter at du har sat aEnd !
Avatar billede miknil Nybegynder
28. februar 2003 - 19:11 #61
Arne> Jeg får samme resultat

Også med loops der kører længe > (over 2 minut)

miknil
Avatar billede miknil Nybegynder
28. februar 2003 - 19:11 #62
For Saldo_1 og Saldo_2 altså!
Avatar billede arne_v Ekspert
28. februar 2003 - 19:25 #63
Hmmm.

Java HotSpot(TM) Client VM (build 1.3.1-b24, mixed mode)

1 = 7360
2 = 7906

Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode)

1 = 9188
2 = 11859

Classic VM (build 1.3.0, J2RE 1.3.0 IBM build cn130-20010609 (JIT enabled: jitc))

1 = 14140
2 = 15735

BEA WebLogic JRockit(R) Virtual Machine (build 8.0-1.4.1_01-win32-CROSIS-20030124-1058, Native Threads, Generational Concurrent Garbage Collector)

1 = 7250
2 = 7812
Avatar billede arne_v Ekspert
28. februar 2003 - 19:27 #64
nbj1>

Kan du poste hele din kode, så vi vi selv kan prøve at se, hvad der går galt ?

Jeg har ihvertfald tabt overblikket !
Avatar billede nbj1 Praktikant
28. februar 2003 - 19:32 #65
hee så skal jeg have en email da det er 6 filer arne
Avatar billede miknil Nybegynder
28. februar 2003 - 19:33 #66
Skulle du ikke overveje at afinstallere mindst 1 af dine JVM'er ? :-)
Java HotSpot(TM) Client VM (build 1.4.0_01-b03, mixed mode)

1 = 14782
2 = 15141

Et hurtigt overslag - ca 2.5 %

miknil
Avatar billede nbj1 Praktikant
28. februar 2003 - 19:34 #67
kan jeg godt forst arne jeg har fillerne men jeg kan ikke selv finde fejlen :)
Avatar billede arne_v Ekspert
28. februar 2003 - 19:37 #68
Du kan sende til arne_v@mail.danbbs.dk
Avatar billede nbj1 Praktikant
28. februar 2003 - 19:43 #69
er hermed sendt hvis du har msn eller icq kan vi fortsætte derover
Avatar billede arne_v Ekspert
28. februar 2003 - 19:44 #70
miknil>

Nej - jeg har brug for alle 4.
Avatar billede arne_v Ekspert
28. februar 2003 - 19:56 #71
Opgave6.java:

    public void kontrol()
    {
                Konti ktos = Konti.getInstance(); // <--------
                konto = (Konto)ktos.getKonti().get(ktos.findKontoNummer(kontonummerTextField.getText())); // <-----
   
            rab1.setVisible(true);
        rab2.setVisible(true);
        rab3.setVisible(true);
        pack();
       
    }


    public void saldo()
    {
        lab2.setText(saldoTxt + konto.Saldo() + " Kr."); // <-----------------
        lab2.setVisible(true);
        txt1.setVisible(false);
        pack();
    }
Avatar billede arne_v Ekspert
28. februar 2003 - 19:57 #72
Så kan jeg ihvertfald få en saldo ud !
Avatar billede nbj1 Praktikant
28. februar 2003 - 21:06 #73
det har du ret i arne
Konti ktos = Konti.getInstance(); // <--------
                konto = (Konto)ktos.getKonti().get(ktos.findKontoNummer
de to linier gør forskellen
hi så skal jeg bare finde udaf hæv og indsæt tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester