String zu double, App Absturz ohne Exception (Samsung S3)

1

123thomas

Fortgeschrittenes Mitglied
44
Hallo,

ich programmiere schon etwas länger in C# und nun habe ich mich, da es auch sehr ähnlich ist, dem Java bzw. Android gewidmet. Ich bin derzeit dabei einen kleinen Taschenrechner zu programmieren. Bin auch schon ziemlich weit. Es ist ein Taschenrechner der auch den eingegebenen Rechenweg anzeigt.

Ich habe im Prinzip 3 double Werte Zahl1, Zahl2 und Ergebnis. Soweit so gut, in einem TextView (Anzeige) gebe ich Zahlen ein und das Ergebnis aus. Über der Anzeige ist ein weiteres TextView (Formelanzeige), welches den Rechenweg mit ausgibt.

Nun möchte ich wenn die Taste gleich betätigt wird(OnClickListener) den Rechenweg anzeigen lassen. Mein Problem ist, dass ich dabei die double Werte Zahl 1 und Zahl2 nicht umwandeln bzw casten kann. Ich habe schon folgendes versucht:

String Wert = Double.toString(Zahl1);
String Wert = String.valueOf(Zahl1);
String Wert = Zahl1 + "";
String Wert = (String) Zahl1;

Klasse mit Thread erstellen für die umwandlung
Methode mit double als Parameter und mit String als Return
usw.

Mein größtes Problem ist allerdings, dass bei dem Absturz keine Exception geworfen wird, womit man den Fehler finden kann.

Der Absturz sieht so aus, dass der Button betätigt bleibt, aber die App nicht angehalten wird. Es steht dort nicht nach kurzer Zeit:"Taschenrechner angehalten"

Ich kann eine Zahl in die Anzeige bringen und danach als String weiter verarbeiten. Es funktioniert aber nicht, das ich die aktuelle Anzeige speichere und dann einen Wert in die Anzeige schreibe und als String wieder auslese und danach den alten Wert wieder hineinschreibe.

Ich glaube der gesamte Quelltext würde hier den Rahmen sprengen aber ich schneide gleich nochmal die wichtigen Zeilen raus und hänge diese an.

Als Hinweis. Die App funktionierte vorher ohne die Rechenwegsanzeige. Nun wollte ich diese gerne einfügen. Wenn ich wichtige Details ausgelassen habe dann fragt bitte danach.

