Java Taschenrechner spezialisieren?

2 Antworten

Hallo TwoFace2206,

Du möchtest, dass deine Methode mir Nutzerinteraktion ermöglicht. Grundsätzlich könntest Du natürlich irgendwelche "Zusatzfunkionen" in deine Methode einbauen, die dafür sorgen, dass eine tolle Nachricht auf dem Bildschirm erscheint.

Sauberer ist es allerdings deine Methode readDoubleValue nicht mit derartigen Funktionen zu "überlasten". Willst Du die Methode zum Beispiel an anderer Stelle nochmal verwenden, diesmal aber ohne die Bildschirmmeldung, dann wird es noch komplizierter das alles über die Methode zu realisieren.

Darum der Vorschlag die Methode so zu ändern:

public static Double readDoubleValue(Scanner scanner) {
    try {
        return scanner.nextDouble();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    
    return null;
}

Wie Du siehst gibt die Methode den gelesenen Double-Wert zurück, oder eben null, wenn dies nicht möglich war. Wenn Du also die Methode readDoubleValue aufrufst, dann musst Du überprüfen ob null zurückgegeben worden ist, falls ja eine Meldung ausgeben, dass nur Zahlen eingegeben werden dürfen.

Nun ist natürlich die große Frage wie der Taschenrechner genau implementiert ist, damit man dir an der Stelle helfen kann wie Du die Ausgabe mit dem Warnhinweis genau machst.

Ansonsten, da es sich um eine Übung handelt noch ein paar zusätzliche Worte.

Warum ist die Methode static? Warum muss Scanner immer wieder an die Methode übergeben werden?

Könntest Du dir vorstellen ein Klasse zu schreiben die einen Scanner als Member besitzt? Wäre es evtl. sinnvoll dem Konstruktor dieser Klasse ein java.lang.Readable zu übergeben und deine Eingabeklasse würde sich dann einen eigenen Scanner erstellen um mit dem Readable umzugehen?

Könntest Du dir vorstellen dass so eine Methode funktioniert, bzw. ob diese evtl. besser/sauberer ist:

public Double readNextDoubleValue() ...

Nochmal zum Thema Rückgabetyp (in meinem Beispiel jetzt Double). Was man an der Stelle versucht ist verschiedene Informationen zu transportieren. Einmal den Double-Wert, falls die Eingabe korrekt war und einmal eine Falscheingabe über null.

Wenn man das weiter denkt, dann kann man auch einen eigenen Rückgabetyp definieren a la:

public class InputResult {
    
    private final double resultValue;
    private final int statusCode;
    
    public InputResult(double resultValue, int statusCode) {
        this.statusCode = statusCode;
        this.resultValue = resultValue;
    }

    public double getResultValue() {
        return resultValue;
    }

    public int getStatusCode() {
        return statusCode;
    }
}

statusCode kann jetzt auf verschiedene Werte gesetzt werden um verschiedene Erfolgs- und Fehlerfälle abzubilden.

Nun hat das den Nachteil, dass verschiedene Stellen im Code "Kenntnis" darüber haben müssen was welcher Statuscode genau bedeutet. Abhängig davon wie weit Du mit Java schon bist kannst Du auch einen enum benutzen:

public class InputResult {

    public enum StatusCode {
        NOT_A_NUMBER,
        VALID_NUMBER,
        POSITIVE_INFINITY,
        NEGATIVE_INFINITY,
        NO_INPUT
    }

    private final Double resultValue;
    private final StatusCode statusCode;

    public InputResult(double resultValue, StatusCode statusCode) {
        this.statusCode = statusCode;
        this.resultValue = resultValue;
    }

    public double getResultValue() {
        return resultValue;
    }

    public StatusCode getStatusCode() {
        return statusCode;
    }
}

StatusCode wird eindeutig hier und nur hier definiert. Enums unterstützen equals, Du kannst also sichere Vergleiche mit ihnen durchführen ohne sogenannte MagicNumbers zu nutzen.

Da das jetzt alles wohl schon etwas zu viel für die eigentliche Frage war und man ganze Abhandlungen dazu machen könnte ... frag einfach nochmal nach wenn Du nicht weiter kommst.

Gruß und viel Spaß

Du machst es ja fast richtig :) du musst die Schleife solange laufen lassen, bis ein gültiger Wert eingegeben wurde. Du gehst die ganze Zeit davon aus, dass der Wert gültig ist. Deine Schleife müsste endlos laufen, aber Du hast das return in der Schleife, so dass in Deinem Code die Schleife komplett sinnlos ist.

