Archive for the '网站开法点滴' Category

关于 JAVA Exception

星期六, 09月 6th, 2008

异常的概念  
       任何的异常都是Throwable类(为何不是接口??),并且在它之下包含两个字类Error / Exception,而Error仅在当在Java虚拟机中发生动态连接失败或其它的定位失败的时候,Java虚拟机抛出一个Error对象。典型的简易程序不捕获或抛出Errors对象,你可能永远不会遇到需要实例化Error的应用,那就让我们关心一下Exception。
       Exception中比较重要的就是RuntimeException(运行时异常)-可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明,也就是说你的应用应该不去“关心”(说不关心是不服责任的,但只是你不应该试图实例化它的字类)。  RuntimeException,就如同你不应该关心Error的产生与处理一样!RuntimeException描述的是程序的错误引起来的,因该由程序负担这个责任!(从责任这个角度看Error属于JVM需要负担的责任;RuntimeException是程序应该负担的责任;checked exception 是具体应用负担的责任)
       除了Error与RuntimeException,其他剩下的异常都是你需要关心的,而这些异常类统称为Checked Exception,至于Error与RuntimeException则被统称为Unchecked Exception.

         关于 Java 中引入的 Checked Exceptions,目前存在着很多反对意见。正方的观点是引入 Checked Exceptions,可以增加程度的鲁棒性。反方的观点是 Checked Exceptions 很少被开发人员正确使用过,并且降低了程序开发的生产率和代码的执行效率。

Java 中定义了两类异常: 
1) Checked exception: 这类异常都是Exception的子类 。异常的向上抛出机制进行处理,如果子类可能产生A异常,那么在父类中也必须throws A异常。可能导致的问题:代码效率低,耦合度过高。C#中就没有使用这种异常机制。
2) Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是特殊的,它们不能通过client code来试图解决,所以称为Unchecked exception 。  
   
(JAVA视线论坛robbin’s view,个人觉得用来做业务流程控制违背了Exception设计的初衷,但可以借鉴一下)
     在使用UseCase来描述一个场景的时候,有一个主事件流和n个异常流。异常流可能发生在主事件流的过程,而try语句里面实现的是主事件流,而catch里面实现的是异常流,在这里Exception不代表程序出现了异常或者错误,Exception只是面向对象化的业务逻辑控制方法。如果没有明白这一点,那么我认为并没有真正明白应该怎么使用Java来正确的编程。 
      而我自己写的程序,会自定义大量的Exception类,所有这些Exception类都不意味着程序出现了异常或者错误,只是代表非主事件流的发生的,用来进行那些分支流程的流程控制的。例如你往权限系统中增加一个用户,应该定义1个异常类,UserExistedException,抛出这个异常不代表你插入动作失败,只说明你碰到一个分支流程,留待后面的catch中来处理这个分支流程。传统的程序员会写一个if else来处理,而一个合格的OOP程序员应该有意识的使用try catch 方式来区分主事件流和n个分支流程的处理,通过try catch,而不是if else来从代码上把不同的事件流隔离开来进行分别的代码撰写。

(另外一种观点,不同于robbin,个人赞同,并引用于此)
1。什么时候抛出异常–涉及到服务类
2。抛出checked还是unchecked的异常–涉及到客户类
       对第一个问题来说,我想异常本身这个字解释了某些东西,异常就是我们认为在正常情况下不可能发生的问题,并且服务代码不知道如何去处理。譬如说我做一个监控程序,需要用压缩卡提供的API去初始化所有的板卡,API提供的是boolean型的返回值,但我把这个API变成抛出一个异常,因为除非特殊原因,我不认为会发生初始化失败的情况,当然更不知道怎样去处理这个问题。又譬如Hibernate里面的LoadObject使用没有发现这个对象存在,那Hibernate也是认为不可能的,除非其他代码直接删除了数据库里面的记录,那么也需要抛出异常。当然Hibernate本身也不知道如何处理这种情况。
       但是如果发生的情况是可以预期的,那我不认为应该抛出例外。象上面这个userExist的情况,我认为应该在前面已经分流,应该首先判断这个用户是否存在,if(userExists()),然后进行处理,而不应当抛出例外。以及login应当返回true或者false。也就是说,这些属于程序的正常流程,而不是例外,不是异常。把例外作为正常程序流程的控制机制,只不过是把服务代码中的if转移到客户代码去,没有减少任何需要处理的代码,反而增加了系统的负担(生成例外栈)。
       还有抛出异常的情况是违反方法的先决条件,每一个方法都有自己的先决条件和后置条件,方法只有在正确的前提下才能执行达到一个正确的后果,(所谓类的不变量)。譬如你去存取一个数组的某一个元素,这个存取方法有一个前提条件,就是你的索引应当落入它的最大下标和最小下标之间,不然就应当抛出一个例外。
         对于第二个问题,端视于客户代码是否能够根据这个例外进行合理的处理。如果客户代码根本就不知道如何处理这个例外,应当把它作为一个unchecked例外,例如上面下标的问题,客户代码用一个不合法的下标来存取数组,那么抛出一个checked例外以后,客户代码是+1还是-1?显然根本就不可能做出“合理的”处理,客户既然不能处理,还要强制它去处理,那么就是捕获,打印了事,没有增加任何价值。但是如果是客户可以处理的,或者可以选择不同的方式处理的,那么就可能需要用checked,但我发现很少有这样的情况。对于类似于RemoteException或者SQLException这些Exception,我一般都转换为具体的业务Exception,而我所有的业务Exception都是RuntimeException.
         所以我的观点是,是否抛出例外就是服务代码是否进行合理的处理,抛出什么类型的例外就是客户代码是否能够合理的处理。

