“线程中的异常”;“主要”;java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-3

“线程中的异常”;“主要”;java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-3,java,stack-overflow,calculator,Java,Stack Overflow,Calculator,我是Java新手,我知道像这样的帖子还有很多,但由于我目前对Java的理解有限,我无法将它们应用到我的代码中。我正在使用eclipse.exe 我想让这个程序在我输入表达式时使用运算符和各种括号请帮助我哪里出错了(很抱歉我的英语不好) 仍然存在java.lang.StringIndexOutOfBoundsException问题 package hww3; import java.lang.Character.Subset; import java.util.Scanner; public c

我是Java新手,我知道像这样的帖子还有很多,但由于我目前对Java的理解有限,我无法将它们应用到我的代码中。我正在使用eclipse.exe 我想让这个程序在我输入表达式时使用运算符和各种括号请帮助我哪里出错了(很抱歉我的英语不好)
仍然存在java.lang.StringIndexOutOfBoundsException问题

package hww3;
import java.lang.Character.Subset;
import java.util.Scanner;

public class Demo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner s=new Scanner(System.in);
        System.out.print("입력: ");
        Calculator cal=new Calculator();

        String susik=s.nextLine();

        System.out.println(susik);
        cal.process(susik);

    }

}
class Calculator{

    public void process(String susik) {
        susik=susik.replaceAll(" ", "");
        double result=calculate(susik);
        System.out.println("="+result);
    }


    private double calculate(String susik) {

        System.out.println(susik);

        double reVal=0;

        if(susik.indexOf("[")!=-1
        ||susik.indexOf("{")!=-1
        ||susik.indexOf("(")!=-1){



            if(susik.indexOf("[")!=-1){
                reVal=calculate(susik,"[","]");
            }

            if(susik.indexOf("{")!=-1){
                reVal=calculate(susik,"{","}");
            }

            if(susik.indexOf("[")!=-1){
                reVal=calculate(susik,"(",")");
            }

        }else{

        if(susik.indexOf("+")!=-1){
                reVal=add(getFirstTerm(susik,"+"),getSecondTerm(susik,"+"));
        }else if(susik.indexOf("-")!=-1){
            reVal=add(getFirstTerm(susik,"-"),getSecondTerm(susik,"-"));
        }else if(susik.indexOf("*")!=-1){
            reVal=add(getFirstTerm(susik,"*"),getSecondTerm(susik,"*"));
        }else if(susik.indexOf("/")!=-1){
            reVal=add(getFirstTerm(susik,"/"),getSecondTerm(susik,"/"));
        }else{
            //연산자가 없을 경우
            reVal=Double.parseDouble(susik);
        }
    }
        return reVal;
}

    private double calculate(String susik, String frontbracket, String endbracket) {

        String frontSusik="";

        String bracketSusik="";

        String endSusik="";

        if(susik.indexOf(frontbracket)!=0){
            frontSusik=susik.substring(0,susik.lastIndexOf(frontbracket));
        }else if(susik.indexOf(endbracket)!=(susik.length()-1)){
            endSusik=susik.substring(susik.lastIndexOf(endSusik));
        }else
        bracketSusik=susik.substring(susik.indexOf(frontbracket)+1,susik.lastIndexOf(endbracket));


        return calculate(frontSusik+calculate(bracketSusik)+endSusik);
    }

    private double getSecondTerm(String susik,String operator){
        return calculate(susik.substring(susik.indexOf(operator)+1));
    }

    private double getFirstTerm(String susik,String operator){
        return calculate(0,susik.substring(susik.indexOf(operator)));
    }
    public double add(double a,double b){
        return a+b;
    }
    public double subtract(double a,double b){
        return a-b;
    }
    public double nultiply(double a,double b){
        return a*b;
    }
    public double divide(double a,double b){
        return a/b;
    }

}

getFirstTerm的子字符串操作不正确,您只将它应该从0传递到运算符的索引

试试这个

    private double getFirstTerm(String susik,String operator){
        return calculate(susik.substring(0,susik.indexOf(operator)));
    }

发布错误的堆栈跟踪可能会很有帮助,并且可能会对代码的哪些部分做更多的解释。您的代码对我来说运行良好。请提供您获得SOF Exception?的测试用例ㅠㅠ所以我不知道为什么我看不到!!如果有效,请将此答案标记为已接受。:)