是否有可能解决错误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);
}