保护封装性的代码实例:
      不要让你要抛出的checked [...]

软件组件:粗粒度与细粒度

星期六, 03月 29th, 2008

《IBM开发者》网页链接:http://www.ibm.com/developerworks/cn/webservices/ws-soa-granularity/index.html?ca=drs-cn

SOA 与 CORBA的比较

星期一, 03月 24th, 2008

        SOA:Service Orient Architecture 即“面向服务架构”
        CORBA:Common Object Request Broker Architecture 即“通用对象请求代理架构”
        论辈分,SOA要属CORBA儿子辈儿了。CORBA提出的时间较早,主要针对的应用是分布式的计算体系,两端的应用通过代理(Broker)的名字服务在IIOP(Internet InterOperability Protocol)和GIOP(General InterOperability Protocol)协议下完成相互间的通信,另外值得一提的事CORBA具有平台无关性,因为它是用接口描述语言(IDL:Interface Description Language)来实现的。
        SOA提出的时间相对来说要晚一些,但是最近几年越炒越火。SOA主要的对象是企业级的应用,他遵从传统的Client/Server模式。SOA应用是由一系列的服务(Services)组成的,而每个服务则又是又一组组件(Components)来构成的。由于它的这种可重用、可扩展、可编排的特性SOA非常适合企业级应用。Web Service是SOA的最佳实现,具体情况还不太了解,以后再说。
        本人只是小菜一碟儿,说的只是自己的一点点理解,欢迎大家指正。
参考网页:http://microsites.cmp.com/documents/s=9063/ilc1086397013472/

Struts 的logic标签用法

星期四, 03月 20th, 2008

原文地址:http://www.dojochina.com/?q=node/502

Tomcat+Struts+Eclipse配置方法

星期二, 03月 18th, 2008

文章出处:http://www.loohost.com/thread-1896-1-1.html
插件(EMF,HtmlEditer,StrutsIDE)下载地址:
http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=StrutsIDE

Eclipse出现的问题(“Error occurred during initialization of VM Could not reserve enough space for object heap”。)

星期五, 03月 14th, 2008

        今天又重新安装了一遍Eclipse。出现了上述问题,基本上进不去Eclipse(只是偶尔才能进去)。原来是在Eclipse启动时为Java虚拟机(JVM)分配的内存和大于系统可用内存数,所以没有足够的空间分配给JVM来创建Object。JVM中如果98%的时间是用于GC且可用的, Heap size不足2%的时候将抛出此异常信息。JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.
        修改eclipse目录下的eclipse.ini里面的几个参数:-Xms -Xmx,给他们赋予适当的值。规则如下JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
        现在我的eclipse.ini为:
-showsplash
org.eclipse.platform
–launcher.XXMaxPermSize
256M
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx256m   

OSI七层网络模型与TCP/IP四层网络模型

星期二, 03月 11th, 2008

转载于:http://wwwzbx.blog.51cto.com/6920/2964

配置Eclipse+Tomcat+MySql的JSP环境

星期日, 03月 9th, 2008

from:http://leafit.bokee.com/3039895.html

今天在eclipse下编写struts程序时发生的晕事儿

星期日, 03月 9th, 2008

        下午想用eclipse 编写个struts web 小工程,可是 eclipse 就是无法解析javax.servlet.http.* 。弄了好长时间,java环境变量也设置了,我还把%CATALINA_HOME%/COMMON/LIB/servlet-api.jar 放到JRE/lib文件夹下的ext文件夹里面了,可是还不行~~~
        万事有果必有因,后来发现了问题所在:我曾经先后安装了两个Java运行环境,在eclipse里面配置的是JRE1.6.0_03,但是我一直都是在对JDK1.6下面的JRE进行操作,能行才怪了!我赶快把eclipse里面的JAVA配置给改了,终于恢复正常了。

软件学院网站建站调查中……

星期四, 02月 28th, 2008

    第一步、开始进行涉众调查。
    下周日之前完成涉众调查,涉众包括:

学院领导

行政老师

任课教师

普通同学

学生社团同学

游客

Recent Posts:
  1. I'm still fighting for a good future
  2. C++内存分配方式(转载)
  3. 详解Java里的堆和栈(转载,exellent!)
  4. A Skeleton in the Cupboard.
  5. Be thankful for what you have