PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Problem die zweite.


Nero
2005-07-11, 14:41:32
So inzwischen bin ich bei meinen Projekt weiter. Nun gibt es ein Problem, nämlich spuckt Eclipse mit folgenden Fehler raus: The local variable sTest may not have been initialized

Was sagt sie aus und wie könnte ich es beheben? Hier noch der Teil aus dem Quellcode:

public void actionPerformed(ActionEvent e){

String sTest;

if(e.getActionCommand().equals("+") || e.getActionCommand().equals("-") || e.getActionCommand().equals("/") || e.getActionCommand().equals("*")) {{{
btest2 = true;
sOperator=e.getActionCommand();
}}}else if(btest2 == true){
tfDisplay2.getText();
tfDisplay2 .setText(sTest+e.getActionCommand());
}else if(btest2 != true){
tfDisplay1.getText();
tfDisplay1 .setText(sTest+e.getActionCommand());
}else if(e.getActionCommand().equals("=")){
btest2 = false;
}}{

DIe Fehlerstelle ist unterstrichen.

Gast
2005-07-11, 14:52:15
Statt:

String sTest;

einfach:

String sTest = new String();

Nero
2005-07-11, 15:01:11
Ok danke dir, nur funktionert es nicht so wie ich wolle. Hast du ein Tipp wie es Programmier das wenn ich auf die Taste 1 drücke und danach die 2 drücke, eine 12 im Display steht? Auch das Projekt ist ein Taschenrechner zu programmieren.

MadMan2k
2005-07-11, 16:14:04
wah.. drück mal Strg+Shift+F - dann kann man den Code vielleicht auch lesen ;)

massa
2005-07-11, 16:47:08
Also sorry aber dein Code sieht total wirr aus...

Was treibst du mit der else if?
So wies aussieht prüfst du im ersten If Zweig das Commando und setzt ne boolsche Variable die du im else if Zweig dann nochmal abprüfst... ???

Warum speicherst du den Rückgabewert von

tfDisplay2.getText();

nirgends?

Und as kleine erklärung zur Lösung vom Gast, ein String ist ein Java ein Objekt deswegen musst du einen String auch mit String s = new String(); erzeugen.

Nero
2005-07-11, 17:04:21
Ok danke ich habs gefunden. habe einfach sText = tfDisplay1.getText(); geschrieben und nun funzt es. Danke euch!

ethrandil
2005-07-11, 17:34:00
if(e.getActionCommand().equals("+") || e.getActionCommand().equals("-") || e.getActionCommand().equals("/") || e.getActionCommand().equals("*")) {{{
...
}}}wusste gar nicht, dass sowas geht... was soll das?!?

- Eth

