??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩欧美亚洲日产国产,亚洲精品成人久久久998,在线精品视频一区二区http://www.aygfsteel.com/PariScamper/category/26373.htmlzh-cnWed, 12 Dec 2007 16:40:54 GMTWed, 12 Dec 2007 16:40:54 GMT60Java Clone机制 (zz)http://www.aygfsteel.com/PariScamper/archive/2007/12/12/167233.htmlPariScamperPariScamperWed, 12 Dec 2007 06:49:00 GMThttp://www.aygfsteel.com/PariScamper/archive/2007/12/12/167233.htmlhttp://www.aygfsteel.com/PariScamper/comments/167233.htmlhttp://www.aygfsteel.com/PariScamper/archive/2007/12/12/167233.html#Feedback0http://www.aygfsteel.com/PariScamper/comments/commentRss/167233.htmlhttp://www.aygfsteel.com/PariScamper/services/trackbacks/167233.html

1          什么是 Clone Q容易实现吗Q?/span>

单地_ Clone 是对于l定的一个对象实?/span> o Q得到另一个对象实?/span> o’ Q?/span> o ?/span> o’ c?/span>

型相同( o.getClass() == o’.getClass() Q,内容相同Q对?/span> o/o’ 中的字段 f Q如?/span> f 是基本数据类型,?/span> o.f == o’.f Q如?/span> f 是对象引用,?/span> o.f == o’.f ?/span> o.f 指向的对象与 o’.f 指向的对象的内容相同Q。通常U?/span> o’ ?/span> o 的克隆或副本?/span>

       直观上看Q似乎很ҎZ个类加上 clone ҎQ?/span>

class A {

       private Type1 field1;

    private Type2 field2;

     …..

    public Object clone() {

              A a = new A();

        a.field1 = a.getField1();

        a.field2 = a.getField2();

        ……

        return a;

    }

}

 

然而,E加推敲Q就会发现这L实现Ҏ有两个问题:

1.         要想某个cL clone 功能Q必d独ؓ其实?/span> clone() 函数Q函数实C码与该类定义密切相关?/span>

2.         即基类 A 已有 clone() 函数Q其子类 ExtendA 若要具备 clone 功能Q则必须 override 其基c?/span> A ?/span> clone() 函数。否则,对类型ؓ ExtendA 的对?/span> ea ?/span> clone() Ҏ的调用,会执行于c?/span> A 中定义的 clone() Ҏ而返回一个类型ؓ A 的对象,它显然不?/span> ea 的克隆?/span>

2          Java ?/span> clone 的支?/span>

万类之初?/span> Object cL clone() ҎQ?/span>

protected native Object clone() throws CloneNotSupportedException;

该方法是 protected 的,昄是留待被子类 override 的。该Ҏ又是 native 的,必然做了

与具体^台相关的底层工作?/span>

事实上,c?/span> Object ?/span> clone() Ҏ首先会检?/span> this.getClass() 是否实现?/span> Cloneable 接口?/span>

Cloneable 只是一个标志接口而已Q用来标志该cL否有克隆功能?/span>

public interface Cloneable {

}

       如果 this.getClass() 没有实现 Cloneable 接口Q?/span> clone() ׃?/span> CloneNotSupportedException q回。否则就会创Z个类型ؓ this.getClass() 的对?/span> other Qƈ?/span> this ?/span> field 的D值给 other 的对?/span> field Q然后返?/span> other ?/span>

       如此一来,我们要定义一个具?/span> Clone 功能的类q当方便:

1.         在类的声明中加入“ implements Cloneable ”Q标志该cL克隆功能Q?/span>

2.         Override c?/span> Object ?/span> clone() ҎQ在该方法中调用 super.clone() Q?/span>

class CloneableClass implements Cloneable {

       ……

public Object clone() {

       try {

              return super.clone(); // 直接?/span> Object.clone() 为我们代劳一?/span>

    } catch (CloneNotSupportedException e) {

              throw new InternalError();

       }

}

}

 

3          Shallow Clone ?/span> Deep Clone

3.1     Shallow ?/span> Deep 从何而来

一个具有克隆功能的c,如果有可变( Mutable Q类cd的字D?/span> field Q如何ؓ其克隆(?/span>

本)对象 o’ 中的 field 赋|

       Ҏ一、如 Object ?/span> clone() Ҏ所实现Q设原始对象?/span> o Q其克隆对象?/span> o’ Q执?/span> o’.field = o.field 。这P o’.field ?/span> o.field 指向同一个可变对?/span> m ?/span> o ?/span> o’ 可能会相互媄响(一个对象的状态可能会随着另一个对象的状态的改变而改变)。这L Clone UCؓ Shallow Clone 。这也是 Object ?/span> clone() Ҏ的实现方式?/span>

       Ҏ二、将 o.field 指向的可变对?/span> m 克隆Q得?/span> m’ Q将 m’ 的引用赋值给 o’.field 。这?/span> o’ ?/span> o 内容相同Q且怺之间无媄响(一个对象状态的改变不会影响另一个对象的状态)。这L Clone UCؓ Deep Clone ?/span>

       Java Collection cd中具体数据结构类Q?/span> ArrayList/LinkedList Q?/span> HashSet/TreeSet Q?/span> HashMap/TreeMap {)都具有克隆功能,且都?/span> Shallow Clone Q这栯计是合理的,因ؓ它们不知道存攑օ中的每个数据对象是否也有克隆功能?/span> System.arrayCopy() 的实现采用的也是 Shallow Clone ?/span>

       Deep Clone 对于实现不可变( Immutable Q类很有帮助。设一个类包含可变c?/span> M cd?/span> field Q如何将其设计ؓ不可变类呢?先ؓ M 实现 Deep Clone 功能Q然后这栯计类 ImmutableClass Q?/span>

class ImmutableClass {

       MutableClass m;

ImmutableClass(MutableClass m) {

       this.m = m.clone(); // 传入的 m ?/span> clone 赋值给内部 m

}

public MutableClass getM() {

    return this.m.clone(); // 内?/span> m ?/span> clone q回l外?/span>

}

}

 

      

3.2     如何实现 Deep Clone

查类有无可变cȝ型的字段。如果无Q返?/span> super.clone() 卛_Q?/span>

如果有,保包含的可变类本n都实C Deep Clone Q?/span>

Object o = super.clone(); // 先执行浅克隆Q确保类型正和基本cd及非可变cȝ型字D内Ҏ?/span>

对于每一个可变类cd的字D?/span> field Q?/span>

       o.field = this.getField().clone();

q回 o ?/span>



PariScamper 2007-12-12 14:49 发表评论
]]>
一不错的讲解Java异常的文?转蝲Q?---感觉很不错,M以后很有启发 http://www.aygfsteel.com/PariScamper/archive/2007/10/15/152961.htmlPariScamperPariScamperMon, 15 Oct 2007 05:09:00 GMThttp://www.aygfsteel.com/PariScamper/archive/2007/10/15/152961.htmlhttp://www.aygfsteel.com/PariScamper/comments/152961.htmlhttp://www.aygfsteel.com/PariScamper/archive/2007/10/15/152961.html#Feedback0http://www.aygfsteel.com/PariScamper/comments/commentRss/152961.htmlhttp://www.aygfsteel.com/PariScamper/services/trackbacks/152961.html六种异常处理的陋?/span>

你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机Ӟ在下面这D代码中Q你能够q速找出异常处理的六个问题吗?

1 OutputStreamWriter out = ...
2 java.sql.Connection conn = ...
3 try { // ?
4  Statement stat = conn.createStatement();
5  ResultSet rs = stat.executeQuery(
6   "select uid, name from user");
7  while (rs.next())
8  {
9   out.println("IDQ? + rs.getString("uid") // ?
10    "Q姓名:" + rs.getString("name"));
11  }
12  conn.close(); // ?
13  out.close();
14 }
15 catch(Exception ex) // ?
16 {
17  ex.printStackTrace(); //_?
18 }


  作ؓ一个JavaE序员,你至应该能够找Z个问题。但是,如果你不能找出全部六个问题,Ll阅L文?

  本文讨论的不是Java异常处理的一般性原则,因ؓq些原则已经被大多数人熟知。我们要做的是分析各U可UCؓ“反例”Qanti-patternQ的q背优秀~码规范的常见坏习惯Q帮助读者熟悉这些典型的反面例子Q从而能够在实际工作中敏锐地察觉和避免这些问题?

  反例之一Q丢弃异?

  代码Q?5?18行?

  q段代码捕获了异常却不作M处理Q可以算得上Java~程中的杀手。从问题出现的频J程度和害E度来看Q它也许可以和C/C++E序的一个恶名远播的问题相提q论??不检查缓冲区是否已满。如果你看到了这U丢弃(而不是抛出)异常的情况,可以癑ֈ之九十九地肯定代码存在问题(在极数情况下,q段代码有存在的理由Q但最好加上完整的注释Q以免引起别解)?

  q段代码的错误在于,异常Q几乎)L意味着某些事情不对劲了Q或者说臛_发生了某些不d的事情,我们不应该对E序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace不?#8220;处理异常”。不错,调用printStackTrace对调试程序有帮助Q但E序调试阶段l束之后QprintStackTrace׃应再在异常处理模块中担负主要责Q了?

  丢弃异常的情形非常普遍。打开JDK的ThreadDeathcȝ文档Q可以看C面这D说明:“特别圎ͼ虽然出现ThreadDeath是一U?#8216;正常的情?#8217;Q但ThreadDeathcLError而不是Exception的子c,因ؓ许多应用会捕h有的Exception然后丢弃它不再理睬?#8221;q段话的意思是Q虽然ThreadDeath代表的是一U普通的问题Q但鉴于许多应用会试图捕h有异常然后不予以适当的处理,所以JDK把ThreadDeath定义成了Error的子c,因ؓErrorcM表的是一般的应用不应该去捕获的严重问题。可见,丢弃异常q一坏习惯是如此常见Q它甚至已经影响CJava本n的设计?

  那么Q应该怎样Ҏ呢?主要有四个选择Q?

  1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个h或进行其他一些处理,要根据具体的情Ş定应该采取的动作。再ơ说明,调用printStackTrace不上已l?#8220;处理好了异常”?

  2、重新抛出异常。处理异常的代码在分析异怹后,认ؓ自己不能处理它,重新抛出异常也不׃ؓ一U选择?

  3、把该异常{换成另一U异常。大多数情况下,q是指把一个低U的异常转换成应用的异常(其含义更Ҏ被用户了解的异常Q?

  4、不要捕获异常?

  l论一Q既然捕获了异常Q就要对它进行适当的处理。不要捕获异怹后又把它丢弃Q不予理睬?

  反例之二Q不指定具体的异?

  代码Q?5行?

  许多时候h们会被这样一U?#8220;妙?#8221;x吸引Q用一个catch语句捕获所有的异常。最常见的情形就是用catch(Exception ex)语句。但实际上,在绝大多数情况下Q这U做法不值得提倡。ؓ什么呢Q?

  要理解其原因Q我们必d一下catch语句的用途。catch语句表示我们预期会出现某U异常,而且希望能够处理该异常。异常类的作用就是告诉Java~译器我们想要处理的是哪一U异常。由于绝大多数异帔R直接或间接从java.lang.ExceptionzQcatch(Exception ex)q当于说我们想要处理几乎所有的异常?

  再来看看前面的代码例子。我们真正想要捕L异常是什么呢Q最明显的一个是SQLExceptionQ这是JDBC操作中常见的异常。另一个可能的异常是IOExceptionQ因为它要操作OutputStreamWriter。显Ӟ在同一个catch块中处理q两U截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOExceptionp好多了。这是_catch语句应当量指定具体的异常类型,而不应该指定늛范围太广的ExceptioncR?

  另一斚wQ除了这两个特定的异常,q有其他许多异常也可能出现。例如,如果׃某种原因QexecuteQueryq回了nullQ该怎么办?{案是让它们l箋抛出Q即不必捕获也不必处理。实际上Q我们不能也不应该去捕获可能出现的所有异常,E序的其他地方还有捕获异常的Z??直至最后由JVM处理?

  l论二:在catch语句中尽可能指定具体的异常类型,必要时用多个catch。不要试囑֤理所有可能出现的异常?

  反例之三Q占用资源不释放

  代码Q??14行?

  异常改变了程序正常的执行程。这个道理虽然简单,却常常被Z忽视。如果程序用C文g、Socket、JDBCq接之类的资源,即遇到了异常,也要正确释放占用的资源。ؓ此,Java提供了一个简化这cL作的关键词finally?

  finally是样好东西:不管是否出现了异常,Finally保证在try/catch/finally块结束之前,执行清理d的代码L有机会执行。遗憄是有些h却不习惯使用finally?

  当然Q编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常??q是执行清理d的最后机会,量不要再有难以处理的错误?

  l论三:保证所有资源都被正释放。充分运用finally关键词?/span>

反例之四Q不说明异常的详l信?

  代码Q??18行?

  仔细观察q段代码Q如果@环内部出C异常Q会发生什么事情?我们可以得到_的信息判断@环内部出错的原因吗?不能。我们只能知道当前正在处理的cd生了某种错误Q但却不能获得Q何信息判断导致当前错误的原因?

  printStackTrace的堆栈跟t功能显C出E序q行到当前类的执行流E,但只提供了一些最基本的信息,未能说明实际D错误的原因,同时也不易解诅R?

  因此Q在出现异常Ӟ最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一U更适合阅读的方式整理和l织printStackTrace提供的信息?

  l论四:在异常处理模块中提供适量的错误原因信息,l织错误信息使其易于理解和阅诅R?

  反例之五Q过于庞大的try?

  代码Q??14行?

  l常可以看到有h把大量的代码攑օ单个try块,实际上这不是好习惯。这U现象之所以常见,原因在于有些h囄事,不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体cd是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大子Q虽然东西是带上了,但要扑և来可不容易?

  一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明ExceptionQ而不是分d个可能出现异常的D落q分别捕获其异常。这U做法ؓ分析E序抛出异常的原因带来了困难Q因Z大段代码中有太多的地方可能抛出Exception?

  l论五:量减小try块的体积?

  反例之六Q输出数据不完整

  代码Q??11行?

  不完整的数据是JavaE序的隐形杀手。仔l观察这D代码,考虑一下如果@环的中间抛出了异常,会发生什么事情。@环的执行当然是要被打断的Q其ơ,catch块会执行??p些,再也没有其他动作了。已l输出的数据怎么办?使用q些数据的h或设备将收到一份不完整的(因而也是错误的Q数据,却得不到M有关q䆾数据是否完整的提C。对于有些系l来_数据不完整可能比pȝ停止q行带来更大的损失?

  较ؓ理想的处|办法是向输备写一些信息,声明数据的不完整性;另一U可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一ơ性输出?

  l论六:全面考虑可能出现的异总及这些异常对执行程的媄响?

  改写后的代码

  Ҏ上面的讨论,下面l出改写后的代码。也许有Z说它E微有点?嗦,但是它有了比较完备的异常处理机制?

OutputStreamWriter out = ...
java.sql.Connection conn = ...
try {
 Statement stat = conn.createStatement();
 ResultSet rs = stat.executeQuery(
  "select uid, name from user");
 while (rs.next())
 {
  out.println("IDQ? + rs.getString("uid") + "Q姓? " + rs.getString("name"));
 }
}
catch(SQLException sqlex)
{
 out.println("警告Q数据不完整");
 throw new ApplicationException("d数据时出现SQL错误", sqlex);
}
catch(IOException ioex)
{
 throw new ApplicationException("写入数据时出现IO错误", ioex);
}
finally
{
 if (conn != null) {
  try {
   conn.close();
  }
  catch(SQLException sqlex2)
  {
   System.err(this.getClass().getName() + ".mymethod - 不能关闭数据库连? " + sqlex2.toString());
  }
 }

 if (out != null) {
  try {
   out.close();
  }
  catch(IOException ioex2)
  {
   System.err(this.getClass().getName() + ".mymethod - 不能关闭输出文g" + ioex2.toString());
  }
 }
}

  本文的结Z是放之四L准的教条Q有时常识和l验才是最好的老师。如果你对自q做法没有癑ֈ之百的信心,务必加上详细、全面的注释?

  另一斚wQ不要笑话这些错误,不妨问问你自己是否真地彻底摆׃q些坏习惯。即使最有经验的E序员偶也会误入歧途,原因很简单,因ؓ它们确实实带来?#8220;方便”。所有这些反例都可以看作Java~程世界的恶,它们丽动hQ无孔不入,时刻诱惑着你。也许有Z认ؓq些都属于鸡皮蒜毛的事Q不x齿,但请CQ勿以恶而ؓ之,勿以善小而不为?br />




------------------------------------------------------------------下面是一些java异常?------------------------------------------------------------------------------------------


术异常c:ArithmeticExecption

I指针异常类QNullPointerException

cd强制转换异常QClassCastException

数组负下标异常:NegativeArrayException

数组下标界异常QArrayIndexOutOfBoundsException

q背安全原则异常QSecturityException

文g已结束异常:EOFException

文g未找到异常:FileNotFoundException

字符串{换ؓ数字异常QNumberFormatException


操作数据库异常:SQLException


输入输出异常QIOException


Ҏ未找到异常:NoSuchMethodException

java.lang.AbstractMethodError

抽象Ҏ错误。当应用试图调用抽象Ҏ时抛出?/span>

java.lang.AssertionError

断言错。用来指CZ个断ap|的情c?/span>

java.lang.ClassCircularityError

cd@环依赖错误。在初始化一个类Ӟ若检到cM间@环依赖则抛出该异常?/span>

java.lang.ClassFormatError

cL式错误。当Java虚拟图从一个文件中dJavac,而检到该文件的内容不符合类的有效格式时抛出?/span>

java.lang.Error

错误。是所有错误的基类Q用于标识严重的E序q行问题。这些问题通常描述一些不应被应用E序捕获的反常情c?/span>

java.lang.ExceptionInInitializerError

初始化程序错误。当执行一个类的静态初始化E序的过E中Q发生了异常时抛出。静态初始化E序是指直接包含于类中的static语句Dc?/span>

java.lang.IllegalAccessError

q法讉K错误。当一个应用试图访问、修Ҏ个类的域QFieldQ或者调用其ҎQ但是又q反域或Ҏ的可见性声明,则抛异常?/span>

java.lang.IncompatibleClassChangeError

不兼容的cd化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时Q抛异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新~译而直接运行的情况下,Ҏ引发该错误?/span>

java.lang.InstantiationError

实例化错误。当一个应用试N过Java的new操作W构造一个抽象类或者接口时抛出该异?

java.lang.InternalError

内部错误。用于指CJava虚拟机发生了内部错误?/span>

java.lang.LinkageError

链接错误。该错误及其所有子cLC某个类依赖于另外一些类Q在该类~译之后Q被依赖的类改变了其cd义而没有重新编译所有的c,q而引发错误的情况?/span>

java.lang.NoClassDefFoundError

未找到类定义错误。当Java虚拟机或者类装蝲器试囑֮例化某个c,而找不到该类的定义时抛出该错误?/span>

java.lang.NoSuchFieldError

域不存在错误。当应用试图讉K或者修Ҏcȝ某个域,而该cȝ定义中没有该域的定义时抛错误?/span>

java.lang.NoSuchMethodError

Ҏ不存在错误。当应用试图调用某类的某个方法,而该cȝ定义中没有该Ҏ的定义时抛出该错误?/span>

java.lang.OutOfMemoryError

内存不错误。当可用内存不以让Java虚拟机分配给一个对象时抛出该错误?/span>

java.lang.StackOverflowError

堆栈溢出错误。当一个应用递归调用的层ơ太p导致堆栈溢出时抛出该错误?/span>

java.lang.ThreadDeath

U程l束。当调用ThreadcȝstopҎ时抛错误Q用于指C线E结束?/span>

java.lang.UnknownError

未知错误。用于指CJava虚拟机发生了未知严重错误的情c?/span>

java.lang.UnsatisfiedLinkError

未满的链接错误。当Java虚拟机未扑ֈ某个cȝ声明为nativeҎ的本a定义时抛出?/span>

java.lang.UnsupportedClassVersionError

不支持的cȝ本错误。当Java虚拟图从d某个cLӞ但是发现该文件的丅R次版本号不被当前Java虚拟机支持的时候,抛出该错误?/span>

java.lang.VerifyError

验证错误。当验证器检到某个cL件中存在内部不兼Ҏ者安全问题时抛出该错误?/span>

java.lang.VirtualMachineError

虚拟机错误。用于指C拟机被破坏或者l执行操作所需的资源不的情况?/span>


java.lang.ArithmeticException

术条g异常。譬如:整数除零{?/span>

java.lang.ArrayIndexOutOfBoundsException

数组索引界异常。当Ҏl的索引gؓ负数或大于等于数l大时抛出?/span>

java.lang.ArrayStoreException

数组存储异常。当向数l中存放非数l声明类型对象时抛出?/span>

java.lang.ClassCastException

c造型异常。假设有cA和BQA不是B的父cL子类Q,O是A的实例,那么当强制将O构造ؓcB的实例时抛出该异常。该异常l常被称为强制类型{换异常?/span>

java.lang.ClassNotFoundException

找不到类异常。当应用试图Ҏ字符串Ş式的cd构造类Q而在遍历CLASSPAH之后找不到对应名U的class文gӞ抛出该异常?/span>

java.lang.CloneNotSupportedException

不支持克隆异常。当没有实现Cloneable接口或者不支持克隆Ҏ?调用其clone()Ҏ则抛异常?/span>

java.lang.EnumConstantNotPresentException

枚D帔R不存在异常。当应用试图通过名称和枚丄型访问一个枚丑֯象,但该枚D对象q不包含帔RӞ抛出该异常?/span>

java.lang.Exception

根异常。用以描q应用程序希望捕L情况?/span>

java.lang.IllegalAccessException

q法的访问异常。当应用试图通过反射方式创徏某个cȝ实例、访问该cd性、调用该cL法,而当时又无法讉Kcȝ、属性的、方法的或构造方法的定义时抛异常?/span>

java.lang.IllegalMonitorStateException

q法的监控状态异常。当某个U程试图{待一个自己ƈ不拥有的对象QOQ的监控器或者通知其他U程{待该对象(OQ的监控器时Q抛异常?/span>

java.lang.IllegalStateException

q法的状态异常。当在Java环境和应用尚未处于某个方法的合法调用状态,而调用了该方法时Q抛异常?/span>

java.lang.IllegalThreadStateException

q法的线E状态异常。当县城未处于某个Ҏ的合法调用状态,而调用了该方法时Q抛出异常?/span>

java.lang.IndexOutOfBoundsException

索引界异常。当讉K某个序列的烦引值小?或大于等于序列大时Q抛异常?/span>

java.lang.InstantiationException

实例化异常。当试图通过newInstance()Ҏ创徏某个cȝ实例Q而该cL一个抽象类或接口时Q抛异常?/span>

java.lang.InterruptedException

被中止异常。当某个U程处于长时间的{待、休眠或其他暂停状态,而此时其他的U程通过Thread的interruptҎl止该线E时抛出该异常?/span>

java.lang.NegativeArraySizeException

数组大小值异常。当使用负数大小值创建数l时抛出该异常?/span>

java.lang.NoSuchFieldException

属性不存在异常。当讉K某个cȝ不存在的属性时抛出该异常?/span>

java.lang.NoSuchMethodException

Ҏ不存在异常。当讉K某个cȝ不存在的Ҏ时抛异常?/span>

java.lang.NullPointerException

I指针异常。当应用试图在要求用对象的地方使用了nullӞ抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计null对象的长度、用throw语句抛出null{等?/span>

java.lang.NumberFormatException

数字格式异常。当试图一个String转换为指定的数字cdQ而该字符串确不满x字类型要求的格式Ӟ抛出该异常?/span>

java.lang.RuntimeException

q行时异常。是所有Java虚拟机正常操作期间可以被抛出的异常的父类?/span>

java.lang.SecurityException

安全异常。由安全理器抛出,用于指示q反安全情况的异常?/span>

java.lang.StringIndexOutOfBoundsException

字符串烦引越界异常。当使用索引D问某个字W串中的字符Q而该索引值小?或大于等于序列大时Q抛异常?/span>

java.lang.TypeNotPresentException

cd不存在异常。当应用试图以某个类型名U的字符串表达方式访问该cdQ但是根据给定的名称又找不到该类型是抛出该异常。该异常与ClassNotFoundException的区别在于该异常是uncheckedQ不被检查)异常Q而ClassNotFoundException是checkedQ被查)异常?/span>

java.lang.UnsupportedOperationException

不支持的Ҏ异常。指明请求的Ҏ不被支持情况的异常?/span>

异常
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login Q?Login是你的action名字Q?nbsp; 

可能原因
action没有再struts-config.xml 中定义,或没有找到匹配的actionQ例如在JSP文g中?<html:form action="Login.do".表单提交给Login.do处理Q如果出Cq异常,h看struts-config.xml中的定义部分Q有时可能是打错了字W或者是某些不符合规则,可以使用strutsconsole工具来检查?br /> -----------------------------------------------------------------------------------------------------------------
异常
org.apache.jasper.JasperException: Cannot retrieve definition for form bean null

可能原因     
      
q个异常是因为StrutsҎstruts-config.xml中的mapping没有扑ֈaction期望的form bean。大部分的情况可能是因ؓ在form-bean中设|的name属性和action中设|的name属性不匚w所致。换句话_action和form都应该各自有一个name属性,q且要精匹配,包括大小写。这个错误当没有name属性和action兌时也会发生,如果没有在action中指定name属性,那么没有name属性和action相关联。当然当action制作某些控制Ӟ譬如Ҏ参数D转到相应的jsp面Q而不是处理表单数据,q是׃用name属性,q也是action的用方法之一?br /> -----------------------------------------------------------------------------------------------------------------
异常
No action instance for path /xxxx could be created

可能原因
特别提示Q因为有很多中情况会Dq个错误的发生,所以推荐大家调高你的web服务器的日志/调试U别Q这样可以从更多的信息中看到潜在的、在试图创徏actioncL发生的错误,q个actioncM已经在struts-config.xml中设|了兌Q即d?lt;action>标签Q?/span>

在struts-config.xml中通过action标签的class属性指定的actioncM能被扑ֈ有很多种原因Q例如:定位~译后的.class文gp|。Failure to place compiled .class file for the action in the classpath (在web开发中Qclass的的位置在r WEB-INF/classesQ所以你的action class必须要在q个目录下。例如你的actioncM于WEB-INF/classes/action/Login.class,那么在struts-config.xml中设|action的属性type时就是action.Login).
拼写错误Q这个也时有发生Qƈ且不易找刎ͼ特别注意W一个字母的大小写和包的名称?
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: No getter method for property username of bean org.apache.struts.taglib.html.BEAN

可能原因
没有位form bean中的某个变量定义getter Ҏ

q个错误主要发生在表单提交的FormBean中,用struts标记<html:text property=”username”>Ӟ在FormBean中必L一个getUsername()Ҏ。注意字?#8220;U”?br /> -----------------------------------------------------------------------------------------------------------------
异常
java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm

可能原因
q个错误主要发生在在classpath中找不到相应的Java .class文g。如果这个错误发生在web应用E序的运行时Q主要是因ؓ指定的class文g不在web server的classpath中(/WEB-INF/classes ?/WEB-INF/libQ。在上面的错误中Q原因是找不到ActionFormcR?br /> -----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Exception creating bean of class org.apache.struts.action.ActionForm: {1}

可能原因
Instantiating Struts-provided ActionForm class directly instead of instantiating a class derived off ActionForm. This mightoccur implicitly if you specify that a form-bean is this Struts ActionForm class rather than specifying a child of this classfor the form-bean.

Not associating an ActionForm-descended class with an action can also lead to this error.
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection

可能原因
不是标识Struts actionServlet?lt;servlet>标记是映射.do扩展名的<sevlet-mapping>标记或者两者都没有在web.xml中声明?/span>

在struts-config.xml中的打字或者拼写错误也可导致这个异常的发生。例如缺一个标记的关闭W号/>。最好用struts console工具查一下?/span>

另外Qload-on-startup必须在web.xml中声明,q要么是一个空标记Q要么指定一个数|q个数值用来表servletq行的优先Q数D大优先񔭑低?/span>

q有一个和使用load-on-startup有关的是使用Struts预编译JSP文g时也可能Dq个异常?br /> -----------------------------------------------------------------------------------------------------------------
异常
java.lang.NullPointerException at org.apache.struts.util.RequestUtils.forwardURL(RequestUtils.java:1223)

可能原因
在struts-config.xml中的forward元素~少path属性。例如应该是如下形式Q?br /> <forward name="userhome" path="/user/userhome.jsp"/>
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope


 

Probable Causes
试图在Struts的form标记外用form的子元素。这常常发生在你?lt;/html:form>后面使用Struts的html标记。另外要注意可能你不l意使用的无M的标讎ͼ?lt;html:form … />Q这样web 服务器解析时当作一个无M的标讎ͼ随后使用的所?lt;html>标记都被认ؓ是在q个标记之外的,如又使用?lt;html:text property=”id”>q有是在用taglib引入HTML标记库时Q你使用的prefix的g是html?br /> -----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Missing message for key xx.xx.xx

Probable Causes
q个key的值对没有在资源文件ApplicationResources.properties中定义。如果你使用eclipse时经常碰到这L情况Q当目重新~译Ӟeclipse会自动将classes目录下的资源文g删除?/span>

资源文gApplicationResources.properties 不在classpath中应资源文件放?WEB-INF/classes 目录下,当然要在struts-config.xml中定?
-----------------------------------------------------------------------------------------------------------------
异常
Cannot find message resources under key org.apache.struts.action.MESSAGE

可能原因
很显Ӟq个错误是发生在使用资源文gӞ而Struts没有扑ֈ资源文g?/span>

Implicitly trying to use message resources that are not available (such as using empty html:options tag instead of specifyingthe options in its body -- this assumes options are specified in ApplicationResources.properties file)

XML parser issues -- too many, too few, incorrect/incompatible versions
-----------------------------------------------------------------------------------------------------------------
异常
Strange and seemingly random characters in HTML and on screen, but not in original JSP or servlet.

可能原因
混和使用Struts的html:form标记和标准的HTML标记不正?/span>

使用的编码样式在本页中不支持?br /> -----------------------------------------------------------------------------------------------------------------
异常
"Document contained no data" in Netscape

No data rendered (completely empty) page in Microsoft Internet Explorer

可能原因
使用一个Action的派生类而没有实现perform()Ҏ或execute()Ҏ。在Struts1.0中实现的是perform()ҎQ在Struts1.1中实现的是execute()ҎQ但Struts1.1向后兼容perform()Ҏ。但你用Struts1.1创徏一个Action的派生类Qƈ且实Cexecute()ҎQ而你在Struts1.0中运行的话,׃得到"Document contained nodata" error message in Netscape or a completely empty (no HTML whatsoever) page rendered in Microsoft Internet Explorer.”的错误信息?/span>

---------------------------------------------------------------------------------------------------------------------------
异常
ServletException: BeanUtils.populate
解决Ҏ
在用Struts上传文g?遇到了javax.servlet.ServletException: BeanUtils.populate异常?br /> 我的ActionServletq没有用到BeanUtilsq些工具cR后来仔l检查代码发现是在jsp文g里的form忘了加enctype=&quot;multipart/form-data&quot; 了。所以写E序遇到错误或异常应该从多方面考虑问题存在的可能性,惛_pȝ提示信息以外的东ѝ?br /> ----------------------------------------------------------------------------------------------------------------------------
1. 定义Action? 如果指定了name, 那么必须要定义一个与它同名的FormBean才能q行form映射.2. 如果定义Action? 提交面时出?"No input attribute for mapping path..." 错误, 则需要在其input属性中定义转向的页?3. 如果插入新的数据时出?"Batch update row count wrong:..." 错误, 则说明XXX.hbm.xml中指定的key的类型ؓ原始cd(int, long),因ؓq种cd会自动分配? 而这个值往往会让pȝ认ؓ已经存在该记? 正确的方法是使用java.lang.Integer或java.lang.Long对象.4. 如果插入数据时出?"argument type mismatch" 错误, 可能是你使用了Date{特D对? 因ؓstruts不能自动从String型{换成Date?所? 你需要在Action中手动把String型{换成Date?5. Hibernate? Query的iterator()比list()Ҏ快很?6. 如果出现 "equal symbol expected" 错误, 说明你的strtus标签中包含另一个标{或者变? 例如:
<html:select property="test" onchange="<%=test%>"/>
或?br /> <html:hidden property="test" value="<bean:write name="t" property="p"/>"/>
q样的情?..
---------------------------------------------------------------------------------------------------------------------------
错误QException in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update原因与解冻I      因ؓHibernate ToolsQ或者Eclipse本n的Database ExplorerQ生?.hbn.xml工具中包含有catalog="***"Q?表示数据库名Uͼq样的属?该属性删除就可以?br /> ---------------------------------------------------------------------------------------------------------------------------
错误Qorg.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)
原因与解冻I
Ҏ1 删除Set方的cascade
Ҏ2 解决兌关系后,再删?br /> Ҏ3 在many-to-one方增加cascade 但g能是none
最后一招:
查一下hashCode equals是否使用了id作ؓ唯一标示的选项了;我用uuid.hex时是没有问题的;但是用了nativeQ就不行了,怎么办?删除啊!
----------------------------------------------------------------------------------------------------------------------------
问题Q今天用Tomcat 5.5.12Q发现原来很好用的系l不能用了,反复试发现面中不能包?taglibQ否则会出现以下提示QHTTP Status 500 -type Exception reportMessage description The server encountered an internal error () that prevented it from fulfilling this request.exceptionorg.apache.jasper.JasperException: /index.jsp(1,1) Unable to read TLD "META-INF/tlds/struts-bean.tld" from JAR file"file:*****/WEB-INF/lib/struts.jar":原因Q更C工程用的lib文g夹下的jarQ发布时也发布了servlet.jar和jsp-api.jar。解冻I把jsp-api.jar删除p册个问题了?----------------------------------------------------------------------------------------------------------------------------
错误Q?java.lang.NullPointerException
原因Q?发现 dao 实例?manage 实例{需要注入的东西没有被注入(俗称I指针异常)解决Q这个时候,你应该查看日志文Ӟ默认是应用服务器?log 文gQ比?Tomcat 是 [Tomcat 安装目录 ]/logs Q你会发现提CZQ可能是Qorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sf' defined in ServletContextresource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception isorg.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xmlorg.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml……………………….Caused by: java.io.FileNotFoundException: src\hibernate.cfg.xml可能是:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined inServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception isorg.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not foundorg.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found然后你就知道原因是因为配|文件的解析Z错误Q这个通过 Web 面是看不出来的。更多的是持久化影射文g出的错误Q导致了没有被解析;当然你需要的功能无法用了?br /> ----------------------------------------------------------------------------------------------------------------------------
错误QStandardWrapperValve[action]: Servlet.service() for servlet action threw exception
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /settlementTypeManage
或者:      type Status report      message Servlet action is not available      description The requested resource (Servlet action is not available) is not available.
原因Q???br /> ----------------------------------------------------------------------------------------------------------------------------
错误StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exceptionjava.lang.ClassNotFoundException: org.apache.struts.taglib.bean.CookieTei界面错误具体描述Q?br /> org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: org.apache.struts.taglib.bean.CookieTei
      原因与解冻I    <Ҏ一>你的“html:”开头的标签没有攑֜一?lt;html:form>?nbsp;      <Ҏ?gt;重新启动你的应用服务器,自动没有这个问?br />



PariScamper 2007-10-15 13:09 发表评论
]]>
java~程规范http://www.aygfsteel.com/PariScamper/archive/2007/10/11/152052.htmlPariScamperPariScamperThu, 11 Oct 2007 07:24:00 GMThttp://www.aygfsteel.com/PariScamper/archive/2007/10/11/152052.htmlhttp://www.aygfsteel.com/PariScamper/comments/152052.htmlhttp://www.aygfsteel.com/PariScamper/archive/2007/10/11/152052.html#Feedback0http://www.aygfsteel.com/PariScamper/comments/commentRss/152052.htmlhttp://www.aygfsteel.com/PariScamper/services/trackbacks/152052.html (2) Z常规用途而创Z个类Ӟ请采?l典形式"Qƈ包含对下q元素的定义Q?equals()
hashCode()
toString()
clone()Qimplement CloneableQ?br /> implement Serializable
(3) 对于自己创徏的每一个类Q都考虑|入一个main()Q其中包含了用于试那个cȝ代码。ؓ使用一个项目中的类Q我们没必要删除试代码。若q行了Q何Ş式的改动Q可方便地返回测试。这些代码也可作为如何用类的一个示例用?
(4) 应将Ҏ设计成简要的、功能性单元,用它描述和实C个不q箋的类接口部分。理x况下Q方法应明扼要。若长度很大Q可考虑通过某种方式其分割成较短的几个Ҏ。这样做也便于类内代码的重复使用Q有些时候,Ҏ必须非常大,但它们仍应只做同L一件事情)?
(5) 设计一个类Ӟ误w处Cؓ客户E序员考虑一下(cȝ使用Ҏ应该是非常明的Q。然后,再设w处Cؓ理代码的h考虑一下(预计有可能进行哪些Ş式的修改Q想想用什么方法可把它们变得更单)?
(6) 使类可能短精悍,而且只解决一个特定的问题。下面是对类设计的一些徏议:
■一个复杂的开兌句:考虑采用"多Ş"机制
■数量众多的Ҏ涉及到类型差别极大的操作Q考虑用几个类来分别实?
■许多成员变量在特征上有很大的差别:考虑使用几个c?
(7) 让一切东襉K可能地"U有"--private。可使库的某一部分"公共?Q一个方法、类或者一个字D늭{)Q就永远不能把它拿出。若拿出Q就可能破坏其他人现有的代码Q他们不得不重新编写和设计。若只公布自己必d布的Q就可放心大胆地改变其他M东西。在多线E环境中Q隐U是特别重要的一个因?-只有private字段才能在非同步使用的情况下受到保护?
(8) 谨惕"巨大对象l合?。对一些习惯于序~程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的E序Q再把它嵌入一个或两个巨大的对象里。根据编E原理,对象表达的应该是应用E序的概念,而非应用E序本n?
(9) 若不得已q行一些不太雅观的~程Q至应该把那些代码|于一个类的内部?
(10) M时候只要发现类与类之间l合得非常紧密,需要考虑是否采用内部c,从而改善编码及l护工作Q参见第14?4.1.2节?用内部类改进代码"Q?
(11) 可能细致地加上注释Qƈ用javadoc注释文语法生成自己的程序文?
(12) 避免使用"术数字"Q这些数字很难与代码很好地配合。如以后需要修改它Q无疑会成ؓ一场噩梦,因ؓҎ不知?100"到底是指"数组大小"q是"其他全然不同的东?。所以,我们应创Z个常敎ͼqؓ其用具有说服力的描q性名Uͼq在整个E序中都采用常数标识W。这样可使程序更易理解以及更易维护?
(13) 涉及构徏器和异常的时候,通常希望重新丢弃在构建器中捕LM异常--如果它造成了那个对象的创徏p|。这样一来,调用者就不会以ؓ那个对象已正地创徏Q从而盲目地l箋?
(14) 当客L序员用完对象以后Q若你的c要求进行Q何清除工作,可考虑清除代码置于一个良好定义的Ҏ里,采用cM于cleanup()q样的名字,明确表明自己的用途。除此以外,可在cd攄一个booleanQ布)标记Q指出对象是否已被清除。在cȝfinalize()Ҏ里,L定对象已被清除,q已丢弃了从RuntimeExceptionl承的一个类Q如果还没有的话Q,从而指Z个编E错误。在采取象这LҎ之前Q请定finalize()能够在自qpȝ中工作(可能需要调用System.runFinalizersonExit(true)Q从而确保这一行ؓQ?
(15) 在一个特定的作用域内Q若一个对象必L除(非由垃圾攉机制处理Q,请采用下q方法:初始化对象;若成功,则立卌入一个含有finally从句的try块,开始清除工作?
(16) 若在初始化过E中需要覆盖(取消Qfinalize()Q请C调用super.finalize()Q若Object属于我们的直接超c,则无此必要)。在对finalize()q行覆盖的过E中Q对super.finalize()的调用应属于最后一个行动,而不应是W一个行动,q样可确保在需要基cȝ件的时候它们依然有效?
(17) 创徏大小固定的对象集合时Q请它们传输至一个数l(若准备从一个方法里q回q个集合Q更应如此操作)。这样一来,我们可享受到数l在~译期进行类型检查的好处。此外,Z用它们,数组的接收者也许ƈ不需要将对象"造型"到数l里?
(18) 量使用interfacesQ不要用abstractcR若已知某样东西准备成ؓ一个基c,那么W一个选择应是其变成一个interfaceQ接口)。只有在不得不用方法定义或者成员变量的时候,才需要将其变成一个abstractQ抽象)cR接口主要描qC客户希望做什么事情,而一个类则致力于Q或允许Q具体的实施l节?
(19) 在构建器内部Q只q行那些对象设为正状态所需的工作。尽可能地避免调用其他方法,因ؓ那些Ҏ可能被其他h覆盖或取消,从而在构徏q程中生不可预知的l果Q参见第7章的详细说明Q?
(20) 对象不应只是单地容纳一些数据;它们的行Z应得到良好的定义?
(21) 在现成类的基上创建新cLQ请首先选择"新徏"?创作"。只有自q设计要求必须l承Ӟ才应考虑q方面的问题。若在本来允许新建的场合使用了承,则整个设计会变得没有必要地复杂?
(22) 用承及Ҏ覆盖来表C为间的差异,而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的承来表示颜色Q这是绝对应该避免的Q应直接使用一?颜色"字段?
(23) 为避免编E时遇到ȝQ请保证在自q路径指到的Q何地方,每个名字都仅对应一个类。否则,~译器可能先扑ֈ同名的另一个类Qƈ报告出错消息。若怀疑自qCc\径问题,误试在c\径的每一个v点,搜烦一下同名的.class文g?
(24) 在Java 1.1 AWT中用事?适配?Ӟ特别Ҏ到一个陷阱。若覆盖了某个适配器方法,同时拼写Ҏ没有特别讲究Q最后的l果是新添加一个方法,而不是覆盖现成方法。然而,׃q样做是完全合法的,所以不会从~译器或q行期系l获得Q何出错提C?-只不q代码的工作变得不正常了?
(25) 用合理的设计Ҏ消除"伪功?。也是_假若只需要创建类的一个对象,׃要提前限制自׃用应用程序,q加上一?只生成其中一?注释。请考虑其装成一?独生?的Ş式。若在主E序里有大量散ؕ的代码,用于创徏自己的对象,误虑采纳一U创造性的ҎQ将些代码封装v来?
(26) 警惕"分析瘫痪"。请CQ无论如何都要提前了解整个项目的状况Q再去考察其中的细节。由于把握了全局Q可快速认识自己未知的一些因素,防止在考察l节的时候陷?死逻辑"中?
(27) 警惕"q早优化"。首先让它运行v来,再考虑变得更快--但只有在自己必须q样做、而且l证实在某部分代码中的确存在一个性能瓉的时候,才应q行优化。除非用专门的工具分析瓶颈,否则很有可能是在费自己的时间。性能提升的隐含代h自己的代码变得难于理解,而且难于l护?
(28) 误住,阅读代码的时间比写代码的旉多得多。思\清晰的设计可获得易于理解的程序,但注释、细致的解释以及一些示例往往h不可估量的h倹{无论对你自己,q是对后来的人,它们都是相当重要的。如Ҏ仍有怀疑,那么误惌p图从联机Java文里找出有用信息时到的挫折,q样或许能将你说服?
(29) 如认己已q行了良好的分析、设计或者实施,那么L微更换一下思维角度。试试邀请一些外来h?-q不一定是专家Q但可以是来自本公司其他部门的h。请他们用完全新鲜的眼光考察你的工作Q看看是否能扑և你一度熟视无睹的问题。采取这U方式,往往能在最适合修改的阶D|Z些关键性的问题Q避免品发行后再解决问题而造成的金钱及_֊斚w的损失?
(30) 良好的设计能带来最大的回报。简a之,对于一个特定的问题Q通常会花较长的时间才能找CU最恰当的解x案。但一旦找C正确的方法,以后的工作就L多了Q再也不用经历数时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报Q甚x可估量)。而且׃自己倾注了大量心血Q最l获得一个出色的设计ҎQ成功的快感也是令h心动的。坚持抵制草草完工的诱惑--那样做往往得不偿失?

PariScamper 2007-10-11 15:24 发表评论
]]>
վ֩ģ壺 ɰ| | | ҵ| ĺ| | | ɯ| Ȫ| | | ҵ| ̩| | | | | ˮ| | ɽ| ޶| ʡ| | | | | | | | Զ| | | | ƽ| | | | ɽ| ϲ| ԭ| |