The essential problem with Java is it's foundational principle, which is:
"The programmer is dumb and must be prevented from doing unsafe things."
The thing is, the types of problems we have to solve don't really change; in C++ or C# or AS3 you can just say, "trust me, I'm actually smart," and the language will say "ok, I guess" and get out of your way and let you do whatever moderately (or grossly) unsafe thing you want. In Java the language says instead, "no I don't think you are."
Then you have to write twice as much code because you don't have function pointers. So where you could have had two classes instead you have 5, and sure, you never did anything unsafe, but doubling your line count and file count gives you that many more opportunities to slip up.
To balance this out, Java IDEs like eclipse have super-good code-time auto-compilation and automatic error and warning resolution, which is awesome, but I can't shake the feeling that it's really all there to make some of these language defects livable.
See.... C# is just as safe as Java... it manages garbage collection and the rest of it, it's very pleasant, but in C# if you need to do something, you CAN. You may have to be very explicit about it, but there's a psychic atmosphere of the language trying hard to accomodate you. I just have never gotten that feeling from java. The psychic atmosphere of java is like being in a dusty lecture hall with a bunch of 60 year old computer science professors who are all bickering amongst themselves, and you raise your hand to ask a question and they just ignore you, or when they notice you, talk down to you because you're an implementor, not an information scientist.