C/C++ programming is too prone to errors, access to memory, global variables, global resources and signal handlers
Unix system API is too obscure and too difficult to use
programs written in C/C++ tend to be hard to port to other OSes such as Windows
Java solves these problems - Diagram 1
Programming problems such as accessing invalid virtual memory addresses, incorrect use of global variables (specified by the programmer) and global resources (such as file system, file descriptor table, environment and signal handlers), implicit type conversions (such as application of reference & in C++) as well as explicit type conversions used by the programmer to circumvent restrictive method prototypes.
UNIX API is obscure and geared toward procedural C programming. Its behavior is slightly different on various UNIX flavors. The POSIX standardization is not sufficient because in many situations the programmer has to use API's specific to a given UNIX vendor - HP-UX is notorious here. Another standardization - Standard C - encourages the use of global variables and uses them internally. This is a problem in programming servers that would serve more than one client in a single process.
UNIX specific UI - terminal manipulation and X11 is not portable to Windows. Process structure is totally different on Windows and the happily used UNIX fork() - which duplicates file descriptors - cannot be emulated there at all.
Java addresses most of these problems by providing a unified, object-oriented, well-designed programming platform. A running native program - the JVM - interfaces to the underlying OS and presents the unified platform to the programmer. Java platform does not provide access to virtual memory but lets the programmer use objects that are accessed by references. Objects are reference-counted and evicted from the actual memory by the garbage collector. This platform allows the programmer to focus on programming logic and not on manipulating the global environment of the executing process. Simple numerical Java types are fixed - int is always signed 32 bits and long is signed 64 bits. The int type cannot be used as boolean type.
A new application programming scheme is emerging where a platform and not OS is to support the applications. Not surprisingly Microsoft is trying to tie the platform paradigm to the Windows OS where it has client-side dominance. The UNIX community should not be lured into the same trap by clinging to legacy UNIX programming schemes.