控制台说:
线程中的异常" AWT-EventQueue-1"显示java.lang.NullPointerException
在funk.versuch2 $ FParser.pruefe(versuch2.java:148)
在funk.plotter2.werteAus(plotter2.java:106)
在funk.plotter2.actionPerformed(plotter2.java:80)
at java.awt.Button.processActionEvent(Unknown Source)
在java.awt.Button.processEvent(未知来源)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
在java.awt.EventQueue.access $ 500(未知来源)
在java.awt.EventQueue $ 3.run(未知来源)
在java.awt.EventQueue $ 3.run(未知来源)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain $ 1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain $ 1.doIntersectionPrivilege(Unknown Source)
在java.awt.EventQueue $ 4.run(未知来源)
在java.awt.EventQueue $ 4.run(未知来源)
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)
在java.awt.EventDispatchThread.run(未知来源)
它确实向我展示了零线,但我无法修复它。 我的语法也是我对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();
}
答案 0 :(得分:0)
tEingabe
类的versuch2
字段(类名称应以大写字母btw开头。)未初始化。 init()
类的versuch2
方法未被调用,因为这不是applet的起点,但applet plotter2
是(同样,类名应该是以大写字母开头)。这意味着versuch2.tEingabe
仍为null
,因此代码tEingabe.getText();
将失败。
您应该考虑从tEingabe
方法中删除有关pruefe()
的代码。