创建新的公共类

时间:2021-05-07 14:01:59

标签: java android

我正在为我的 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();
        }
    }}
}

如何更改主函数以使其正常工作?

2 个答案:

答案 0 :(得分:1)

似乎 TreasureHunt 是在另一个类 (MainActivity) 中定义的 - 所以它是一个内部类,Java 15 版本之前不允许使用静态方法,Java 16 中放宽了限制 1.

解决方案:

  • 将班级移出MainActivity;或
  • 使它static 2;或
  • 使用较新的 Java 版本(例如 Java 16)

Java 语言规范 (JLS-8.1.3):

  • 直到版本 15:link <块引用>

    如果内部类声明了一个显式或隐式静态成员,除非该成员是一个常量变量,否则会导致编译时错误

  • 版本 16:link <块引用>

    适用于嵌套类的所有规则都适用于内部类。特别是,内部类可以声明和继承静态成员(第 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