O nome do host deve corresponder à seguinte sintaxe:
hostname = domainlabel [ "." ] | 1*( domainlabel "." ) toplabel [ "." ]
domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
toplabel = alpha | alpha *( alphanum | "-" ) alphanum
Como você pode ver, apenas .e -é permitido, _não é.
Você então diz que //5-12-145-35_s-81:443é permitido, e é, mas não para o nome do host .
Para ver como isso ocorre:
URI uriBadHost = URI.create("//5-12-145-35_s-81:443");
System.out.println("uri = " + uriBadHost);
System.out.println(" authority = " + uriBadHost.getAuthority());
System.out.println(" host = " + uriBadHost.getHost());
System.out.println(" port = " + uriBadHost.getPort());
URI uriGoodHost = URI.create("//example.com:443");
System.out.println("uri = " + uriGoodHost);
System.out.println(" authority = " + uriGoodHost.getAuthority());
System.out.println(" host = " + uriGoodHost.getHost());
System.out.println(" port = " + uriGoodHost.getPort());
Resultado
uri = //5-12-145-35_s-81:443
authority = 5-12-145-35_s-81:443
host = null
port = -1
uri = //example.com:443
authority = example.com:443
host = example.com
port = 443
Como você pode ver, quando authoritytem um nome de host válido, o hosteport são analisados, mas quando não é válido, o authorityé tratado como texto de forma livre, e não analisado mais adiante.
ATUALIZAR
Do comentário:
System.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))saídas: /// 5-12-145-35_s-81: 443. Estou dando como nome de host
o URI construtor que você está chamando é um método de conveniência, e ele cria uma cadeia de URIs completa e analisa isso.
Passar "5-12-145-35_s-81", 443se torna //5-12-145-35_s-81:443.
Passar "/5-12-145-35_s-81", 443se torna ///5-12-145-35_s-81:443.
No primeiro, é um host e uma porta , e falha ao analisar.
No segundo, a parte da autoridade está vazia e /5-12-145-35_s-81:443é um caminho .
URI uri1 = new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null);
System.out.println("uri = " + uri1);
System.out.println(" authority = " + uri1.getAuthority());
System.out.println(" host = " + uri1.getHost());
System.out.println(" port = " + uri1.getPort());
System.out.println(" path = " + uri1.getPath());
Resultado
uri = ///5-12-145-35_s-81:443
authority = null
host = null
port = -1
path = /5-12-145-35_s-81:443