Jep Biblothek

Rayano

Mitglied
ich habe folgendes Problem. Ich baue mir gerade inne kleine Sammlung zusammen bevor ich an mein nächsten Projekt gehe (es wird ein Taschenrechner)
beim erstellen dieser kleinen codes bin ich Jep gestoßen.

Da ich im english aktuell noch nicht so gut bin greife ich auf KI zurück.

ich habe in dieser Biblothek einen evaluate(); entdeckt.


Java:
import org.nfunk.jep.JEP;

public class Main {
    public static void main(String[] args) {
        JEP jep = new JEP();
        jep.parseExpression("(5+6)*3");
        double result = jep.evaluate();
        System.out.println(result);
    }
}

in meinen testcode kommt es aber leider zu fehlern. kann mir jemand helfen?

ich möchte einfach nur eine berechnung aus einen String auslesen. eigentlich würde ich es sogar beim testen. Z.B. ohne variable. selbst das funktioniert an dieser stelle nicht. bei der Math Biblothek hat alles was ich getestet habe funktioniert
 

KonradN

Super-Moderator
Mitarbeiter
Was genau bekommst Du denn an Fehlern?
Und was hast Du genau gemacht? Hast Du die Library z.B. eingebunden? Wenn ja: Wie?
 

KonradN

Super-Moderator
Mitarbeiter
Generell evtl. der Hinweis: JEP scheint mir hier nicht wirklich eine gute Wahl zu sein als Library. So habe ich dafür nicht wirklich eine aktuelle Projektseite finden können (evtl. habe ich auch nur falsch gesucht?)

Daher einfach einmal ein Link mit ein paar Alternativen:
  • exp4j - letzte Version von 2017 - scheint recht leistungsfähig zu sein
  • Javaluator - scheint ebenfalls zuletzt 2017 aktualisiert worden zu sein
  • Das mit dem JavaScript ist so nicht mehr möglich - Die JavaScript Engine (Nashorn) ist ab Java 11 depricated und ab Java 16 entfernt. GraalVM ist da mit eine Alternative, aber das ist meiner Meinung nach nicht ganz so ein toller Ersatz.

Daher wäre mein Ratschlag, mit exp4j zu arbeiten. Falls Du nicht mit Maven arbeitest: Unter https://mvnrepository.com/artifact/net.objecthunter/exp4j kannst Du es auch herunter laden.

Aber Achtung: Es hat gleich 3 CVEs (Sicherheitslücken), daher ist es nicht unkritisch so man es produktiv einsetzen möchte.
 

Rayano

Mitglied
ok also als fehler bekomme ich:

Code:
D:\Java Taschenrechner\Taschenrechner\src\Main.java:7:28
java: cannot find symbol
  symbol:   method evaluate()
  location: variable jep of type org.nfunk.jep.JEP

ich habe die biblothek runtergeladen einen neuen ordner libs angelegt und den in das Projekt kopiert.
wenn ich die evaluate funktion weglasse, funktioniert der code auch. Das bedeutet für mich das, das Importieren funktioniert hat. da die parseExpression aus dem selben import stamd.

wenn du eine andere Biblothek hast die mir eine eval funktion bitet würde ich auch diese nutzen.
mir ist nur wichtig das ich wenn etwas auf dem Display angezeigt wird.
z.B. (5+5)*3 dass dann auch so ausgerechnet wird. In python gab es da ebend die eval funktion für
 

Rayano

Mitglied
ich werde die exp4j mal testen. Sie scheint die lösung für mein Problem zu sein.

über Sicherheitslücken mache ich mir aktuell keine Gedanken. Dafür code ich noch nicht lange genug.
 

M.L.

Top Contributor
Man soll(te) auch eine IDE mit IntelliSense verwenden (am Beispiel mit Eclipse):
Java:
 jep.getValue();
passt.

Eclipse_JEP_IntelliSense.png
 

Rayano

Mitglied
Man soll(te) auch eine IDE mit IntelliSense verwenden (am Beispiel mit Eclipse):
Java:
 jep.getValue();
passt.

Anhang anzeigen 22220
ja ich benutze ItelliJ. Bei mir wird leider nicht JEP dahinterangezeigt. daher wusste ich das ich einen Fehlercode bekommen würde. Aktuell bin ich im Selbststudium. Dem entsprechend, habe ich auch niemand ausser euch hier im Forum den ich Fragen kann. Ein Mensch kann es doch besser erklären als Bücher oder ein KI
 

