Why URL constructors throws java.net.MalformedURLException: no protocol in these very common cases?
Because these are not valid URLs.
URI constructor supports such relative URLs.
Incorrect. It allows relative URIs.
By the way, is it correct to say "relative URI" instead of "relative URL"? Because 99% all links in the Internet is "relative URL", not "relative URI".
No. It is not correct1.
The specifications for URI and URL make it clear that "relative URL" is not valid terminology. See https://www.rfc-editor.org/rfc/rfc3986
The designers of the Java APIs for URI and URL chose (wisely IMO) to use the terminology correctly; i.e. according to the respective specifications. That is why the URL constructor will not accept a relative URI string as an argument.
1 - It is no more correct than it is correct to refer to ants as "bugs". The true bugs are the Hemiptera which is an order of Insecta (the insects) that is distinguished by having sucking mouth parts. The ants are members of the Hymenoptera order. As Wikipedia states: "Many insects commonly known as "bugs" belong to other orders; for example, the lovebug is a fly, while the May bug and ladybug are beetles." (see Wikipedia) My point? If the Java designers abused the URL / URI distinction, they would be just as bad as a biologist who referred to ants as "bugs" in a scientific paper.
java.net.URLandjava.net.URI. - Martin Heralecký