On 17.08.2011 16:17, Lew wrote:
Andreas Leitgeb wrote:
Arved Sandstrom<asandstr...@eastlink.ca> wrote:
Lew wrote:
JLS 10: [...] IOW, you never index arrays with a byte, char or
short. [...]
I'm feeling slow this morning: how do we get problems with
byte->int, short->int, or char->int again?
One gets problems with byte->int and short->int with array indexes
the way one gets into trouble with those widening conversions
generally. The usual suspect is the lack of unsigned versions, so
widening a (byte)0xA0, for example, would result in a negative
index.
One gets into trouble generally in programming when one thinks one
thing is going on ("index takes a byte") whilst ignoring what's
really going on (there's a widening conversion involved). You might
get away with it most of the time, but occasionally such things trip
you up.
Why had a nice issue recently which exactly fits this bill: after over
two months of uninterrupted, completely error free production usage the
application suddenly stopped working giving weird error messages (there
was an issue with the error reporting as well, but let's ignore that for
the moment). Turns out this was the setup:
1. There was an AtomicInteger initialized at startup with 0 which for
every request coming into that system was incremented in a thread safe
manner (incrementAndGet()).
2. The result was used to index into an array with the quite obvious
"arr[n % arr.length]".
3. (left as exercise for the reader)
Anybody who now thinks all is fine should stop coding Java immediately
and go reading the language spec.