The beauty of Java is that it frees the student up from making low-level mistakes (pointer mis-initializations) and spend more time on design/making and fixing higher-level issues. Getting core dumps in GCC while compiling C code ain't the most stress-free experience.
spend more time on design/making and fixing higher-level issues
Of course, there are "higher-level issues" that you can't express in Java. Java convinces students (and professors, sadly) that the only kind of OO is single-inheritance with interfaces and no MOP. Java convinces students that programming is all about making the not-really-static types match. I won't even mention what a hack functional programming is in Java (and I'm sure most students never even hear how to hack in FP to Java). Checked exceptions were widely considered a huge failure. Honestly, I think most of the time you'll spend with Java is going to be time spent working around its retarded limitations. Do we really want to teach kids that programming is about dealing with limitations in your tools?
At the very least, limiting yourself to Java limits your ability to learn programming. Java isn't a very good language. It is missing features that were widely considered "a good thing" 20 years before its invention. Note that I don't care about teaching memory allocation and freeing the memory, that's monkey work, not computer science. So I'm not advocating teaching C. But languages like Lisp will let you teach all the computer science without workarounds, and still have all the "safety" of Java. (Plus, Lisp programmers get paid a lot more than Java programmers. Surely that's a selling point?)
It's also true that the failure of Java is that it cannot express a mis-initialized pointer.
A good programmer has to know both high-level and low-level stuff. And also has to be able to understand or, at least, to make a decent hypothesis on why GCC core-dumped.
I agree. I don't have a problem with using Java for an intro to data structures and algorithms course, provided that it isn't the last stop in the curriculum. I had to learn data structures using C++, which meant I had to figure out pointers and segmentation faults at the same time I was learning the algorithms behind lists, tree traversal, etc.
A curriculum shouldn't be dumbed down, for sure, but if you can make the learning curve easier, increase retention, and keep exit standards high, why not?
I'd think debugging those kinds of mistakes is part of learning. I've worked with too many programmers that can't debug because they don't really know what a pointer is. Even in Java understanding what the JVM is doing ON TOP of the hardware help you understand how to write good code and debug slow code.
Once qualified, sure don't reinvent the wheel, but when you are learning it's a vital experience.