JavaCC变量修饰符报错:仅允许final修饰变量print的解决咨询
解决JavaCC中变量修饰符报错问题
错误原因
你遇到的Illegal modifier for the variable print; only final is permitted错误,核心是违反了Java语法规则:方法内部的局部变量不能使用private、static这类类成员修饰符,局部变量仅允许可选的final修饰。你把本该放在类成员位置的变量,写到了main方法的循环内部,导致JavaCC生成的Java代码编译报错。
修复方案
把需要在程序运行中修改的变量移到类的成员区域(main方法外部、类内部),根据使用场景调整修饰符:
- 如果变量需要被
static的main方法直接访问,添加static修饰符; - 如果不需要类级别的共享,可去掉
static,通过类实例访问(注意main是静态方法,需先实例化类)。
修改后的代码示例
public class Parser { // 将变量移到类成员位置,添加static适配main方法的静态上下文 private static ArrayList nodosCheck = new ArrayList(); private static ArrayList nodos = new ArrayList(); private static String raiz; private static String print="Todo anda bien"; public static void main(String args []) throws ParseException { Parser parser = new Parser(System.in); while (true) { System.out.println("Reading from standard input..."); System.out.print("Enter a TREE:"); // 直接修改静态变量 print = "运行时更新的内容"; nodos.add("新节点"); System.out.println("Bienvenidos"); // ... 后续逻辑 } } }
额外优化建议
- 给
ArrayList指定泛型类型,避免原始类型警告,比如ArrayList<String> nodosCheck = new ArrayList<>(); - 若不需要类共享变量,可改为实例成员,通过类实例访问:
public class Parser { // 实例成员变量 private ArrayList nodosCheck = new ArrayList(); private ArrayList nodos = new ArrayList(); private String raiz; private String print="Todo anda bien"; public Parser(InputStream in) { // 构造方法初始化逻辑 } public static void main(String args []) throws ParseException { Parser parser = new Parser(System.in); while (true) { System.out.println("Reading from standard input..."); System.out.print("Enter a TREE:"); // 通过实例访问变量 parser.print = "运行时更新的内容"; parser.nodos.add("新节点"); System.out.println("Bienvenidos"); // ... 后续逻辑 } } }
内容的提问来源于stack exchange,提问作者Malelizarazo
相关产品推荐
相关产品推荐