Rayano

Mitglied
ich bleibe bei meiner Aussage bei IntelliJ wird nicht wie bei equilbs angezeigt das es sich um eine Biblothek handelt. Aber du hast meinen Fehler bereits behoben. Da mir anscheinend ein falscher Befehl gegeben wurde. es ist nicht evaluate sondern getValue und das wusste ich nicht.

IntelliJ sieht bei mir übrigend auch so aus wie bei dir, mit der Autovervollständigung
 

Rayano

Mitglied
Da es hier noch ganz gut reinpasst.


Java:
ergebnis.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String ausgabespeicher = ausgabe.getText();
                if (ausgabespeicher.contains("U")) {
                    String[] zwischenspeicher = ausgabespeicher.split("U");
                    String teil_eins = zwischenspeicher[0];
                    String teil_zwei = zwischenspeicher[1];
                    int dezimalzahl = Integer.parseInt(teil_eins);
                    int basis = Integer.parseInt(teil_zwei);
                    dezimalzahl_zu_anderer_basis(dezimalzahl, basis);
                    ausgabe.setText(test);
                } else if (ausgabespeicher.contains("P")) {
                    String[] zwischenspeicher = ausgabespeicher.split("P");
                    String teil_eins = zwischenspeicher[0];
                    String teil_zwei = zwischenspeicher[1];
                    int dezimalzahl = Integer.parseInt(teil_eins);
                    int potenz = Integer.parseInt(teil_zwei);
                    double ergebnis = Math.pow(dezimalzahl, potenz);
                    ausgabe.setText(String.valueOf(ergebnis));
                } else if (ausgabespeicher.contains("W")) {
                    String[] zwischenspeicher = ausgabespeicher.split("W");
                    String teil_eins = zwischenspeicher[0];
                    int dezimalzahl = Integer.parseInt(teil_eins);
                    double ergebnis = Math.sqrt(dezimalzahl);
                    ausgabe.setText(String.valueOf(ergebnis));
                } else if (!ausgabespeicher.contains("U") && !ausgabespeicher.contains("W") && !ausgabespeicher.contains("P")) {
                    double eingabeWert = Double.valueOf(ausgabespeicher);
                    JEP jep = new JEP();
                    jep.parseExpression(String.valueOf(eingabeWert));
                    double endergebnis = jep.getValue();
                    ausgabe.setText(String.valueOf(endergebnis));
                }else{
                    ausgabe.setText("Error");
                }
            }
        });

leider funktioniert die unterste else if nicht. der rest funktioniert ohne probleme. kann mir jemand helfen?

also fehler bekomme ich:


Code:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "3+5"
    at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
    at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.base/java.lang.Double.parseDouble(Double.java:792)
    at java.base/java.lang.Double.valueOf(Double.java:755)
    at Main$3.actionPerformed(Main.java:114)
    at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
    at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2314)
    at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:407)
    at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
    at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6621)
    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3398)
    at java.desktop/java.awt.Component.processEvent(Component.java:6386)
    at java.desktop/java.awt.Container.processEvent(Container.java:2266)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4996)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4828)
    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948)
    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575)
    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310)
    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4828)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:775)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:98)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:747)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:744)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
 

KonradN

Super-Moderator
Mitarbeiter
Also es scheint, dass ausgabespeicher den String "3+5" hat und den versuchst Du hier als Double zu parsen:
double eingabeWert = Double.valueOf(ausgabespeicher);

Und das geht natürlich nicht. 3+5 ist keine Fließkommazahl.

Evtl. willst Du da einfach nur haben:
Java:
                    JEP jep = new JEP();
                    jep.parseExpression(ausgabespeicher);
                    double endergebnis = jep.getValue();
                    ausgabe.setText(String.valueOf(endergebnis));

Ansonsten kannst Du das letzte else if einfach als else schreiben und dein letztes else entfällt. Denn es kommt ja erst dahin, wenn klar ist, dass die frei Prüfungen nicht wahr sind.
 

Rayano

Mitglied
danke, jetzt funktionierts.,
darunter kommt eigentlich die abfrage als else wenn z.b. 2 buchstaben verwendet wurden oder 3. da es aber nicht funktioniert, werde ich einen try und einen catchblock nutzen um diese fehler abzufanen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Welche PDF Biblothek? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben