gpt4 book ai didi

java - 为什么 java.net.URI 构造函数不会针对字母字符串抛出 URISyntaxException?

转载 作者:行者123 更新时间:2023-12-02 04:03:04 26 4
gpt4 key购买 nike

为什么当我传入“abc”这样的字符串时,java.net.URI 构造函数不抛出异常?我已将其与下面的测试用例隔离。

import static org.junit.Assert.assertEquals;

import java.net.URI;
import java.net.URISyntaxException;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;


@RunWith(JUnit4.class)
public class HelloWorldTest {
@Test(expected=URISyntaxException.class)
public void testAlphabeticStringWithUriConstructor()
throws URISyntaxException {
URI uri = new URI("abc");
}
}

编译并运行时,会产生以下结果:

$ java -cp .:lib/junit-4.12.jar:lib/hamcrest-core-1.3.jar org.junit.runner.JUnitCore HelloWorldTest
JUnit version 4.12
.E
Time: 0.005
There was 1 failure:
1) testAlphabeticStringWithUriConstructor(HelloWorldTest)
java.lang.AssertionError: Expected exception: java.net.URISyntaxException
at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:32)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
at org.junit.runner.JUnitCore.main(JUnitCore.java:36)

FAILURES!!!
Tests run: 1, Failures: 1

根据javadocs for URI ,构造函数 java.net.URI 应抛出 URISyntaxException “如果给定字符串违反 RFC 2396,如上述偏差所增加”,其中包含一些较小的偏差。并且 URI 构造函数确实捕获其他格式错误的 URI。但出于某种原因,这个似乎没问题。 “abc”有可能是一个有效的 URI 吗? RFC 2396 - Uniform Resource Identifier (URI): Generic Syntax如果是的话,没有明确指出。

最终,这是一个问题,因为我想在尝试发出 HTTP 请求之前验证用户提供的字符串是否为 URI。

最佳答案

嗯,"abc" 是一个完全有效的 URI 字符串。假设我想引用当前目录中名为 abc 的文件。这就是方法!

我猜你确实想使用 URL,在这种情况下会抛出以下异常:

Exception in thread "main" java.net.MalformedURLException: no protocol: abc
at java.net.URL.<init>(URL.java:586)
at java.net.URL.<init>(URL.java:483)
at java.net.URL.<init>(URL.java:432)
at offlineAnalysis.Main.main(Main.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

URI 与 URL 不同,但我不打算解释它,已经有答案了:What is the difference between a URI, a URL and a URN?

关于java - 为什么 java.net.URI 构造函数不会针对字母字符串抛出 URISyntaxException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34685850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com