Assertions in static blocks ?
Ulf Zibis
Ulf.Zibis at gmx.de
Sat Mar 6 03:35:03 PST 2010
Am 06.03.2010 02:28, schrieb Keith McGuigan:
> Ulf Zibis wrote:
>> Neal, Keith, thanks for your answer.
>>
>> ... but shouldn't javac claim, that there the code in the static
>> block will be *never reached*, if there is no trigger to run it?
>
> Not really. That would be like claiming that the code in a method
> will never be reached if no one calls the method. javac can't know
> that you're not going to take that class and deploy it somewhere else
> with other code that will end up calling the method (or initializing
> the class, etc.).
But javac can know about the risk, because running Class.forName() is
"not very common", especially if there is nothing but constants in that
class.
The minimum, javac could do is to throw a warning.
On the other hand, javac throws errors, even if the stated problem never
occurs:
char c1 = 12345;
char c2 = c1 % 100;
would result in ERROR: "possible loss of precision", but
c1 *= 12345;
compiles without problem.
Do you know, if following static initializer will be guaranteed to run,
when accessing the static value? :
class EUC_TWMapping3 extends EUC_TWMapping {
static final short PL0_5_B2C_RANGE; // plane 0, 5 b2c range
static final short PLANE_B2C_RANGE; // plane 2..4, 6..15 b2c range
static {
PL0_5_B2C_RANGE = 0x2300; // initialized here to force the
assertions!
PLANE_B2C_RANGE = 0x1f00; // " " "
// assert by values from EUC_TWMapping
assert PL0_5_B2C_RANGE >= b2c.length;
assert PLANE_B2C_RANGE <= b2c.length;
}
}
-Ulf
More information about the hotspot-dev
mailing list