Es müsste also heißen:

protected static double readDoubleValue(Scanner scanner) 
{
    double d = 0;
    boolean gültig = false;
    while (!gültig)
    {
        try 
        {
            d = scanner.nextDouble();
            gültig = true;
        } 
        catch (Exception ex) 
        {
            System.out.println("...");   
        }
    }

    return d;
}
TwoFace2206 
Fragesteller
 15.03.2018, 10:46

Ja aber wie kann ich dem Programm den jetzt sagen das es wenn der nutzer buchstaben anstatt zahlen eingibt er diese nicht werten darf?

0
ohwehohach  15.03.2018, 10:48
@TwoFace2206

Das tut dieser Quellcode automatisch. Sobald Du etwas eingibst, was keine gültige Double-Zahl ist, wird eine Exception geworfen und die Schleife beginnt von Neuem. Nur wenn Du eine gültige Double-Zahl eingibst, wird auch gültig auf true gesetzt und somit endet die Schleife. Probier's ;-)

1
TwoFace2206 
Fragesteller
 15.03.2018, 10:53
@ohwehohach

habs grad versucht laufen zulassen da wurden als ich einen buchstaben geschrieben habe durch gehende diese punkte angeschrieben

0
ohwehohach  15.03.2018, 10:56
@TwoFace2206

In einer Schleife? Hmmm. Was sagt er denn dann im Exceptiontext? Alternative Lösung:

Lies einen String ein mit dem Scanner. Mache die Konvertierung nach Double selbst. Dann hast Du es selbst im Griff und kannst auch besser Debuggen als wenn die komplette Fehlerbehandlung in der Scanner-Klasse abläuft.

Beispiel:

protected static double readDoubleValue(Scanner scanner) 
{
    double d = 0;
    boolean gültig = false;
    while (!gültig)
    {
        try 
        {
            String s = scanner.next();
            d = Double.parseDouble(s);
            gültig = true;
        } 
        catch (Exception ex) 
        {
            System.out.println("...");   
        }
    }

    return d;
}
1
TwoFace2206 
Fragesteller
 15.03.2018, 11:01
@ohwehohach

Ja diese drei Prunkte von System.out.println kommen wie als wäre das in einer Schleife... ich hatte mir vorhin überlegt dass ganze mit if unf if else zu machen weis aber hierbei nicht wie ich dass anstellen könnte.. aber das habe ich halt bereits im praktikum gelernt ich bin erst seit Montag in dieser Fachrichtung deshalb habe ich eigentlich fast nie einen schimmer was ich eig. mache aber meistens hauts hin :D Könnte ich den theoretisch if und if else hier einfügen?

0
ohwehohach  15.03.2018, 11:02
@TwoFace2206

Wozu? Was willst Du denn mit if/else hier erreichen? Prüfe mal, ob der Code in meinem letzten Kommentar es besser macht. Das Problem ist doch jetzt, dass nach einer falschen Eingabe der Scanner immer wieder eine falsche Eingabe liefert. Daher die Endlosschleife.

1
TwoFace2206 
Fragesteller
 15.03.2018, 11:05
@ohwehohach

Ja funktioniert, aber jetzt vermisse ich den Text wo er den nutzer darauf hinweist dass buchstaben nicht gültig sind... was machten diese drei punkte bei Sytem.out.println? und was genau bewikrt diese string s = scanner next?

