2013-11-26 30 views
0

我下面的代码会得到一个编译错误:' 的.class'预期:的Java '的.class'预期的错误

Stack<Character> stack=new Stack<Character>(); 
char pop=stack.pop(); 

但如果我改变这一点,编译成功:

char pop; 
Stack<Character> stack=new Stack<Character>(); 
pop=stack.pop(); 

什么原因?

全部代码是在这里:

public class Solution { 
    public boolean isValid(String s) { 

     //char pop; 
     if(s==null||s.length()==0)return true; 
     Stack<Character> stack=new Stack<Character>(); 
     stack.push(s.charAt(0)); 
     for(int i=1;i<s.length();i++){ 
      char c=s.charAt(i); 
      if(c=='('||c=='['||c=='{') 
       stack.push(c); 
      else{ 
       if(!stack.isEmpty()) 
        char pop=stack.pop(); 
       else 
        return false; 
       if(c==')'&&pop!='(') return false; 
       else if(c==']'&&pop!='[') return false; 
       else if(c=='}'&&pop!='{') return false; 
      } 
     } 
     return stack.isEmpty(); 
    } 
} 
+6

是你的完整代码?它之前/之后是否有可能触发'.class'的任何内容? –

+1

哪一行触发错误? – Paranaix

+0

这本身并不会导致您描述的错误。 – Izmaki

回答

1

您使用流行的局部变量,如果条件内。它应该是全局的,因为您稍后使用pop值。
尽管在其他条件下,将不会使用流行音乐。但它仍然会显示编译错误。
在您的代码段:

else{ 
      if(!stack.isEmpty()) 
       char pop=stack.pop(); // Here you initialized the value inside a condition. 
      else 
       return false; 
      if(c==')'&&pop!='(') return false; 
      else if(c==']'&&pop!='[') return false;// Using the value. 
      else if(c=='}'&&pop!='{') return false;// Using the value. 
     } 
0

问题可能存在于下面的代码:

if(!stack.isEmpty())   // here you will need to provide curly braces to define pop's scope 
    char pop=stack.pop(); 

此外,如果声明pop外面,我看到它在你的注释代码//char pop,你将需要删除如果条件在你的if条件之外尝试使用它时会更有意义,那么上面的流行的char声明。

+0

@downvoter关注评论 –

1

如果你的代码将编译

if (!stack.isEmpty()) 
    char pop = stack.pop(); 
else 

是将是一样的(注意{...}括号表示变量的作用域)

if (!stack.isEmpty()){ 
    char pop = stack.pop(); 
} else 

因此这将意味着,您是刚开始的stack.pop()结果并将其存储在变量char pop中,该变量在该块之外的任何地方都不可访问。
由于该指令是if条件下成功执行的唯一指令,这意味着pop()的存储结果是多余的并且存在设计问题。

要解决此问题,请在if语句之前的某个位置声明char pop,以便可以在if块之后访问它。

char pop; //make sure that this variable will be initialized before you use it 
if (!stack.isEmpty()) 
    pop = stack.pop(); 
else