接受表达式的Java计算器

接受表达式的Java计算器,java,calculator,Java,Calculator,我正在尝试制作一个计算器,可以对括号中用户输入的数字进行加减运算。 以下是一个运行示例: 欢迎来到表达节目 输入一行表达式: (2+3+-4+5)(6+7+8+-9)(3+-2+7+0) “2+3+-4+5”的值为6 “(6+7+8+-9)”的值为12 “(3+-2+7+0)”的值为8 再见 欢迎来到表达节目 输入一行表达式: (6) ()(你好+朋友)(1*2+4)7+8+9) “(6)”的值为6 错误:“不是整数 错误:“hello”不是整数 错误:“*”不是有效的运算符 错误:非法开始字

我正在尝试制作一个计算器,可以对括号中用户输入的数字进行加减运算。 以下是一个运行示例:

欢迎来到表达节目
输入一行表达式:
(2+3+-4+5)(6+7+8+-9)(3+-2+7+0)
“2+3+-4+5”的值为6
“(6+7+8+-9)”的值为12
“(3+-2+7+0)”的值为8
再见


欢迎来到表达节目
输入一行表达式:
(6) ()(你好+朋友)(1*2+4)7+8+9)
“(6)”的值为6
错误:“不是整数
错误:“hello”不是整数
错误:“*”不是有效的运算符
错误:非法开始字符“7”再见

这是我目前所拥有的,但它不起作用:

import java.util.Scanner;
public class ExprParser 
{
public static void main(String args[])
{
    
    Scanner g=new Scanner(System.in);
    System.out.println("Welcome to the Expression Program!");
    System.out.println("Enter a line of expressions(between parenthesis):");
    String exp=g.next();
    String[] arr=exp.split("\\)");
    
    for (int i = 0; i < arr.length; ++i) 
    {   System.out.println(arr[i]+")");
        int result=calculate(arr[i]);
        System.out.println(calculate(Integer.toString(result)));
    }
}
    
public static int calculate(String a)
{
    int sum=0;
    for (int i=0;i<a.length();++i)
    {
        
        char sign='+';
        a.indexOf(sign);

             sum+=Integer.parseInt(a.substring(0,sign))+Integer.parseInt(a.substring(sign+1,sign));
        
    }
    return sum;
}   
}
import java.util.Scanner;
公共类ExprParser
{
公共静态void main(字符串参数[])
{
扫描仪g=新的扫描仪(System.in);
System.out.println(“欢迎使用表达式程序!”);
System.out.println(“输入一行表达式(括号之间):”;
字符串exp=g.next();
字符串[]arr=exp.split(\\);
对于(int i=0;i对于(int i=0;i我想您要找的是反向波兰语符号,它允许您计算表达式。这里有一个视频解释它是如何工作的:

在这段代码中:

    char sign='+';
    a.indexOf(sign);   
    sum+=Integer.parseInt(a.substring(0,sign))+Integer.parseInt(a.substring(sign+1,sign));
符号
是一个字符,字符实际上是整数值。
'+'
字符的值为43(这是ASCII图表上加号的位置)。因此,您试图计算
a.substring(0,43)
,如果
a
短于43个字符,则会出现越界错误


您使用了
indexOf
来找出
'+'
符号的位置,但是您丢弃了结果。将
indexOf
的结果存储在一个变量中,然后在
子字符串调用中使用该变量,而不是
sign
。同时确保处理
indexOf
返回-1时的情况(它找不到加号);如果你把它传递给
a.substring
,你会得到另一个越界错误。

你说的“不工作”是什么意思?输出或错误是什么?你粘贴的代码不可能输出这些错误消息。这是家庭作业吗?@DesertIvy它说我的子字符串中有跳出错误(0,sign)@Chris当我的用户输入这些类型的表达式时,我试图让我的程序发布这些错误消息。您可以发布堆栈跟踪吗?要查看这些错误,您必须使用try-catch或在传递参数之前验证所有内容。