0
ohwehohach  15.03.2018, 11:08
@TwoFace2206

Naja, was macht denn System.out.println? Es gibt den Text in der Klammer aus. Die drei Punkte habe ich nur hingeschrieben, weil Deine Meldung so lang war. Füge einfach statt der drei Punkte Deine Meldung ein.

Was hat denn die Zeile

d = scanner.nextDouble()

gemacht?

String s = scanner.next()

macht dasselbe für den Datentyp String ;-)

1
TwoFace2206 
Fragesteller
 15.03.2018, 11:11
@ohwehohach

oke habe jetzt ein weiteres problem gefunden. Wenn der Rechner mir sagt "Bitte die erste Zahl eingeben:" und ich gebe von vornherein éinen buchstaben an macht er nichts auser bsp "a" anzeigen und eine zeile runterrutschen wenn ich dann nochmal "a" eingebe zeigt er das "a" an und darunter die drei Punkte.

0
ohwehohach  15.03.2018, 11:12
@TwoFace2206

Dafür müsste man den umgebenden Code kennen. Vermutlich steht da noch ein überschüssiges Einlesen eines Werts. Das kann ich aber nur raten, weil ich ja den aufrufenden Code nicht kenne.

1
TwoFace2206 
Fragesteller
 15.03.2018, 11:12
@TwoFace2206

und wie mache ich das gleiche prinzip für das rechenzeichen?

0
ohwehohach  15.03.2018, 11:15
@TwoFace2206

Nein :-) Jetzt habe ich Dir einen Tipp gegeben. Und jetzt schmeißt Du mal den Debugger an und schaust im Einzelschrittmodus, wie Dein Programm abläuft. Vielleicht wird dann auch noch einiges klarer.

Ich bin ja nicht dafür da, Deine Aufgabe zu lösen - ein bisschen musst Du schon selbst rausfinden ;-)

1
TwoFace2206 
Fragesteller
 15.03.2018, 11:17
@ohwehohach

haha okey ich werd mein bestes geben aber für micht sieht das meiste noch aus wie lauter Fragezeichen :D Ich hoffe ich kann mich nochmal rühren wenn ich nicht weiter kommen sollte :D Aber vielen Dank für die Hilfe :D

1
TwoFace2206 
Fragesteller
 15.03.2018, 14:18
@ohwehohach

Hallo nochmal,

ich habe das ganze vorhin meinem Praktikumsleiter zukommen lassen per skype und er hat das ganze für mich verbessert mir gezeigt wie was gehört hat dann die richtige Lösung wieder gelöscht und mir nur einen teil seiner verbesserungen geschickt. Leider versteh ich jetzt überhaupt nix mehr kann ihn nicht erreichen und verzweifle langsam da jetzt iwie alles anders ist...

protected static String readDoubleValue(Scanner scanner)

   {

      String sign = "";

      boolean gültig = false;

      while (!gültig)

      {

          try

          {

             sign = scanner.next();

             // ...

              gültig = true;

          }

          catch (Exception ex)

          {

              System.out.println("Buchstaben können nicht verarbeitet werden. Bitte wiederholen:");  

          }

      }

      return sign;

Dass ist seine Lösung und bei dem //... soll ich weiter machen aber was genau muss ich dort jetzt reinschreiben bzw wie soll ich da weiter schreiben? Er hat es soweit gelöscht dass das ganze Programm nicht mehr Funktioniert... würde mich freuen wenn du weiterhelfen kannst

danke bereits im vorraus :)

0
TwoFace2206 
Fragesteller
 15.03.2018, 14:28
@TwoFace2206

wie ich soeben festgestellt habe liegt nun ein problem ganz am anfang des programmes vor. dort hatte ich bereits eine while schleife damit der nutzer die zahlen und das rechenzeichen eingeben kann. dort wird mir jetzt aber bei der ersten zahl " zahl1 = Versuch.readDoubleValue(scannerVariable);" beim rechenzeichen " zeichen = Versuch.readSign(scannerVariable);" und bei der zweiten zahl "zahl2 = Versuch.readDoubleValue(scannerVariable);" folgendes angezeigt:

