John Boucher wrote:
If 
args.length = args.length - 1 ;
is OK, why do
args.length -= 1 ;
and
args.length-- ;
produce the compilation error
'args.length' is not an lvalue
?

I hope it's a bug rather than a (poor) design decision.

John Boucher
The King had Humpty pushed.
  
It's not nessarily a poor design decision.  There's been quite a bit of debate about this.  It's really to keep programmers from doing:

for (int n=0; n<x; x++)
{
    args.length++; //or args.length--;
    ...
}

Which is less much less efficient then.

args.length = args.length + x;
for (int n=0; n<x; x++)
{
    ...
}

As I see it, most of the time, you should be increasing/decreasing an array size in large blocks. Code should very rarely need to increase an array size by one.  The longer syntax is to discourage bad programming.

-Anderson