小编Vis*_*l K的帖子

为什么我的程序在最终类变量未初始化时不显示编译时错误?

对于以下代码:

public class StaticFinal
{
    private final static int i ;
    public StaticFinal()
    {}
}
Run Code Online (Sandbox Code Playgroud)

我得到编译时错误:

StaticFinal.java:7: variable i might not have been initialized
        {}
         ^
1 error
Run Code Online (Sandbox Code Playgroud)

这符合JLS8.3.1.2,其中说:

如果空白的final(§4.12.4)类变量未被声明它的类的静态初始化程序(第8.7节)明确赋值(第16.8节),则为编译时错误.

所以,完全理解上述错误.
但现在考虑以下内容:

public class StaticFinal
{
    private final static int i ;
    public StaticFinal()throws InstantiationException
    {
        throw new InstantiationException("Can't instantiate"); // Don't let the constructor to complete.
    }
}
Run Code Online (Sandbox Code Playgroud)

这里,构造函数永远不会完成,因为它InstantiationException是在构造函数的中间抛出的.这段代码编译得很好!!
为什么?为什么这段代码没有显示关于final变量非初始化的编译时错误i


编辑
我正在使用javac 1.6.0_25命令提示符编译它(不使用任何IDE)

java static final compilation class-variables

30
推荐指数
1
解决办法
1755
查看次数

为什么必须在枚举类型中的任何其他变量和方法声明之前声明枚举常量?

如果我在以这种方式声明枚举常量之前或之前声明变量:

enum MyEnum
{
    int i = 90;
}
Run Code Online (Sandbox Code Playgroud)

它显示以下编译错误.

MyEnum.java:3: <identifier> expected
{
 ^
MyEnum.java:4: ',', '}', or ';' expected
        int i = 90;
        ^
MyEnum.java:4: '}' expected
        int i = 90;
             ^
MyEnum.java:5: class, interface, or enum expected
}
^
4 errors
Run Code Online (Sandbox Code Playgroud)

但是如果我在声明之前宣布一个枚举常量,i那么它编译得很好.
即使以下代码将编译正常:

enum MyEnum
{
    ;//put a semicolon
    int i = 90;
}
Run Code Online (Sandbox Code Playgroud)

为什么java enum是这样设计的?

java syntax enums

9
推荐指数
1
解决办法
1468
查看次数

从静态上下文加载属性文件

我最近发现自己面临着一个非常有趣的问题.properties我的应用程序中有一个文件,我试图从静态上下文中加载它.该properties文件是从一个类加载的Image,这是一个静态类.在Eclipse中它工作正常,但是当我尝试将其导出为JAR时,它显然不起作用.

prop.load(new FileInputStream(new  File(Images.class.
getClassLoader().
getResource("config.properties").
toString())));
Run Code Online (Sandbox Code Playgroud)

这是我已尝试使用的行,但是当我尝试运行该程序时,它会抛出此错误:

Exception in thread "main" java.lang.NullPointerException
    at controllers.Images.loadImageFiles(Images.java:47)
    at views.World.<init>(World.java:55)
    at views.World.main(World.java:40)
Run Code Online (Sandbox Code Playgroud)

我在这里有些不知所措,所以我的问题是:

如何从静态上下文加载资源,更重要的是,在执行此操作之前,是否需要将文件注册为资源?

编辑

经过一番搜索,我已经确定它getResource是返回的方法null.我想,现在我的大问题是为什么!?我的文件结构如下:

Project
        src
             controllers <-- This is where the Images class is.
             models
             views
             img
             doc
             config.properties <-- This is the file I want.
Run Code Online (Sandbox Code Playgroud)

我不完全确定这会有什么帮助,但我仍然坚持寻找答案.

java resources properties

1
推荐指数
1
解决办法
3671
查看次数