Type mismatch: cannot convert from String to double

   Type mismatch: cannot convert from double to String

   Type mismatch: cannot convert from String to double

was bedeutet das?

0
regex9  15.03.2018, 15:05
@TwoFace2206

Dort steht, dass du versuchst, eine Gleitkommazahl als String zu behandeln, was ohne Typecast nicht geht.

1
ohwehohach  16.03.2018, 08:37
@TwoFace2206

Dieser Quellcode ist "Quatsch". Warum sollte eine Methode, die "readDoubleValue" heißt, einen String zurückgeben?

Vermutlich soll die "readSign" heißen. Bei // ... müsstest Du dann eben prüfen, ob ein gültiges Rechenzeichen (also +, -, *, /) eingegeben wurde und nicht beispielsweise §.

1
ohwehohach  16.03.2018, 08:38
@TwoFace2206

Das heißt, dass Du versuchst, einer double-Variablen einen String zuzuweisen (bzw. umgekehrt). Das geht nicht. Das liegt vermutlich an der falschen Signatur der readDoubleValue Methode.

1
TwoFace2206 
Fragesteller
 16.03.2018, 09:41
@ohwehohach

Ich habe jetzt so manches verschoben da ich ja zwei Methoden habe eine für das Rechenzeichen und eine für die zahalen. das gute ist ich habe jetzt schon mal keine roten linien drinen das schlechte ist ich kann wieder buchstaben eingeben ohne das das programm entwas bemengelt .. ich blicke heute überhaupt nicht mehr durch... es folgt mein code für zahlen und rechenzeichen. wo ist der fehler? :

/**

   * Diese Methode liest auf sichere Art und Weise eine Zahl ein.

   *

   * @param scanner

   * @return

   */

   protected static double readDoubleValue(Scanner scanner)

   {

     double d = 0;

      boolean gültig = false;

      while (!gültig)

      {

          try

          {

             String s = scanner.next();

             // ...

              gültig = true;

          }

          catch (Exception ex)

          {

              System.out.println("Buchstaben können nicht verarbeitet werden. Bitte wiederholen:");  

          }

      }

      return d;

   }

   protected static String readSign(Scanner scanner)

   {

      String sign = "";

      boolean gültig = false;

      while (!gültig)

      {

          try

          {

          sign = scanner.next();                

             // ...

              gültig = true;

          }

          catch (Exception ex)

          {

              System.out.println("Bitte geben Sie ein gültiges Rechnezeichen ein.");  

          }

      }

      return sign;

   }

}

0
regex9  16.03.2018, 09:54
@TwoFace2206

Schau doch mal in die Dokumentation für die Scanner-Klasse. Dort gibt es bereits entsprechende Methoden, um Zahlen einzulesen.

Ansonsten, wie dir bereits gesagt wurde, mal einen Debugger nutzen und Code hier bitte formatieren, der GF-Editor bietet dafür Code-Tags an. Oder du postest deinen Code via Pastebin.

1
ohwehohach  16.03.2018, 09:59
@regex9

Hast Du den kompletten Thread gelesen? Es geht ja gerade darum, dass es mit den Methoden der Scanner-Klasse eben nicht so funktioniert hat, wie gewünscht.

0
TwoFace2206 
Fragesteller
 16.03.2018, 10:04
@regex9

sehr frundlich das mir eine weitere person verushct zuhelfen mein problem zulösen dafür bereits einmal ein dankeschön. Leider weis ich nicht was du mit "Dokumentation für die Scanner-Klasse" meinst ich mache seid Montag ein Praktikum als Fachinformatiker und habe Null vorkenntnisse und habe bis jetzt auch nur wenig verstanden. Mein Praktikumsbetreuer hat Leider selbst sehr viel zu Arbeiten wehalb ich ihn nur ungern andauernd störe. Auch benutzt er ständig Fachbegriffe welche ich noch nicht richtig einordnen kann und somit wiederrum meist nichts verstehe...

