这个错误和我的代码有什么不对?

时间:2013-11-26 13:36:20

标签: postfix-notation infix-notation

错误: 线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:5     在java.lang.String.charAt(未知来源)     在Convert.main(Convert.java:16)

public class Convert {

public static void main(String[] args) {
    int i=0;
    int j=0;
    char p[] = new char[10];   // postfix
    Stk s = new Stk();           // stack
    String str = new String();   // infix

    str = JOptionPane.showInputDialog("Please enter a infix expression:");

    while( str.length() >= 1 )
    {
        if( operand (str.charAt(i)) )
            p[j++] = str.charAt(i);

        else if ( !operand(str.charAt(i)) )
        {
            while( !s.isEmpty() && precedence(str.charAt(i)) <= precedence(s.stack[s.top]) )
                p[j++] = s.pop();
            s.push( str.charAt(i) );
        }

        i++;
    }

    while ( !s.isEmpty() )
    {
        p[j++] = s.pop();
    }

    String P = new String(p);
    JOptionPane.showMessageDialog( null , "Postfix expression is : " + P );
}

public static boolean operand( char b )
{
    if ( b!='+' || b!='-' || b!='*' || b!='/' )
        return true;
    else
        return false;
}

public static int precedence(char c)
{
    int x=0;

    switch(c)
   {
        case '*':
        case '/':
        x=2;
        break;

        case '+':
        case '-':
        x=1;
        break;
   }              
   return x;

}
}

1 个答案:

答案 0 :(得分:0)

此声明导致问题:

while( str.length() >= 1 )  

将其更改为:

while(i<str.length()) 

原因:您使用的while条件始终为true,如果用户输入5个字母的字符串,则str.length()为5,因此while条件while(5>=1)始终为true,因此控制进入循环内部并且每次迭代i从0,1,2,3,4增加到5.当i为5时,抛出异常,因为字符串只有0,1,2,3,4字符..

编辑:
修复了operand方法中的逻辑:

public static boolean operand(char b) {
    if (b == '+' || b == '-' || b == '*' || b == '/')
        return false;
    else
        return true;
}