Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Dabei bekomme ich allerdings folgenden Error:
"Exception in thread "main" java.lang.NumberFormatException"
bezüglich der im code dickgedruckten Zeile.
Ich denke, dass der Error daher kommt, dass fristterm und lastterm null sind.
Aber wie kann ich das ändern?
Wenn ich das null-setzen weg lasse, bekomme ich einen error, da die variablen dann nicht initialisiert wurden.
> Wenn ich das null-setzen weg lasse, bekomme ich einen error, da die variablen dann nicht initialisiert wurden.
das ist ja kein Argument, was wäre wenn der Wert nicht initialisiert ist, soll dann keine Exception kommen bei Nichtzuweisung in der while-Schleife?
das null ist gerade gut, denn so kannst du später prüfen ob die Variablen noch null sind oder einen Wert vom Pattern haben,
wenn null dann kannst du eben nicht parsen, kein Ergebnis ausrechnen
----
falls du dich wunderst, warum bei einem dir plausiblen Eingabestring das Pattern nicht klappt,
solltest du diesen Eingabestring auch posten,
am besten immer ein vollständiges kleines Testprogramm mit main-Methode
ok hier ist der ganze Programmcode.
Insgesamt soll das Programm ein Taschenrechner werden, der terms ausließt und sie berechnet ( auch Punkt vor Strich)
Java:
import java.io.ObjectInputStream.GetField;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TermUtil
{
/**
*
* @param symbol (allowed symbols are *, +, -)
* @param term (complete term that should be evaluated)
* @return String (founded term)
*/
public String getNextTerm(char operator, String term)
{
String subterm;
subterm= null;
for ( int i = 0; i <= term.length()-1; i=i+1 )
{
if (term.charAt(i) == operator)
{
Pattern p1 = Pattern.compile("(\\d+([.]\\d+)*)[" + operator + "](\\d+([.]\\d+)*)");
Matcher m1 = p1.matcher(term);
while ( m1.find() ){
subterm = m1.group() ;}
return subterm;
}
}
return null;
}
public double calculate (String subterm)
{
Pattern p1 = Pattern.compile("(\\d+([.]\\d+)*)[*+-]");
Pattern p2 = Pattern.compile("[*+-](\\d+([.]\\d+)*)");
Matcher m1 = p1.matcher(subterm);
Matcher m2 = p2.matcher(subterm);
double ergebnis = 0;
String firstterm = null;
String lastterm = null;
while ( m1.find() ){
firstterm = m1.group() ;}
while ( m2.find() ){
lastterm = m2.group() ;}
if (subterm.contains("*"))
{ergebnis = Double.valueOf(firstterm) * Double.valueOf(lastterm);}
if (subterm.contains("+"))
{ergebnis = Double.valueOf(firstterm) + Double.valueOf(lastterm);}
if (subterm.contains("-"))
{ergebnis = Double.valueOf(firstterm) - Double.valueOf(lastterm);}
return ergebnis;
}
public static void main(String[] args)
{
TermUtil util = new TermUtil();
String term = "2*2+2*2-3";
System.out.println("Ausgangsterm: " +term);
//int ergebnis;
//String newterm;
String nextTerm = null;
while((nextTerm = util.getNextTerm('*', term))!= null)
{
double resultSubTerm = util.calculate(nextTerm);
term = term.replace(nextTerm, String.valueOf(resultSubTerm));
}
while((nextTerm = util.getNextTerm('+', term))!= null)
{
double resultSubTerm = util.calculate(nextTerm);
term = term.replace(nextTerm, String.valueOf(resultSubTerm));
}
while((nextTerm = util.getNextTerm('-', term))!= null)
{
double resultSubTerm = util.calculate(nextTerm);
term = term.replace(nextTerm, String.valueOf(resultSubTerm));
}
System.out.println(term);
ich hab ja zum Teik geschrieben wo du weiterarbeiten musst, nur Code posten ist etwas dürftig,
zum Gesamtprogramm kann ich aber noch sagen, dass du dir genau anschauen solltest, was bei getNextTerm() jeweils rauskommt,
System.out.println ist ganz leicht