unterwelcher funktion des GF-Editors formatiere ich den den Code? Habe mich erst gestern auf diesem Portal registriert und kenne mich also noch nicht ganz so gut aus

0
ohwehohach  16.03.2018, 10:04
@TwoFace2206

Es soll jetzt nicht böse klingen, aber: Hast Du verstanden, was der Code, der da steht, tut oder tun soll oder stocherst Du nur im Dunklen hier?

Die Methode readDoubleValue liest jetzt einen String ein (scanner.next) und an der Stelle // ... musst Du jetzt eben das machen, was ich vorher gemacht habe, nämlich aus dem String einen double machen. In der Methode readSign musst Du eben an der Stelle // ... prüfen, ob ein gültiges Rechenzeichen eingegeben wurde. "gültig" darfst Du nur dann auf true setzen, wenn das Rechenzeichen gültig ist.

Also: in readDoubleValue ersetzt Du // ... durch

d = Double.parseDouble(s);

In readSign ersetzt Du // ... und die zeile "gültig = true;" durch

if (sign != "+" && sign != "-" && sign != "*" && sign != "/")
  System.out.println("Bitte geben Sie ein gültiges Rechenzeichen ein.");
else
  gültig = true;
1
ohwehohach  16.03.2018, 10:05
@TwoFace2206

Wie lernst Du denn dann bitte programmieren, wenn Du nicht weißt, wo die Java-Dokumentation ist??

0
TwoFace2206 
Fragesteller
 16.03.2018, 10:11
@ohwehohach
Hast Du den kompletten Thread gelesen?

Ja habe ich :D Aber wie bereits gesagt für mich ist das Programmieren noch so gut wie neuland und ich bin eig andauernd nur auf sehr vielen Internetseiten um irgendwie zuverstehen was ich als nächstes tuen muss bzw warum ich das tuen muss und komme mittlerweile gar nicht mehr wirklich klar mit dem ganzen programm, da jedes mal wenn mein Praktikumsleiter das ganze überarbeitet hat irgendwas nicht mehr funktioniert und ich wieder einen fehler suchen muss den ich nicht wirkich verstehe. Ich bin froh wenn ich heute den Taschenrechner soweit fertig bekomme und hoffentlich auch ohne das er wieder etwas umstellt und nichts funktioniert da ich sonst das Praktikum mit keinem (für mich) zufriendenstellendem ergebnis verlasse...

0
regex9  16.03.2018, 10:14
@ohwehohach

Nein, aber ich kenne auch nicht den gesamten/restlichen Code, an dem es dann wohl liegen wird.

1
ohwehohach  16.03.2018, 10:15
@TwoFace2206
Hast Du den kompletten Thread gelesen?

Ich meinte @regex9 und nicht Dich! Vor dem Kommentar steht der Name, an den die Antwort geht - uffbasse :-)

0
TwoFace2206 
Fragesteller
 16.03.2018, 10:17
@ohwehohach

Okey habe es ersetzt jetzt Funktioniert schonmal das ganze mit den Zahlen einwandfrei bei dem rechenzeichen mag er iwie grad gar nichts annehmen weder zahlen noch buchstaben noch rechenzeichen

0
ohwehohach  16.03.2018, 10:17
@regex9

Siehst Du, hättest Du den restlichen Thread auch gelesen, dann wüsstest Du, dass der FS es sehr wohl zunächst mit nextDouble probiert hat, allerdings es nicht hinbekommen hat, bei ungültigen Eingaben solange neue Eingaben zu fordern, bis es funktioniert. Da auch meine erste korrigierte Version dann zu Fehlern geführt hat (Endlosschleife), haben wir eine Version entwickelt, wo die Eingabe zunächst als String erfolgt und dann erst die Wandlung nach double vorgenommen wird.

