about bug: 8020216: Compile time error isn't shown when final class variable is not assigned
Alex Buckley
alex.buckley at oracle.com
Thu Aug 8 13:36:25 PDT 2013
Let's talk about the program in 8020216. A final static variable is not
initialized in its own variable initializer or a static initializer, so
the class should not compile. Please add a comment in 8020216 about
whether that's going to be fixed in javac.
Alex
On 8/8/2013 2:57 AM, Vicente-Arturo Romero-Zaldivar wrote:
> Well this code sample was to show what problems a "fix" to bug 8020216
> may imply. If you check the corresponding bug entry [1], there is
> another similar case and I'm writing you because there you added a
> comment saying that it should be a compiler error. Probably that case is
> different from this one. For me this is not an issue.
>
> Vicente
>
> [1] https://jbs.oracle.com/bugs/browse/JDK-8020216
>
> PD. the comments I'm referring to are not present in
> http://bugs.sun.com/bugdatabase
>
>
> On 08/08/13 01:59, Alex Buckley wrote:
>> Each of the three final instance variables is not definitely assigned
>> after the if-then-else, but JLS 16 only requires a compile-time error
>> when such a variable is accessed. There's no access in the code below,
>> so why is an error being given?
>>
>> Alex
>>
>> On 8/1/2013 10:57 AM, Vicente-Arturo Romero-Zaldivar wrote:
>>> Hi Alex,
>>>
>>> Regarding the mentioned bug entry, I have a patch that solves the issue
>>> but then I have the following example taken from javac code:
>>>
>>> private final TreePath treePath;
>>> private final DocCommentTree docComment;
>>> private final DocTreePath parent;
>>>
>>> public DocTreePath(DocTreePath p, DocTree t) {
>>> if (t.getKind() == DocTree.Kind.DOC_COMMENT) {
>>> throw new IllegalArgumentException("Use
>>> DocTreePath(TreePath, DocCommentTree) to construct DocTreePath for a
>>> DocCommentTree.");
>>> } else {
>>> treePath = p.treePath;
>>> docComment = p.docComment;
>>> parent = p;
>>> }
>>> leaf = t;
>>> }
>>>
>>> with the patch javac says:
>>>
>>> error: variable treePath might not have been initialized
>>> error: variable docComment might not have been initialized
>>> error: variable parent might not have been initialized
>>>
>>> so this means that whenever we have such a code we will have to do:
>>>
>>> if (t.getKind() == DocTree.Kind.DOC_COMMENT) {
>>> treePath = null;
>>> docComment = null;
>>> parent = null;
>>> throw new IllegalArgumentException("Use
>>> DocTreePath(TreePath, DocCommentTree) to construct DocTreePath for a
>>> DocCommentTree.");
>>> } else {
>>>
>>> another option is to set the fields to null at the end of the method.
>>>
>>> Is this what we want? I think the current state of flow analysis is
>>> preferable but I wanted to double check before going on.
>>>
>>> Thanks,
>>> Vicente
>
More information about the compiler-dev
mailing list