Because java.lang.String has other ways of specifying where it ends. The length() method is the main one.
The reason C uses the NULL character* is because there is no other way to indicate how large an array is. Arrays in C have no hard bounds like arrays in Java have. You can easily try to read "elements" beyond its border. These are usually the cause for many (security) bugs in programs (buffer overruns). Java has solved this using the bounds checking (with an ArrayIndexOutOfBounds being thrown if the index is invalid) and the length field all arrays have.
* The NULL character is actually still available in Java. It's the character '\0', or (char)0. It just isn't necessary for ending strings.
The C programming language does not even have a real string data type. It only has characters (the char data type) and to represent strings, arrays of characters are used. The convention in C is that a string (actually a character array) ends with a null character to indicate the end of the string.
The way that strings are represented in C is not the only possible way that you can represent strings. Different programming languages, such as Java, have a different way to deal with strings. There's really no reason to assume that in Java it needs to be the same as in C.
I remember from long ago, when I was programming in Pascal that it was different there too: strings were not null-terminated; instead the first byte of the string contained the length of the string, and after that were the N bytes containing the characters of the string.