With all the hate Java gets, it's deserved and unwarranted at the same time. Java has some severe limitations due to the way it's created. It was designed to work in its own memory region that a lightweight VM manages. As such, it's lacking the robustness of some other languages like C#. There are pros and cons to each approach. Java's biggest pro is code never needs to be adjusted for whatever OS you want it to run on. You compile it once and it can run on nearly anything that has a jvm. With C# et al, you have to compile them in individual formats for various platforms (Windows, Legacy Windows, Mac, Linux, etc) and maintain different codes for each of them. Java also does its own garbage collection, but the vm can cause longer than necessary startup times and larger than necessary memory requirements. Java is also a little behind the curve when it comes to implementing what some would deem essentials. Lambda expressions (anonymous functions that return values) have existed in C# since version 2 back in 2005, but Java only picked them up in version 8 in 2014.
It really boils down to what you need a program to do. My preferences: Want to cross platform? Java. Want to read direct memory addresses? Anything with pointers. Need to get a grasp on how programming mechanics work? Scratch. Want to write a script? Python, Perl or Ruby (they're pretty equal for my needs). I started learning programming around 16 and I know several languages, but I'm always having to refer to the documentation for syntax and keywords (is "on" a keyword in Java or Perl? Does this language use "AND" or "&&"? etc).