A final
variable can only be assigned if it is definitely unassigned. That is, "might" is referring to the fact that the variable is not definitely unassigned:
Similarly, every blank final variable must be assigned at most once; it must be definitely unassigned when an assignment to it occurs.
For instance, consider this code which makes the wording of "might" more clear:
final int x;
if (maybeTrueOrMaybeFalse()) {
x = 1;
}
/* error: variable x might already have been assigned */
x = 1;
The standard Sun/Oracle javac compiler produces the same error message for the "might" (not definitely unassigned) and "has been" (definitely assigned) cases. A different compiler or code analysis tool could very well provide a different/refined message in the "has been" case.