java.lang.IllegalArgumentException: URI is not hierarchical

在加载图片的时候使用方法Thread.currentThread().getContextClassLoader().getResource(String source)方法获取。
结果却导至在工程中(eclipse)能正常运行,而导出的jar包在加载图片的时候就运行出错:
报:

 

[java]  view plain  copy
  1. Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: URI i  
  2. s not hierarchical  
  3.         at java.io.File.<init>(File.java:363)  
  4.         at replicator.move.wizard.panel.PanelMoveFirst.installComponents(PanelMo  
  5. veFirst.java:55)  
  6.         at replicator.move.wizard.panel.PanelMoveFirst.<init>(PanelMoveFirst.jav  
  7. a:37)  
  8.         at replicator.move.wizard.DlgMoveWizard.initNavigationTree(DlgMoveWizard  
  9. .java:123)  
  10.         at replicator.move.wizard.DlgMoveWizard.<init>(DlgMoveWizard.java:110)  
  11.         at replicator.move.mainPanel.PanelMainOperation.osMove(PanelMainOperatio  
  12. n.java:211)  
  13.         at replicator.move.mainPanel.PanelMainOperation.actionOptMenuPerformed(P  
  14. anelMainOperation.java:175)  
  15.         at replicator.move.mainPanel.opt.PanelOperator.actionOptPerformed(PanelO  
  16. perator.java:228)  
  17.         at replicator.move.mainPanel.opt.PanelOperator$PanelOptItem.actionPerfor  
  18. m(PanelOperator.java:677)  
  19.         at replicator.move.mainPanel.opt.PanelOperator$PanelOptItem.access$0(Pan  
  20. elOperator.java:673)  
  21.         at replicator.move.mainPanel.opt.PanelOperator$OptItemActionListener.act  
  22. ionPerformed(PanelOperator.java:318)  
  23.         at replicator.rose.RActionLabel.fireActionEvent(RActionLabel.java:74)  
  24.         at replicator.rose.RActionLabel.access$4(RActionLabel.java:70)  
  25.         at replicator.rose.RActionLabel$lbMouseListener.mousePressed(RActionLabe  
  26. l.java:106)  
  27.         at java.awt.Component.processMouseEvent(Component.java:6260)  
  28.         at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)  
  29.         at java.awt.Component.processEvent(Component.java:6028)  
  30.         at java.awt.Container.processEvent(Container.java:2041)  
  31.         at java.awt.Component.dispatchEventImpl(Component.java:4630)  
  32.         at java.awt.Container.dispatchEventImpl(Container.java:2099)  
  33.         at java.awt.Component.dispatchEvent(Component.java:4460)  
  34.         at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574  
  35. )  
  36.         at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4235)  
  37.   
  38.         at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)  
  39.         at java.awt.Container.dispatchEventImpl(Container.java:2085)  
  40.         at java.awt.Window.dispatchEventImpl(Window.java:2478)  
  41.         at java.awt.Component.dispatchEvent(Component.java:4460)  
  42.         at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)  
  43.         at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre  
  44. ad.java:269)  
  45.         at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.  
  46. java:184)  
  47.         at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre  
  48. ad.java:174)  
  49.         at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)  
  50.   
  51.         at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)  
  52.   
  53.         at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)  


原来根据:getResource(String source)方法获取的图片,我们不能对它的数据进行操作。
要对获取的资源文件的数据进行操作,就得用
public InputStream getResourceAsStream(String name)
来直接获取文件流,然后对该文件流进行操作。
查看File(URI uri)源码发现,该异常是从这里抛出来的。

[java]  view plain  copy
  1. if (uri.isOpaque())  
  2.         throw new IllegalArgumentException("URI is not hierarchical");  


 

在查看URI的isOpaque()方法,

查看UIR.isOpaqua()的源码为:

[java]  view plain  copy
  1. public boolean isOpaque() {  
  2.         return path == null;  
  3.     }  


 

解释如下:
public boolean isOpaque()判断此 URI 是否为不透明的。 
当且仅当 URI 是绝对的且其特定于方案的部分不是以斜线字符 ('/') 开始时,此 URI 才是不透明的。
不透明的 URI 具有一个方案、一个特定于方案的部分,以及可能会有的一个片段;所有其他组成部分都是未定义的。 不透明 URI 无法进行进一步解析。
返回:
当且仅当此 URI 是不透明的,才返回 true

查看输出为:jar:file:/C:/test.jar!/images/welcome.gif
而在我们的工程中(eclipse工程)输出为:file:/D:/work/work/test/bin/images/welcome.gif
因而在eclipse中该uir为非透明的,而在jar包中为透明的。所以就只在由jar启动时,才会报错。


在jar包运行,获取到的path(getPath())为null
而在eclipse中获取到的/D:/work/work/test/bin/images/welcome.gif

 

URI语法:[scheme:] scheme-specific-part [#fragment]

URI分不透明URI和分层URI。

不透明URI:不透明的URI指scheme-specific-part不是以正斜杠(/)开头的绝对的URI。不透明的URI并不是用于分解的。不透明的URI与其它的URI不同,它不服从标准化、分解和相对化。

分层URI:分层的URI可以是以正斜杠开头的绝对的URI或相对的URL。scheme-specific-part的语法:[//authority] [path] [?query]。

分层URI分成基于服务器或基于注册的URI

基于服务器的URI[//authority] 部分语法为:[userinfo@] host [:port]。

URI标准化:

标准化可以通过目录术语来理解。假定目录x直接位于根目录之下,x有子目录a和b,b有文件memo.txt,a是当前目录。为了显示memo.txt中的 内容(在微软Windows下),你可能输入type \x\.\b\memo.txt。你也可能输入type\x\a\..\b\memo.txt,在这种情况下,a和..的出现是没有必要的。这两种形式都 不是最简单的。但是如果输入\x\b\memo.txt,你就指定了最简单的路径了,从根目录开始访问memo.txt。最简单的\x\b \memo.txt路径就是标准化的路径。

绝对URI:绝对的URI指以scheme(后面跟着冒号)开头的URI。

绝 对路径:路径(path)可以分成一系列的路径片断(pathsegment),每个路径片断使用正斜杠与其它的路径片断隔开。如果路径的第一个路径片断 以一个正斜杠开始,该路径就被认为是绝对的。否则路径就被认为是相对的。绝对路径是相对于分层URI而言。不透明URI没有可分解的路径概念。

   通常通过基本的和相对的URI访问资源。基本的URI是绝对的URI,它唯一地标识了某种资源的名字空间,而相对的URI标识了与基础的URI相对的资 源。(与基本的URI不同,相对的URI在某种资源的生存周期内可以永远不需要改变)。因为基本的和相对的URI都不能完整的识别某种资源,有必要把两种 URI通过解析过程合并。相反地,通过相对化从合并的URI中提取相对的URI也是可行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值