-2

Console says:

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
at funk.versuch2$FParser.pruefe(versuch2.java:148)
at funk.plotter2.werteAus(plotter2.java:106)
at funk.plotter2.actionPerformed(plotter2.java:80)
at java.awt.Button.processActionEvent(Unknown Source)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

It does show me the lines that go zero but I am not able to fix it. My syntax also I am pretty new to Java but I really wanted to try out a function parser but everything is working but it doesn't draw the function I enter in my textfield.

package funk;

import funk.versuch2.FParser;
import funk.versuch2.FRechner;

import java.applet.Applet;
import java.awt.Button;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class plotter2 extends Applet implements ActionListener,KeyListener {
    int breite, hoehe; //Maße des Applets
    Panel pOben; //Komponenten
    Button bStart;
    TextField tEingabe;
    Label lFehler;
    int x0, y0, dx, dy; //bestimmende Größen für das Koordinatensystem
    String eingabe; //das wird der Funktionsterm
    boolean eingabeOK = false;
    boolean ersterPunkt = true;
    FParser p = new FParser(); //der Syntaxchecker
    FRechner r = new FRechner(); // der Rechner

    public void init() {
        breite = getBounds().width; //Appletmaße bestimmen
        hoehe = getBounds().height;
        pOben = new Panel(); //Komponenten erzeugen
        pOben.setBounds(0, 0, breite - 1, 60);
        pOben.setLayout(null);
        add(pOben);
        bStart = new Button("los!");
        bStart.setBounds(120, 2, 60, 20);
        bStart.addActionListener(this);
        pOben.add(bStart);
        tEingabe = new TextField("y=");
        tEingabe.setBounds(2, 2, breite - 60, 22);
        tEingabe.addKeyListener(this);
        tEingabe.setFont(new Font("Couruier", 1, 12));
        pOben.add(tEingabe);
        lFehler = new Label("ok");
        lFehler.setBounds(55, 25, breite - 60, 20);
        pOben.add(lFehler);
        x0 = 4; //Mittelpunkte des Koordinatensystems und Skalierungsfaktoren festlegen
        y0 = (int) Math.round((hoehe - 60) / 2) + 60;
        dx = 100;
        dy = 50;
    }

    //Zuerst einmal muss ein leeres Koordinatensystem gezeichnet werden:
    private void anfangsbild(Graphics g) {
        g.setColor(Color.white); //Bild löschen
        g.fillRect(1, 61, breite - 2, hoehe - 62);
        g.setColor(Color.black);
        g.drawRect(1, 61, breite - 2, hoehe - 62);
        g.drawLine(1, y0, breite - 1, y0); //Achsen zeichnen
        g.drawLine(x0, 61, x0, hoehe - 1);
        for (int i = 1; i <= (int) Math.round(breite / dx); i++) //x-Achse skalieren
        {
            g.drawLine(x0 - dx * i, y0 - 2, x0 - dx * i, y0 + 2);
            g.drawLine(x0 + dx * i, y0 - 2, x0 + dx * i, y0 + 2);
        }
        for (int i = 1; i <= (int) Math.round(y0 / dy); i++) //y-Achse skalieren
        {
            g.drawLine(x0 - 2, y0 + dy * i, x0 + 2, y0 + dy * i);
            g.drawLine(x0 - 2, y0 - dy * i, x0 + 2, y0 - dy * i);
        }
    }

    public void actionPerformed(ActionEvent e) {
        werteAus();
    }

    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == 10) werteAus();
    }

    private void werteAus() {
        eingabe = tEingabe.getText();
        boolean allesOK = true;
        try //ggf. “y=” abschneiden
        {
            if (eingabe.substring(0, 2).equals("y="))
                eingabe = eingabe.substring(2);
        } catch (Exception ex) {
            lFehler.setText("FEHLER: Eingabe zu kurz!");
            allesOK = false;
        }
        if (eingabe.length() > 0) //ggf. Semikolon anhängen
        {
            if (!(eingabe.charAt(eingabe.length() - 1) == ';'))
                eingabe = eingabe + ";";
        } else allesOK = false;
        allesOK = allesOK && FParser.pruefe(eingabe); //Syntaxcheck
        if (allesOK) {
            lFehler.setText("Eingabe ok --> es wird gezeichnet");
            eingabeOK = true;
            repaint(); //Graph zeichnen
            lFehler.setText("ok");
        } else {
            lFehler.setText("FEHLER");
            eingabeOK = false;
        }
    }

    public void paint(Graphics g) {
        int yalt = 0, yneu;
        anfangsbild(g);
        if (eingabeOK) {
            double x, y;
            for (int i = 0; i < breite - 1; i++) //alle horizontalen Bildschirmkoordinaten durchlaufen
            {
                x = 1.0 * (i - x0) / dx; //x-Wert bestimmen
                y = r.berechne(eingabe, x); //y-Wert berechnen
                if (!r.fehler) {
                    if (ersterPunkt) {
                        yalt = y0 - (int) Math.round(y * dy); //Position merken
                        ersterPunkt = false;
                    } else {
                        yneu = y0 - (int) Math.round(y * dy); //Linie zeichnen
                        if ((Math.abs(yalt) < 2 * hoehe) && (Math.abs(yneu) < 2 * hoehe))
                            g.drawLine(i - 1, yalt, i, yneu);
                        yalt = yneu;
                    }
                } else ersterPunkt = true;
            }
        }
    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }
}

