foo(String... args) is called when you provide zero or more Strings, or a String array.
foo(String args) is called when you provide a real String array.
foo(String args) is called when you provide exactly one String.
That leaves two overlaps: one String and a String array. For these cases, the most specific method is found. Applied to varargs, it says that the method with varargs is only used if no other method matches.
That compiler error is thrown because null matches both String and String, and the compiler can't make a choice between the two. It will work when you either provide a reference variable that happens to be null, because it then uses the variable's declared type, or if you manually cast and tell the compiler which of the two methods to use.
Welcome to JavaRanch! The 'String...' form represents a vararg, which means that the method expects zero or more Strings to be passed to it. The 'String' form represents a String array, so the method expects a String array to be passed to it. The 'String' form represents a String object, so the method will be expecting a single String object to be passed to it.