我正在为我的 Items.csv 文件创建一个新类。编译时,代码给我一个错误信息:
<块引用>内部类 MainActivity.TreasureHunt 中的非法静态声明 修饰符 'static' 只允许在常量变量声明中使用
这是我的代码示例:
public class TreasureHunt {
public static void main(String[] args) {
String path = "C:\\.android\\Treasure\\app\\src\\main\\res\\raw\\items.csv";
String line = ",";
try {
BufferedReader br = new BufferedReader(new FileReader(path));
while((line = br.readLine()) != null) {
String[] values = line.split(",");
System.out.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}}
}
如何更改主函数以使其正常工作?
答案 0 :(得分:1)
似乎 TreasureHunt
是在另一个类 (MainActivity
) 中定义的 - 所以它是一个内部类,Java 15 版本之前不允许使用静态方法,Java 16 中放宽了限制 1.
解决方案:
MainActivity
;或static
2;或Java 语言规范 (JLS-8.1.3):
如果内部类声明了一个显式或隐式静态成员,除非该成员是一个常量变量,否则会导致编译时错误
适用于嵌套类的所有规则都适用于内部类。特别是,内部类可以声明和继承静态成员(第 8.2 节),并声明静态初始值设定项(第 8.7 节),即使内部类本身不是 static
。
1 JEP 395 介绍records
2 我不建议将它设为 static
只是为了避免出现错误消息。它应该与正在实施的模型、想法和设计相匹配。我认为拥有 public
内部/嵌套类表明设计并不完美。
答案 1 :(得分:0)
似乎TreasureHunt 是一个内部类。根据 Java 规范
<块引用>内部类是未显式或隐式声明为静态的嵌套类。
内部类不能有静态成员,除非它是最终的。
class Outer {
class Inner {
static final int x = 3; // OK: constant variable
static int y = 4; // Compile-time error: an inner class
}
static class NestedButNotInner{
static int z = 5; // OK: not an inner class
}
interface NeverInner {} // Interfaces are never inner
}
因此您可以TreasureHunt通过将其设为静态来TreasureHunt嵌套类,而不是内部类。
public static class TreasureHunt {
...
有关详细信息,请参阅Java Specification