0
regex9  16.03.2018, 10:18
@TwoFace2206
  1. Die blauen Worte in meinen Kommentaren sind Links.
  2. Rechts oben (3 Pünktchen-Button) kannst du weitere Funktionen im Menü anzeigen lassen. Dort gibt es auch einen Code-Tag (</>).
0
ohwehohach  16.03.2018, 10:21
@TwoFace2206

? Eigentlich müsste er alle Rechenzeichen erlauben. Kommt immer die Meldung, dass ein gültiges Zeichen eingegeben werden muss?

Hast Du das alles mal im Debugger gestartet und einen Breakpoint gesetzt?

Hinweis: Wenn Du nicht weißt, was das bedeutet, dann google bitte mal dringend nach Anfängertutorials für die Java-Entwicklung. Ich weiß ja nicht einmal, welche IDE Du nutzt. Ohne eine vernünftige Debug-Umgebung ist das allerdings nicht machbar.

Wenn Du nicht weißt, was das bedeuetet, dann sprich bitte mit Deinem Betreuer. Der muss Die ja eine vernünftige Arbeitsumgebung schaffen.

Ich kann und will hier keinen Programmierkurs halten.

0
TwoFace2206 
Fragesteller
 16.03.2018, 10:31
@ohwehohach

Den Programmierkurs machst du bis jetzt aber ganz gut :P hab in deinen Hilfestellungen mehr verstanden als in der restlichen Woche :D

Habe denke ich auch den fehler bei den rechenzeichen gefunden. du hast das ganze ja wie folget gemacht:

if (sign != "+" && sign != "-" && sign != "*" && sign != "/")

ich habe jetzt die && zeichen durch || ersetzt da es ja eig nicht möglich ist "+ und - und * und /" zu haben sonder eher "+ oder - oder * oder /" auserdem habe ich das

sign != "+" ...usw

durch

sign.equals("+")...usw

ersetzt hoffe es funktioniert danach :D

0
TwoFace2206 
Fragesteller
 16.03.2018, 10:37
@TwoFace2206

