I use Java to write games and I've used C++ to write games and have found Java to be fine so long as you remain mindful of what Java's strengths and weaknesses are.
The big two advantages for me, programming in Java are speed of development and deployability/portability.
Compile times are much faster than in VC++ (can't speak for XCode or Clang yet) which means I can iron out problems much quicker. Also, as Eclipse is compiling constantly, I make fewer typo type errors. I've never written a piece of C++ code that 'just works' on another system or compiler. In Java, this is the norm.
On the other hand, Java has some major draw backs. Efficiency is often sited as a reason not to use Java but I've found that as long as you code in a certain way, Java can perform quite well. The trouble is, the certain way you have to code goes against what a lot of Java folk would consider good design.
At Java's heart is the 'garbage collector', it's memory management system. When writing efficient code, you want to avoid making dynamic allocations every frame in any language and this is particularly true of Java. If you set the garbage collector off due to sloppy new'ing then you can kiss smooth frame rates good bye.
Secondly (and most annoyingly) Java does not support 1st class user data types. Every user data type in Java is instantiated essentially as a pointer to a class, allocated on the heap. This is awful for cache concurrency that you can't have things like an array of Vector3 objects and have those concurrent in memory - you can have an array of Vector3 pointers but that's not the same thing at all. Generally you have to use offsets into large arrays of primitive types instead.