MadMan2k
2005-07-11, 17:59:49
in diesem Fall nichts :) (http://www.galileocomputing.de/openbook/javainsel4/javainsel_02_001.htm#Rxx365java02001040000A11F03A278)

Nero
2005-07-11, 18:18:16
Ja der Aufbau ist etwas tricky aber es funktioniert. Nun muss ich nurnoch hinbekommen das wenn ich auf "=" drücke er dann tfDisplay1 und tfDisplay2 ausliest und er beide mit dem Rechnoperator verrechnet und es im tfDisplay1 ausspuckt. Jemand einen Tipp?

Nero

Gast
2005-07-12, 04:37:54
"Statt:

String sTest;

einfach:

String sTest = new String();
"


Wo ist den da der Unterschied, wird beim deklarieren von sTest mit "String sTest;" in Java nicht automatisch ein String-Objekt erzeugt ?

HellHorse
2005-07-12, 06:57:58
"Statt:

String sTest;

einfach:

String sTest = new String();
"


Wo ist den da der Unterschied, wird beim deklarieren von sTest mit "String sTest;" in Java nicht automatisch ein String-Objekt erzeugt ?
Du hast es erfasst:
String sTest = new String();
ist nichts anderes als
String sTest = "";
Aber der Code is so .... dass wir darauf nicht weiter einzugehen brauchen.

Monger
2005-07-12, 08:35:02
Ja der Aufbau ist etwas tricky aber es funktioniert. Nun muss ich nurnoch hinbekommen das wenn ich auf "=" drücke er dann tfDisplay1 und tfDisplay2 ausliest und er beide mit dem Rechnoperator verrechnet und es im tfDisplay1 ausspuckt. Jemand einen Tipp?

Nero

Du machst genau das selbe was du bis jetzt auch gemacht hast: du registrierst einen ActionListener für den "=" Button. In der Methode "actionPerformed" liest du jeweils den Inhalt beider Textfelder ein (wobei es natürlich intelligenter wäre, sämtliche Berechnungen im Hintergrund durchzuführen, und die Visualisierung vollständig davon abzukoppeln), wandelst die Strings in int um (geht mit der Hüllklasse "Integer", verrechnest beides, wandelst das Ergebnis wieder in String um und weist es dem ersten Display zu.
Das ist zwar weit davon entfernt, eine saubere Lösung zu sein, aber immerhin macht es was du willst...

Edit: sobald man öfter am selben String rumbastelt, sollte man besser StringBuffer verwenden. Strings sind immutable, d.h. unveränderbar, und jedes Mal wenn man nur einen Buchstaben dranhängt wird eine neue Instanz von String erzeugt und die alte verworfen. Natürlich kann ein Mensch gar nicht so schnell tippen bzw. klicken, dass es da Probleme geben könnte, aber man sollte sich halt grundsätzlich an solche Vorgaben gewöhnen.

Pinoccio
2005-07-14, 17:49:52
String sTest;
vs.
String sTest = new String();

Wo ist den da der Unterschied, wird beim deklarieren von sTest mit "String sTest;" in Java nicht automatisch ein String-Objekt erzeugt ?Im ersten Fall ist sTest danach ==null, da hagelt es dann NullPointerExceptions.
if(e.getActionCommand().equals("+") || e.getActionCommand().equals("-") || e.getActionCommand().equals("/") || e.getActionCommand().equals("*")) {{{
wusste gar nicht, dass sowas geht... was soll das?!?Meinst du die Unsinnigerweise dreifach vorhandene "{"? Das geht, auch wenn es wenig Sinn ergibt.
Allles andere ist üblicher Atil. In der Bedingung für das if werden einzelne boolsche Ausdrücke durch oder (in JAVA |) verbunden. Wenn man will, kann man auch das bedingte oder (in JAVA ||) nehmen, ob das schneller ist weiß ich nicht, müsste man mal ausprobieren.

@Neo: Es geht hier in mehrern Threads ja um deinen Taschenrechner. Wäre evtl sinnvoll gewesen, daß in einen zu packen. Im Readme werden alle Helfer hoffentlich erwähnt.

mfg Sebastian

ethrandil
2005-07-15, 14:34:24
Ich konnts nicht lassen, hier meine Lösung ;(


public class Calc { //Nu sagt nicht das ist overkill :ugly: srykthx
private double value = 0.0;

public void add(double v){
value += v;
}
public void sub(double v){
value -= v;
}
public void mul(double v){
value *= v;
}
public void div(double v){
value /= v;
}
public void reset(){
value = 0.0;
}

public double getValue(){
return this.value;
}
public void setValue(final double d){
this.value = d;
}
public String toString(){
return Double.toString(value);
}
}

public class NumberBuffer { //Verarbeitet die Eingaben für die Zahlen
private double value;
private int afterComma; //Stellen nach dem Komma + 1
private int beforeComma; //stellen vorm Komma

public NumberBuffer(){
reset();
}

public void put(final char c){
if(c>='0' && c <= '9'){ //Eine Zahl wurde eingegeben
final int digit = c-'0';
if(afterComma == 0){ //Normale Stelle
value *= 10;
value += digit;
beforeComma++;
}else{ //Nachkommastelle
value += digit / Math.pow(10, afterComma);
afterComma++;
}
}else if(c == ','){ //Ein Komma wurde eingegeben!
if(afterComma == 0)
afterComma++;
else
throw new IllegalArgumentException("Only One Comma!");
}else{
throw new IllegalArgumentException("char "+c+" is no digit or comma.");
}
}
public void reset(){
this.value = 0.0;
this.afterComma = this.beforeComma = 0;
}
public int getBeforeComma(){
return beforeComma;
}
public boolean isCommaSet(){
return (afterComma != 0);
}
public double getValue(){
return value;
}
public String toString(){
final int length = this.beforeComma + this.afterComma;

String sval = Double.toString(this.value);
while(length > sval.length()) //Fehlende Nullen auffüllen
sval += '0';

return sval.substring(0,length);
}
}

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class GUICalc extends JFrame implements ActionListener {
public static void main(String[] args){
JFrame f = new GUICalc();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}

final private Calc calculator = new Calc();
final private NumberBuffer numbuff = new NumberBuffer();
final private JTextField textfield;
private char command = ' ';

public GUICalc(){
super("Ethrandil's super maga project: Calculator!");

/* Layout */
GridBagLayout gblayout= new GridBagLayout();
this.setLayout(gblayout);

GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 3;

this.textfield = new JTextField();
this.textfield.setEditable(false);
this.textfield.addActionListener(this);
gblayout.setConstraints(textfield,gbc);
this.getContentPane().add(textfield);


final String[] buttons = { "C",
"7", "8", "9", "-",
"4", "5", "6", "+",
"1", "2", "3", "/",
"0", ",", "=", "*"
};

for(int i=0; i<buttons.length; i++){
if(i%4 == 0)
gbc.gridwidth = GridBagConstraints.REMAINDER;
else
gbc.gridwidth = 1;

JButton button = new JButton(buttons[i]);
button.addActionListener(this);
gblayout.setConstraints(button,gbc);
this.getContentPane().add(button);
}

updateUI();
pack();
}

public void actionPerformed(final ActionEvent e) {
if(e.getActionCommand().equals("=")){
execCommand();
}else if(e.getActionCommand().equals("C")){
reset();
}else{
final char c = e.getActionCommand().charAt(0);
if((c >= '0' && c <= '9') || c == ','){
numbuff.put(c);

}else{
if(command == ' ') //Noch keine Rechnung erfolgt!
calculator.setValue(numbuff.getValue());

this.command = c;
numbuff.reset();
}
}

SwingUtilities.invokeLater(new Runnable(){
public void run() {
updateUI();
}});
}

private void reset() {
calculator.reset();
numbuff.reset();
command = ' ';
}

private void execCommand(){
switch(command){
case '+':
calculator.add(numbuff.getValue());
break;
case '-':
calculator.sub(numbuff.getValue());
break;
case '*':
calculator.mul(numbuff.getValue());
break;
case '/':
calculator.div(numbuff.getValue());
break;
}
numbuff.reset();
}


protected void updateUI() {
if(numbuff.getBeforeComma() == 0)
textfield.setText(calculator.toString());
else
textfield.setText(numbuff.toString());
textfield.setCaretPosition(0);
}

}

;( v2

- Eth

P.S.: viel Spaß beim Erproben von doubles Grenzen...

massa
2005-07-15, 14:52:58
Das sieht doch mal schön ordentlich und aufgeräumt aus :)