有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

我在java线程“awteventque1”中获得异常。lang.NullPointerException

控制台显示:

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)

它确实向我显示了零线,但我无法修复它。 我的语法也是我对Java非常陌生,但我真的很想尝试一个函数解析器,但一切正常,但它没有绘制我在文本字段中输入的函数

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

    }
}

另一个:

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;
        }
    }
}

相关线路如下: 从"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();
}

共 (1) 个答案

  1. # 1 楼答案

    versuch2类的tEingabe字段(类名应以大写字母开头)未初始化。不会调用versuch2类的init()方法,因为这不是小程序的起点,但小程序plotter2是(同样,类名应该以大写开头)。这意味着versuch2.tEingabe仍然是null,因此代码tEingabe.getText();将失败

    您应该考虑从您的{{CD10>}方法中删除关于^ {CD1>}的代码。