The other one:

package funk;

import java.applet.Applet;
import java.awt.Button;
import java.awt.Font;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class versuch2 extends Applet implements ActionListener {
    static TextField tEingabe;
    Label lAnzeige;

    public void init() {
        setSize(800, 400);
        setLayout(null);
        Button bNeu = new Button("neu"); // ein Button für den Neustart
        bNeu.setBounds(2, 2, 50, 20);
        bNeu.addActionListener(this);
        add(bNeu);
        Button bArbeite = new Button("analysiere"); // und einer für Ersetzungsvorgänge
        bArbeite.setBounds(55, 2, 60, 20);
        bArbeite.addActionListener(this);
        add(bArbeite);
        tEingabe = new TextField(""); // zum Eingeben eines Wortes
        tEingabe.setBounds(2, 30, 790, 25);
        tEingabe.setFont(new Font("Courier", 1, 16));
        add(tEingabe);
        lAnzeige = new Label("Geben Sie eine Variablenvereinbarung ein!");
        lAnzeige.setBounds(2, 60, 790, 20);
        add(lAnzeige);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand() == "neu")
            neu();
        else if (e.getActionCommand() == "analysiere")
            arbeite();
    }

    private void neu() {
        tEingabe.setText("");
        lAnzeige.setText("Geben Sie eine Variablenvereinbarung ein!");
    }

    private void arbeite() {
        String s = tEingabe.getText();
        boolean ok = FParser.pruefe(s);
    }


    static class FParser {
        public static boolean pruefe(String s) // s wird überprüft
        {
            char c, d; // die ersten beiden Zeichen
            boolean ok = true; // das Ergebnis
            if (s.length() < 2)
                ok = false;
            while ((s.length() > 1) && ok) {
                c = s.charAt(0); // erstes Zeichen abtrennen
                s = s.substring(1);
                d = s.charAt(0); // zweites Zeichen vorsorglich speichern
                switch (c) {
                    case '+': {
                        s = "A" + s;
                        break;
                    }
                    case '-': {
                        s = "A" + s;
                        break;
                    }
                    case '0': {
                        s = "B" + s;
                        break;
                    }
                    case '1': {
                        s = "B" + s;
                        break;
                    }
                    case '2': {
                        s = "B" + s;
                        break;
                    }
                    case '3': {
                        s = "B" + s;
                        break;
                    }
                    case '4': {
                        s = "B" + s;
                        break;
                    }
                    case '5': {
                        s = "B" + s;
                        break;
                    }
                    case '6': {
                        s = "B" + s;
                        break;
                    }
                    case '7': {
                        s = "B" + s;
                        break;
                    }
                    case '8': {
                        s = "B" + s;
                        break;
                    }
                    case '9': {
                        s = "B" + s;
                        break;
                    }
                    case 'x': {
                        s = "E" + s;
                        break;
                    }
                    case 'A': {
                        s = s.substring(1); // jetzt kann das zweite Zeichen auch weg
                        if (d == 'x')
                            s = "E" + s;
                        else if ((d >= '0') && (d <= '9'))
                            s = "B" + s;
                        else
                            ok = false;
                        break;
                    }
                    case 'B': {
                        s = s.substring(1); // jetzt kann das zweite Zeichen auch weg
                        if ((d == '+') || (d == '-'))
                            s = "A" + s;
                        else if (d == 'x')
                            s = "E" + s;
                        else if ((d >= '0') && (d <= '9'))
                            s = "B" + s;
                        else if (d == ';')
                            s = "S" + s;
                        else
                            ok = false;
                        break;
                    }
                    case 'E': {
                        s = s.substring(1); // jetzt kann das zweite Zeichen auch weg
                        if ((d == '+') || (d == '-'))
                            s = "A" + s;
                        else if (d == '^')
                            s = "F" + s;
                        else if (d == ';')
                            s = "S" + s;
                        else
                            ok = false;
                        break;
                    }
                    case 'F': {
                        s = s.substring(1); // jetzt kann das zweite Zeichen auch weg
                        if ((d == '+') || (d == '-'))
                            s = "G" + s;
                        else if ((d >= '0') && (d <= '9'))
                            s = "H" + s;
                        else if (d == '^')
                            s = "F" + s;
                        else
                            ok = false;
                        break;
                    }
                    case 'G': {
                        s = s.substring(1); // jetzt kann das zweite Zeichen auch weg
                        if ((d >= '0') && (d <= '9'))
                            s = "H" + s;
                        else
                            ok = false;
                        break;
                    }
                    case 'H': {
                        s = s.substring(1); // jetzt kann das zweite Zeichen auch weg
                        if ((d == '+') || (d == '-'))
                            s = "A" + s;
                        else if (d == ';')
                            s = "S" + s;
                        else if ((d >= '0') && (d <= '9'))
                            s = "H" + s;
                        else
                            ok = false;
                        break;
                    }
                }
            }

            String s1 = tEingabe.getText();
            if (ok == true) {
                tEingabe.setText("Richtig--> " + s1);
            } else {
                tEingabe.setText("Error--> " + s1);
            }
            return ok && (s1.equals("S"));
        }
    }

    static class FRechner {
        boolean fehler = false;

        public double berechne(String s, double x) {
            char c;
            double y = 0, ergebnis = 0;
            int vorzeichen = 1; // Vorzeichen
            double zahl = 1;
            double exponent = 1;
            while ((s.length() > 1) && !fehler) {
                // Zahl zusammensuchen
                c = s.charAt(0);
                s = s.substring(1); // erstes Zeichen abschneiden
                vorzeichen = 1;
                zahl = 1;
                if (c == '-') { // ggf. Vorzeichen bestimmen
                    vorzeichen = -1;
                    c = s.charAt(0);
                    s = s.substring(1); // nächstes Zeichen abschneiden
                } else if (c == '+') {
                    c = s.charAt(0);
                    s = s.substring(1); // nächstes Zeichen abschneiden
                }
                if ((c >= '0') && (c <= '9')) { // kommt ´ne Zahl?
                    zahl = (int) c - (int) '0';
                    c = s.charAt(0);
                    s = s.substring(1); // nächstes Zeichen abschneiden
                    while ((c >= '0') && (c <= '9')) {
                        zahl = 10 * zahl + (int) c - (int) '0';
                        c = s.charAt(0);
                        s = s.substring(1); // nächstes Zeichen abschneiden
                    }
                }
                zahl = vorzeichen * zahl; // das ist doch schon mal was!
                if ((c == '+') || (c == '-') || (c == ';')) { // jetzt kommt ein neuer Summand
                    ergebnis = ergebnis + zahl;
                    s = "" + c + s; // Vorzeichen wieder vorne anhängen
                }
                if (c == 'x') { // der Parameter wird benutzt
                    // Exponent suchen
                    c = s.charAt(0);
                    s = s.substring(1); // <x> abschneiden
                    if ((c == ';') || (c == '+') || (c == '-')) { // x^1
                        ergebnis = ergebnis + zahl * x;
                        s = "" + c + s;
                    } else {
                        c = s.charAt(0);
                        s = s.substring(1); // <^> abschneiden
                        vorzeichen = 1;
                        exponent = 1;
                        if (c == '-') {
                            vorzeichen = -1;
                            c = s.charAt(0);
                            s = s.substring(1); // nächstes Zeichen abschneiden
                        } else if (c == '+') {
                            c = s.charAt(0);
                            s = s.substring(1); // nächstes Zeichen abschneiden
                        }
                        if ((c >= '0') && (c <= '9')) {
                            exponent = (int) c - (int) '0';
                            c = s.charAt(0);
                            s = s.substring(1); // nächstes Zeichen abschneiden
                            while ((c >= '0') && (c <= '9')) {
                                exponent = 10 * exponent + (int) c - (int) '0';
                                c = s.charAt(0);
                                s = s.substring(1); // nächstes Zeichen abschneiden
                            }
                            exponent = vorzeichen * exponent;
                            s = "" + c + s; // Vorzeichen wieder vorne anhängen
                            fehler = false;
                            try { // Wert des Summanden berechnen
                                y = zahl * Math.exp(exponent * Math.log(x));
                                ergebnis = ergebnis + y;
                            } catch (Exception ex) {
                                fehler = true;
                            }
                        }
                    }
                }
            }
            return ergebnis;
        }
    }
}

And the relevant lines are: from "versuch2"

String s1 = tEingabe.getText();
if (ok == true) {
    tEingabe.setText("Richtig--> " + s1);
} else {
    tEingabe.setText("Error--> " + s1);
}

"plotter2"

    if (!(eingabe.charAt(eingabe.length()-1)==';'))
        eingabe = eingabe + ";";
}
else
    allesOK = false;
allesOK = allesOK && FParser.pruefe(eingabe); //Syntaxcheck

"plotter2"

public void actionPerformed(ActionEvent e) {
    werteAus();
}

public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == 10)
        werteAus();
}
Tom
  • 16,842
  • 17
  • 45
  • 54

1 Answers1

0

The tEingabe field of the versuch2 class (class names should start in uppercase btw.) isn't initialized. The init() method of the versuch2 class isn't called because this isn't the start point of your applet, but the applet plotter2 is (again, class names should start with an upper case). This means that versuch2.tEingabe is still null and so the code tEingabe.getText(); will fail.

You should consider remove the code about tEingabe from your pruefe() method.

Progman
  • 16,827
  • 6
  • 33
  • 48