是否有可能解决错误I';我开始使用这个java程序了?
我正在尝试修复此代码,因为它由于是否有可能解决错误I';我开始使用这个java程序了?,java,class,formatting,Java,Class,Formatting,我正在尝试修复此代码,因为它由于java.lang.NumberFormatException而无法运行。这让我很困惑,因为我以前从未遇到过这个错误 代码必须解决表达式,如3+4*5,同时遵循PEMDAS规则,如先乘后加等。我还希望它使用键盘输入,我自己也尝试过,这会让事情变得更糟,所以我决定删除它 import java.util.*; import static java.lang.Integer.*; import static java.lang.System.*; import jav
java.lang.NumberFormatException
而无法运行。这让我很困惑,因为我以前从未遇到过这个错误
代码必须解决表达式,如3+4*5
,同时遵循PEMDAS规则,如先乘后加等。我还希望它使用键盘输入,我自己也尝试过,这会让事情变得更糟,所以我决定删除它
import java.util.*;
import static java.lang.Integer.*;
import static java.lang.System.*;
import java.lang.*;
class ExpressionSolver_Rumenov
{
private ArrayList<String> list;
private String expression;
private String trimmedExp;
private String evaluated;
private int eval;
public ExpressionSolver_Rumenov(String s)
{
list=new ArrayList<String>();
expression=s;
trimmedExp=s.trim();
for (int x=0; x<trimmedExp.length(); x++)
{
list.add(""+trimmedExp.charAt(x));
}
}
public void setExpression(String s)
{
expression=s;
trimmedExp=s.trim();
list.clear();
for (int x=0; x<trimmedExp.length(); x++)
{
list.add(""+trimmedExp.charAt(x));
}
}
public void solveExpression()
{
eval=0;
for (int x=0; x<list.size(); x++)
{
if (list.get(x).equals("*")||list.get(x).equals("/"))
{
if (list.get(x).equals("*"))
{
list.set(x-1, String.valueOf(Integer.parseInt(list.get(x-1))*Integer.parseInt(list.get(x+1))));
list.remove(x+1);
list.remove(x);
}
else if(list.get(x).equals("/"))
{
list.set(x-1, String.valueOf(Integer.parseInt(list.get(x-1))/Integer.parseInt(list.get(x+1))));
list.remove(x+1);
list.remove(x);
}
}
}
for (int x=0; x<list.size(); x++)
{
if (list.get(x).equals("-"))
{
list.set(x-1, String.valueOf(Integer.parseInt(list.get(x-1))-Integer.parseInt(list.get(x+1))));
list.remove(x);
list.remove(x+1);
}
else if (list.get(x).equals("+"))
{
list.remove(x);
}
}
for (int x=0; x<list.size(); x++)
{
if (list.get(x).equals(" "))
{
list.remove(x);
}
list.set(x, list.get(x).trim());
}
for (int x=0; x<list.size(); x++)
{
eval+=Integer.parseInt(list.get(x));
}
evaluated=String.valueOf(eval);
}
public String toString( )
{
return evaluated;
}
}
public class Lab04
{
public static void main( String args[] )
{
ExpressionSolver_Rumenov test = new ExpressionSolver_Rumenov("3 + 5");
test.solveExpression();
out.println(test.toString());
test.setExpression("3 * 5");
test.solveExpression();
out.println(test);
test.setExpression("3 - 5");
test.solveExpression();
out.println(test);
test.setExpression("3 / 5");
test.solveExpression();
out.println(test);
test.setExpression("5 * 5 + 2 / 2 - 8 + 5 * 5 - 2");
test.solveExpression();
out.println(test);
}
}
import java.util.*;
导入静态java.lang.Integer.*;
导入静态java.lang.System.*;
导入java.lang.*;
类表达式Solver_Rumenov
{
私有数组列表;
私有字符串表达式;
私有字符串trimmedExp;
计算私有字符串;
私人内部评估;
公共表达Solver_Rumenov(字符串s)
{
列表=新的ArrayList();
表达式=s;
trimmedExp=s.trim();
对于(int x=0;xa根据Oracle的JavaDocs,NumberFormatException:
抛出以指示应用程序已尝试转换
字符串,但该字符串没有
适当的格式
你的问题是你试图将一些不是数字的东西转换成数字。问题可能来自解析,比如读取空格并试图将它们转换成数字
编辑:
对于解析,我建议您查看维基百科中的“调车场”算法:
您试图将字符“
解析为第eval+=Integer.parseInt(list.get(x));
行的整数。发生这种情况是因为您没有正确地从列表中删除空格
// not a correct way
for (int x=0; x<list.size(); x++)
{
if (list.get(x).equals(" "))
{
list.remove(x);
}
list.set(x, list.get(x).trim());
}
在这里,您正在x上运行一个循环,底线是您试图将一个非整数字符馈送到Integer.parseInt()
。如果您修复Lab04
驱动程序类中的表达式,您将看到一切都正常工作
例如,与此相反:
ExpressionSolver_Rumenov test = new ExpressionSolver_Rumenov("3 + 5");
请尝试此操作,并删除空格字符:
ExpressionSolver_Rumenov test = new ExpressionSolver_Rumenov("3+5");
但是,您可能需要一个更容错的程序,因此您需要做一些工作,特别是如果您希望用户能够输入自己的数据
我认为您可能误解了String.trim()
的作用。trim()
方法将删除字符串的前导和尾随空格,因此如果字符串开头有制表符,结尾有换行符,trim()
将删除这些空格
但是,trim()
所不能做的是去除散布在字符串中的空白。为此,您需要自己删掉空白,或者忽略空白字符
要从字符串中删除空格字符,请在setExpression
方法中,替换:
expression=s;
与
当然,您仍然可以忽略空白。而不是:
char c = trimmedExp.charAt(x);
list.add("" + c);
尝试:
请记住,在本例中比较的是字符
,因此应使用=
,而不是.equals()
(.trim())的范围是删除字符串表达式前后的空格,如链接中的空格
例如:String name=“我的名字是Muhamad”;
表达式前面有两个空格,后面有一个空格
所以如果我们像打击一样应用.trim()
字符串newName=name.trim();
我们将收到“我的名字是穆罕默德”而不是“我的名字是穆罕默德”作为newName的值请编辑您的帖子并将完整的异常堆栈跟踪放入其中。请包括您收到的详细错误消息,包括堆栈跟踪。您是否曾将列表内容打印到控制台以查看其中的实际内容?请为您的输入提供打印大纲,我相信括号()
expression = s.replaceAll("\\s+","");
char c = trimmedExp.charAt(x);
list.add("" + c);
char c = trimmedExp.charAt(x);
if(c != " ")
{
list.add("" + c);
}