Habe mich wohl zufrüh gefreut bei rechenzeichen gehn auch wieder die zahlen und buchstaben :( und bei dem versuch eine rechenzeichens passier gar nichts mehr

0
ohwehohach  16.03.2018, 11:01
@TwoFace2206

Du musst natürlich schreiben

if (!sign.equals("+") && !sign.equals("-") ...)

Also ! für NICHT.

Alternative:

if (sign.equals("+") || sign.equals("-") || sign.equals("*") || sign.equals("/")
  gültig = true;
else
  System.out.println("Sie müssen ein gültiges Rechenzeichen eingeben!");
0
TwoFace2206 
Fragesteller
 16.03.2018, 11:05
@ohwehohach

warum den &&? ich benutze ja nur ein rechenzeichen? dann muss ich doch || als oder verwenden? und das mit den ! habe ich versucht das ändert nix ich kann bei bitte rechenzeichen angeben hinschreiben was ich will das programm läuft nicht mehr weiter es kommt nicht nicht benachrichtigung gib ein gültiges rechenzeichen an aber es kommt auch nicht zweite zahl bitte es kommt gar nix

0
TwoFace2206 
Fragesteller
 16.03.2018, 11:07
@ohwehohach

ahh also muss ich bei else des system.out.print hinmachen. ich habe das bei catch (exception ex) stehen. brauche ich bei else aber schon noch das gültig=false oder gültig=true ich komm da grad bisschen durcheinander

und kann ich dann das catch weg machen?

0
TwoFace2206 
Fragesteller
 16.03.2018, 11:11
@ohwehohach

Habe es wie du verbessert funktioniert nicht. wenn ich das system .out.println bei else hin mache kommt Bitte geben sie ein gültigesrechenzeichen an und ohne das ich was eingebe gleich im anschluss gebe eine zweite zahl ein kann also dann kein rechenzeichen einfügen

und wenn ich gültig=true mache dann kann ich bei rechenzeichen wieder buchstaben eingeben

0
ohwehohach  16.03.2018, 11:22
@TwoFace2206

Was Du doch sagen will ist:

Wenn die Eingabe des Benutzers kein gültiges Rechenzeichen ist, dann gib eine Meldung aus, ansonsten nimm das Rechenzeichen, das eingegeben wurde.

Übertragen in Java-Sprech bedeutet das:

Wenn der String nicht "+" ist und (&&) nicht "-" und (&&) nicht "*" und (&&) nicht "/" gib eine Meldung aus, ansonsten setze gültig auf true.

Gleichbedeutend dazu ist:

Wenn der String gleich "+" ist oder (||) gleich "-" oder (||) gleich "*" oder (||) gleich "/" setze gültig auf true, ansonsten gib eine Meldung aus.

0
ohwehohach  16.03.2018, 11:23
@TwoFace2206

Dazu kann ich ohne Code nichts sagen. Das try/catch würde ich da mal lassen, falls beim Einlesen von der Tastatur einfach irgendein Fehler auftritt.

0
TwoFace2206 
Fragesteller
 16.03.2018, 11:24
@ohwehohach

ja das möchte ich damit sagen aber immer wenn ich es versuche hat der code iwas zu bemängeln und funktioniert dann nicht richitg

0
TwoFace2206 
Fragesteller
 16.03.2018, 11:25
@ohwehohach

das try/catch hat mein begleiter alles so eingegeben da habe ich bisher noch nichts verändert

und bis her ist es so wenn ich gültig wie du eben sagtest auf true stelle dann kann ich einen buchstaben eingeben und er frägt mich nach einer zweiten zahl wenn ichs aber auf false lasse dann macht er gar nix

0
ohwehohach  16.03.2018, 11:27
@TwoFace2206

Dann stell doch hier den Code von readSign nochmal rein. Vermutlich hast Du beide Wege vermischt.

1
TwoFace2206 
Fragesteller
 16.03.2018, 11:28
@ohwehohach
protected static String readSign(Scanner scanner)
    {
        String sign = "";
        boolean gültig = false;
        while (!gültig)
        {
            try
            {
            sign = scanner.next();                    
                
            if (!sign.equals("+") || !sign.equals("-") || !sign.equals("*") || sign.equals("/")) {
                gültig=true;
            }
                else
                  gültig = false;
             
            }
            catch (Exception ex)
            {
                 System.out.println("Bitte geben Sie ein gültiges Rechnezeichen ein.");
            }
        }

        return sign;
    }

}
0
ohwehohach  16.03.2018, 11:31
@TwoFace2206

Ich sag ja, Du vermischt beides. Jetzt sagt Dein Code: Wenn das Zeichen nicht "+" ist oder nicht "-" ist oder nicht "*" ist oder "/" ist, dann ist es gültig. Sprich. Alles außer +, - und * ist gültig.

DAS IST FALSCH! Schau meine Kommentare oben nochmal genau an - dann findest Du auch den Fehler.

1
TwoFace2206 
Fragesteller
 16.03.2018, 11:40
@ohwehohach

AHHH du meinst die ! haha die habe ich in meinem code völlig übersehen sorry :D okey habe die ! jetzt raus genommen immerhin hat erjetzt schonmal nichts gegen rechenzeichen mehr jetzt fehlt nur noch die sache mit der meldung dass wenn ich einen buchstaben eingebe das dann das mit dem gültigen rechenzeichen kommt den das macht er jetzt noch nicht. aber da meintest du ja vorhin das das bei else rein kommt ist das korrekt? Wenn ja ist dann das catch am schluss nicht vollkommen überflüssig? denn dann würde ja nur noch catch (Exception ex) da stehen da ich das sytem.out.println nach oben in else verschiebe

0
ohwehohach  16.03.2018, 11:49
@TwoFace2206

Es kommt darauf an. Wenn Du die Variante mit !sign.equals("+") && ... nimmst, dann kommt die Meldung in den if-Zweig. Wenn Du die Variante mit sign.equals("+") || ... nimmst, dann kommt die Meldung in den else-Zweig.

Du verschiebst das System.out.println nicht aus dem Catch. Du kopierst es. Im Catch bleibt es auch.

Das catch wird angesprungen, wenn es Exceptions gibt. Das andere ist, wenn der Benutzer ein ungültiges Zeichen eingibt. Das sind zwei unterschiedliche Dinge.

1
TwoFace2206 
Fragesteller
 16.03.2018, 11:54
@ohwehohach

Okey habe es kopiert aber da scheint noch immer ein Fehler drinen zusein. an sich läuft alles nur wenn ich jetzt nach dem rechenzeichen gefragt werde kommt das

Bitte die erste Zahl eingeben:
d
Buchstaben können nicht verarbeitet werden. Bitte wiederholen:
5
Bitte gib ein Rechenzeichen an:
d
Bitte geben Sie ein gültiges Rechnezeichen ein.
5
Bitte geben Sie ein gültiges Rechnezeichen ein.
+
Bitte geben Sie ein gültiges Rechnezeichen ein.
Bitte die zweite Zahl eingeben:
0
TwoFace2206 
Fragesteller
 16.03.2018, 12:09
@ohwehohach
protected static String readSign(Scanner scanner)
    {
        String sign = "";
        boolean gültig = false;
        while (!gültig)
        {
            try
            {
            sign = scanner.next();                    
                
            if (sign.equals("+") || sign.equals("-") || sign.equals("*") || sign.equals("/")) {
                gültig=true;
            }
                else
                  gültig = false;
                    System.out.println("Bitte geben Sie ein gültiges Rechnezeichen ein.");
            }
            catch (Exception ex)
            {
                System.out.println("Bitte geben Sie ein gültiges Rechnezeichen ein.");
            }
        }

        return sign;
    }

}
0
ohwehohach  16.03.2018, 12:15
@TwoFace2206

