典型情况下URI构造函数用于建立封装用户指定的URI的URI对象。因为用户可能输入不正确的URI,所以URI构造函数产生已检查的URISyntaxException对象。这意味着你的代码必须明确地尝试着调用某个URI构造函数并捕捉异常,或者通过在该方法的Throws子句中列举URISyntaxException以"推卸责任"。 如果你知道URI是有效的(例如在源代码中的URI),将不会产生URISyntaxException对象。因为在这种情况下处理某个URI构造函数的异常处理要求可能有困难,所以URI提供了静态的create(String uri)方法。 这个方法分解通过uri引用的String对象中包含URI,如果该URI没有违反任何语法规则就建立URI对象(并从方法中返回对它的引用),否则将捕捉到一个内部的URISyntaxException对象,把该对象包装金一个未检查的IllegalArgumentException对象中,并抛出这个IllegalArgumentException对象。 因为IllegalArgumentException是未检查的,你不需要明确的尝试代码并捕捉异常或把它的类名称列举在Throws子句中。 下面的代码片断演示了create(String uri): URI uri = URI.create ("http://www.cnn.com"); URI构造函数和create(String uri)方法试图分解出某个URI的授权机构组件的用户信息、主机和端口部分。对于按正常形式形成的基于服务器的授权机构组件,它们是会成功的。对于按拙劣的形式形成的基于服务器的授权机构组件,他们将会失败--并且把该授权机构组件当作是基于注册的。 有时你可能知道某个URI的授权机构组件必须是基于服务器的。你可以确保该URI的授权机构组件分解出用户信息、主机和端口,或者你可以确保将产生一个异常(伴随着相应的诊断信息)。你可以通过调用URI的parseServerAuthority()方法实现这种操作。 如果成功分解出URI,该方法将返回包含提取的用户信息、主机和端口部分的URI的新URI对象的一个引用(但是如果授权机构组件已经被分解过了,将会返回调用parseServerAuthority()的URI对象的引用。),否则该方法将产生一个URISyntaxException对象。 下面的代码片断演示了parseServerAuthority(): // 下面的parseServerAuthority()调用出现后会发生什么情况? URI uri = new URI ("//foo:bar").parseServerAuthority(); 一旦拥有了URI对象,你就可以通过调用getAuthority()、getFragment()、getHost()、getPath()、getPort()、getQuery()、getScheme()、getSchemeSpecificPart()和 getUserInfo()方法提取多种组件。 你也可以通过调用isAbsolute()确定该URI是绝对的还是相对的,通过调用isOpaque()确定该URI是不透明的还是分层的。如果返回值是true意味着该URI是绝对的或不透明的,如果返回值是false意味着该URI是相对的或分层的。 列表1中的程序用命令行参数建立了一个URI对象,调用URI组件提取方法来检索URI的组件,并调用URI的isAbsolute()和isOpaque()方法把该URI分类为绝对的/相对性和不透明的/分层的。 列表1: URIDemo1.java // URIDemo1.java import java.net.*; class URIDemo1 { ublic static void main (String [] args) throws Exception { if (args.length != 1) { System.err.println ("usage: java URIDemo1 uri"); return; } URI uri = new URI (args [0]); System.out.println ("Authority = " +uri.getAuthority ()); System.out.println ("Fragment = " +uri.getFragment ()); System.out.println ("Host = " +uri.getHost ()); System.out.println ("Path = " +uri.getPath ()); System.out.println ("Port = " +uri.getPort ()); System.out.println ("Query = " +uri.getQuery ()); System.out.println ("Scheme = " +uri.getScheme ()); System.out.println ("Scheme-specific part = " + uri.getSchemeSpecificPart ()); System.out.println ("User Info = " +uri.getUserInfo ()); System.out.println ("URI is absolute: " +uri.isAbsolute ()); System.out.println ("URI is opaque: " +uri.isOpaque ()); } } |