Code:
public void onClickButtongleich(View view)
    {
        try{
            if(gleichzweimal == false)
            {
                Zahl2=Double.parseDouble(Anzeige.getText().toString());//Zahl 2 aus Anzeige lesen
                Formelanzeigen.setText(Formelanzeigen.getText().toString() + " " + kommanullentfernen(Anzeige.getText().toString())); // Zahl 2 in Formelanzeige anzeigen (funktoniert ohne Probleme)
            }
            else
            {
                Zahl1=Double.parseDouble(Anzeige.getText().toString()); //Anzeige Zahl 1 
                AnzahlZeilenFormelauslesen(); //Anzahl der Zeile auslesen da nur 4 Zeiler erlaubt sind und dann eventuell kürzen
                Formelanzeigen.setText(Formelanzeigen.getText().toString() + System.getProperty("line.separator")); // Neue Zeile in der Formelanzeige einfügen
                //----------------Problem hier :------------------------------------------
                String Wert = Double.toString(Zahl2); //Double Wert in String umwandeln
                
                //Kompletten Rechenweg anzeige lassen( (aktuellen text mit anhängen) + (Anzeige auslesen(Zahl1) und aus "5.0" "5" machen)+ Leerzeile + rechenoperator + (Zahl2 und aus "5.0" "5" machen funktoniert nicht!!!)
                Formelanzeigen.setText(Formelanzeigen.getText().toString() + kommanullentfernen(Anzeige.getText().toString()) + " " + findeRechenoperator(rechenoperator) + " " + kommanullentfernen(zwischenspeicher));    
                //----------------Problem ende--------------------------
            }
            
            switch(rechenoperator) // Rechenoperator auswählen und dann rechnen
            {
            case 1:
                Ergebnis = Zahl1+Zahl2;
                break;
            case 2:
                Ergebnis = Zahl1-Zahl2;
                break;
            case 3:
                Ergebnis = Zahl1*Zahl2;
                break;
            case 4:
                Ergebnis = Zahl1/Zahl2;
                break;
            default:
                new AlertDialog.Builder(this).setMessage("Fehler: Es wurde kein Rechenoperator ausgewählt").setNeutralButton("Zurück", null).show();
                break;
                
            }
            Anzeige.setText(String.valueOf(Ergebnis)); //Ergebnis anzeigen
            long temp = (long) Ergebnis; //hier das gleiche Problem wie oben (long ist keine lösung da auch komma Zahlen vorkommen können)
            //Den Wert aus der Anzeige auslesen funktoniert auch nicht
            Formelanzeigen.setText(Formelanzeigen.getText().toString() + " = " + kommanullentfernen(String.valueOf(temp)));
            
            runden(); //Runden der Zahl auf die Stelle die in den Einstellungen angebenen ist.
            kommanullentfernen(); // aus "10.0" "10" machen 
            textanpassen(); // Textgröße der länge anpassen
            nachdemrundennullenweg(); //überflüssige Nullen nach dem Runden und hinter dem Komma entfernen
            
            gleichzweimal = true;
            rechenoperationenohnegleich = false;
        }
        catch(NumberFormatException ex)
        {
            new AlertDialog.Builder(this).setMessage("Fehler: Zahl enthält ungültige Zeichen.(" + Anzeige.getText().toString()+ ")").setNeutralButton("Zurück", null).show();
            
        }
        if(Anzeige.getText().toString() == "Infinity" )
        {
            Anzeige.setText("0");
            new AlertDialog.Builder(this).setMessage("Durch Null geteilt").setNeutralButton("Zurück", null).show();
        }
        if(Anzeige.getText().toString() == "NaN")
        {
            Anzeige.setText("0");
            new AlertDialog.Builder(this).setMessage("Fehlerhafte Rechnung").setNeutralButton("Zurück", null).show();
        }

Gruß Thomas
 
Zuletzt bearbeitet:
gib doch einfach die Zahl als Double aus?! Ich verstehe nciht warum du es unbedingt als String brauchst!
 
Ja das ist mein eigentliches Problem. Ich kann beim Rechen ganz normal das Ergebnis ausgeben in der Anzeige. Und diesen Wert auch weiter verarbeiten. Aber ich kann keine zweite Zahl in die Anzeige laden.

D.h. Ich kann über die Tasten der App Zahl 1 eingeben und Zahl 2 und dann auf gleich drücken und das Ergebnis wird angezeigt. Ich kann aber nicht:

Anzeige.setText(String.valueOf(Zahl2));

Das funktioniert nicht, obwohl
Anzeige.setText(String.valueOf(Ergebnis)); //Ergebnis anzeigen
funktioniert.

Gruß
 
Also:

Anzeige.setText((String.valueOf(deindouble)); funktioniert bei mir 1a. Eigentlich funktioniert das immer, da man dieser Methode alle primitiven Datentypen und was sonst noch übergeben kann.

Auch gerade noch anders ausprobiert:

private Double k = 1.1; (double ist nicht das gleiche wie Double)

Dann in der onClick Methode z.b.:
k = k + 0.1;
String Wert = k.toString();
text1.setText(Wert);

funktioniert auch 1a. Ich blicke da oben bei dir ehrlich gesagt noch nicht ganz durch, was du alles wie oft in irgendwas umwandelst. :blink:


Ehrlich gesagt kann ich mir nicht ganz vorstellen, dass du mit Logcat keinen Fehler angezeigt bekommst.

Persönlich würde ich aber die erste Variante bevorzugen und erst gar nicht den Wrapper Double nutzen.
 
Zuletzt bearbeitet:
Zahl2=Double.parseDouble(Anzeige.getText().toString());//Zahl 2 aus Anzeige lesen


ist Zahl 2 ein Double oder ein primitiver double?
 
Auch mit Double funktioniert es leider auch nicht.:confused2:

Ich hab nun nochmal den Logcat angehängt. Da sieht man was das Handy macht nur hilft mir das nicht weiter. Eventuell wisst ihr was das bedeutet.

Gruß
 

Anhänge

  • log.txt
    230,3 KB · Aufrufe: 115
Mein lieber Herr Gesangsverein.........WARUM springt denn bei dir so oft der Garbage Collector an ach du k****

Das killt dann den memory speciher und du fragmentierst den speciher bis nciht mehr genügend speicherplatz an einem stück übrig ist um ihn für deine objekte zu allokieren.

OK versuch mal deinen Code zu säubern und so oft wie möglich objekte und primitive datentypen wieder zu verwenden.....
Oh man das ist schon Krass wie du selbst sehen kannst ist dein Programm ja nur am Garbage Collecten das ergibt schon ein großen OverHead und er wirft dir den error OutOfMemory denke ich irgendwann

also versuch mal damit man ausschließen kann das ich mich nciht irre alles kritische in einen Try block zu packen und ein

catch(OutOfMemoryError e) {
// logcat ausgabe
}
zwischen zu schieben:


Gruß
 
So ich hab es lösen können.

Das Problem lag nicht an der Umwandlung von Double zu String. Sondern an der Methode kommanullentfernen.

In der Methode war eine while schleife integriert, welche die nullen und das Komma entfernen sollte wenn welche vorhanden war. Doch das war eine endlos Schleife, da ich vergessen hatte den gekürzten String wieder einzulesen und somit er immer den gleichen String kürzen sollte. Deswegen ist die App dann abgestürzt.

Danke an alle die geholfen haben.

Gruß
 
String#replace ()?!

LG. Dagobert
 
ne nicht ganz. Hier das Problem verdeutlicht:

vorher:(String wird um eine Stelle gekürzt, aber nit zurück in die Variable Zahlmitkommanull geschreiben. Somit hat die while schleife immer den gleichen String bekommen)
Code:
while(Zahlmitkommanull.endsWith(".0") || Zahlmitkommanull.endsWith(".")|| (Zahlmitkommanull.contains(".") && Zahlmitkommanull.endsWith("0")))
            {
                Rückgabe = (Zahlmitkommanull.substring(0, (Zahlmitkommanull.length()-1))).toString(); //String um eine Stelle gekürzt. Aber nicht in die Variable Zahlmitkommanull geschrieben.
            }
nacher:
Code:
while(Zahlmitkommanull.endsWith(".0") ||  Zahlmitkommanull.endsWith(".")|| (Zahlmitkommanull.contains(".")  && Zahlmitkommanull.endsWith("0")))
            {
                Zahlmitkommanull = (Zahlmitkommanull.substring(0, (Zahlmitkommanull.length()-1))).toString(); //eine Stelle kürzen und in die Variable schreiben
                Rückgabe = Zahlmitkommanull; //und Zurück geben
            }
Ich hoffe, dass das verständlich ist.
Gruß
 

Ähnliche Themen

Manny87
  • Manny87
Antworten
11
Aufrufe
161
swa00
swa00
R
  • Robby1950
2
Antworten
23
Aufrufe
1.007
Robby1950
R
B
Antworten
4
Aufrufe
472
bb321
B
Zurück
Oben Unten