Wer hat denn gesagt, dass Du gültig = false machen sollst? Das kannst Du zwar, aber jetzt gibst Du in jedem Fall, egal ob ein gültiges Zeichen eingegeben wurde oder nicht, die Meldung aus, dass ein gültiges Rechenzeichen eingegeben werden muss.

Hinweis: Wenn Du mehrere Anweisungen in einem if oder else oder for ausführen willst, musst Du einen Block verwenden. Sprich:

if (sign.equals("+") ...) {
    gültig=true;
}
else {
    gültig = false;
    System.out.println("Bitte geben Sie ein gültiges Rechnezeichen ein.");
}

Die geschweiften Klammern im else-Zweig fehlen!!

1
TwoFace2206 
Fragesteller
 16.03.2018, 12:37
@ohwehohach

es lag tatsächlich nur an der geschweiften klammer das false konnte ich lassen und es funktioniert einwand frei :D vielen Danke für diese Großartige hilfe :)

Ich hoffe mein betreuer Zerstörrt jetzt nicht wiedr alles :D

Auch hoffe ih das ich nachher die neue aufgabe ohne solch große probleme bewältigen kann aber ich hoffe sehr das falls ich nicht weiter komm ich mich erneut melden kann :) keine sorge heute ist der letzte tag des Praktikums :D dann hast du bald wieder deine ruhe :P :D Aber vielen Dank für deine Hilfe und vorallemn auch deine Nerven :D

ich freue mich das mein erstes programm so läuft wie es laufen soll und das habe ich dir zu verdanken. ich würde dir gerne einen Döner ausgeben aber das wird schwer :DD

1
ohwehohach  16.03.2018, 12:51
@TwoFace2206

:'-D Döner wäre zwar cool gewesen, aber ist auch nicht nötig. Immerhin läuft Dein Programm jetzt.

1