你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机Ӟ在下面这D代码中Q你能够q速找出异常处理的六个问题吗?
1 OutputStreamWriter out = ... 2 java.sql.Connection conn = ... 3 try { // ?nbsp; 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") // ?nbsp; 10 "Q姓名:" + rs.getString("name")); 11 } 12 conn.close(); // ?nbsp; 13 out.close(); 14 } 15 catch(Exception ex) // ?nbsp; 16 { 17 ex.printStackTrace(); //_?nbsp; 18 } |
作ؓ一个JavaE序员,你至应该能够找Z个问题。但是,如果你不能找出全部六个问题,Ll阅L文?nbsp;
本文讨论的不是Java异常处理的一般性原则,因ؓq些原则已经被大多数人熟知。我们要做的是分析各U可UCؓ“反例”Qanti-patternQ的q背优秀~码规范的常见坏习惯Q帮助读者熟悉这些典型的反面例子Q从而能够在实际工作中敏锐地察觉和避免这些问题?nbsp;
反例之一Q丢弃异?nbsp;
代码Q?5?18行?nbsp;
q段代码捕获了异常却不作M处理Q可以算得上Java~程中的杀手。从问题出现的频J程度和害E度来看Q它也许可以和C/C++E序的一个恶名远播的问题相提q论??不检查缓冲区是否已满。如果你看到了这U丢弃(而不是抛出)异常的情况,可以癑ֈ之九十九地肯定代码存在问题(在极数情况下,q段代码有存在的理由Q但最好加上完整的注释Q以免引起别解)?nbsp;
q段代码的错误在于,异常Q几乎)L意味着某些事情不对劲了Q或者说臛_发生了某些不d的事情,我们不应该对E序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace不?#8220;处理异常”。不错,调用printStackTrace对调试程序有帮助Q但E序调试阶段l束之后QprintStackTrace׃应再在异常处理模块中担负主要责Q了?nbsp;
丢弃异常的情形非常普遍。打开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的设计?nbsp;
那么Q应该怎样Ҏ呢?主要有四个选择Q?nbsp;
1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个h或进行其他一些处理,要根据具体的情Ş定应该采取的动作。再ơ说明,调用printStackTrace不上已l?#8220;处理好了异常”?nbsp;
2、重新抛出异常。处理异常的代码在分析异怹后,认ؓ自己不能处理它,重新抛出异常也不׃ؓ一U选择?nbsp;
3、把该异常{换成另一U异常。大多数情况下,q是指把一个低U的异常转换成应用的异常(其含义更Ҏ被用户了解的异常Q?nbsp;
4、不要捕获异常?nbsp;
l论一Q既然捕获了异常Q就要对它进行适当的处理。不要捕获异怹后又把它丢弃Q不予理睬?nbsp;
反例之二Q不指定具体的异?nbsp;
代码Q?5行?nbsp;
许多时候h们会被这样一U?#8220;妙?#8221;x吸引Q用一个catch语句捕获所有的异常。最常见的情形就是用catch(Exception ex)语句。但实际上,在绝大多数情况下Q这U做法不值得提倡。ؓ什么呢Q?nbsp;
要理解其原因Q我们必d一下catch语句的用途。catch语句表示我们预期会出现某U异常,而且希望能够处理该异常。异常类的作用就是告诉Java~译器我们想要处理的是哪一U异常。由于绝大多数异帔R直接或间接从java.lang.ExceptionzQcatch(Exception ex)q当于说我们想要处理几乎所有的异常?nbsp;
再来看看前面的代码例子。我们真正想要捕L异常是什么呢Q最明显的一个是SQLExceptionQ这是JDBC操作中常见的异常。另一个可能的异常是IOExceptionQ因为它要操作OutputStreamWriter。显Ӟ在同一个catch块中处理q两U截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOExceptionp好多了。这是_catch语句应当量指定具体的异常类型,而不应该指定늛范围太广的ExceptioncR?nbsp;
另一斚wQ除了这两个特定的异常,q有其他许多异常也可能出现。例如,如果׃某种原因QexecuteQueryq回了nullQ该怎么办?{案是让它们l箋抛出Q即不必捕获也不必处理。实际上Q我们不能也不应该去捕获可能出现的所有异常,E序的其他地方还有捕获异常的Z??直至最后由JVM处理?nbsp;
l论二:在catch语句中尽可能指定具体的异常类型,必要时用多个catch。不要试囑֤理所有可能出现的异常?nbsp;
反例之三Q占用资源不释放
代码Q??14行?nbsp;
异常改变了程序正常的执行程。这个道理虽然简单,却常常被Z忽视。如果程序用C文g、Socket、JDBCq接之类的资源,即遇到了异常,也要正确释放占用的资源。ؓ此,Java提供了一个简化这cL作的关键词finally?nbsp;
finally是样好东西:不管是否出现了异常,Finally保证在try/catch/finally块结束之前,执行清理d的代码L有机会执行。遗憄是有些h却不习惯使用finally?nbsp;
当然Q编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常??q是执行清理d的最后机会,量不要再有难以处理的错误?nbsp;
l论三:保证所有资源都被正释放。充分运用finally关键词?/span>
反例之四Q不说明异常的详l信?nbsp;
代码Q??18行?nbsp;
仔细观察q段代码Q如果@环内部出C异常Q会发生什么事情?我们可以得到_的信息判断@环内部出错的原因吗?不能。我们只能知道当前正在处理的cd生了某种错误Q但却不能获得Q何信息判断导致当前错误的原因?nbsp;
printStackTrace的堆栈跟t功能显C出E序q行到当前类的执行流E,但只提供了一些最基本的信息,未能说明实际D错误的原因,同时也不易解诅R?nbsp;
因此Q在出现异常Ӟ最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一U更适合阅读的方式整理和l织printStackTrace提供的信息?nbsp;
l论四:在异常处理模块中提供适量的错误原因信息,l织错误信息使其易于理解和阅诅R?nbsp;
反例之五Q过于庞大的try?nbsp;
代码Q??14行?nbsp;
l常可以看到有h把大量的代码攑օ单个try块,实际上这不是好习惯。这U现象之所以常见,原因在于有些h囄事,不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体cd是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大子Q虽然东西是带上了,但要扑և来可不容易?nbsp;
一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明ExceptionQ而不是分d个可能出现异常的D落q分别捕获其异常。这U做法ؓ分析E序抛出异常的原因带来了困难Q因Z大段代码中有太多的地方可能抛出Exception?nbsp;
l论五:量减小try块的体积?nbsp;
反例之六Q输出数据不完整
代码Q??11行?nbsp;
不完整的数据是JavaE序的隐形杀手。仔l观察这D代码,考虑一下如果@环的中间抛出了异常,会发生什么事情。@环的执行当然是要被打断的Q其ơ,catch块会执行??p些,再也没有其他动作了。已l输出的数据怎么办?使用q些数据的h或设备将收到一份不完整的(因而也是错误的Q数据,却得不到M有关q䆾数据是否完整的提C。对于有些系l来_数据不完整可能比pȝ停止q行带来更大的损失?nbsp;
较ؓ理想的处|办法是向输备写一些信息,声明数据的不完整性;另一U可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一ơ性输出?nbsp;
l论六:全面考虑可能出现的异总及这些异常对执行程的媄响?nbsp;
改写后的代码
Ҏ上面的讨论,下面l出改写后的代码。也许有Z说它E微有点?嗦,但是它有了比较完备的异常处理机制?nbsp;
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()); } } } |
术异常c:ArithmeticExecption
I指针异常类QNullPointerException
cd强制转换异常QClassCastException
数组负下标异常:NegativeArrayException
数组下标界异常QArrayIndexOutOfBoundsException
q背安全原则异常QSecturityException
文g已结束异常:EOFException
文g未找到异常:FileNotFoundException
字符串{换ؓ数字异常QNumberFormatException
操作数据库异常:SQLException
输入输出异常QIOException
Ҏ未找到异常:NoSuchMethodException
java.lang.AbstractMethodError
抽象Ҏ错误。当应用试图调用抽象Ҏ时抛出?/p>
java.lang.AssertionError
断言错。用来指CZ个断ap|的情c?/p>
java.lang.ClassCircularityError
cd@环依赖错误。在初始化一个类Ӟ若检到cM间@环依赖则抛出该异常?/p>
java.lang.ClassFormatError
cL式错误。当Java虚拟图从一个文件中dJavac,而检到该文件的内容不符合类的有效格式时抛出?/p>
java.lang.Error
错误。是所有错误的基类Q用于标识严重的E序q行问题。这些问题通常描述一些不应被应用E序捕获的反常情c?/p>
java.lang.ExceptionInInitializerError
初始化程序错误。当执行一个类的静态初始化E序的过E中Q发生了异常时抛出。静态初始化E序是指直接包含于类中的static语句Dc?/p>
java.lang.IllegalAccessError
q法讉K错误。当一个应用试图访问、修Ҏ个类的域QFieldQ或者调用其ҎQ但是又q反域或Ҏ的可见性声明,则抛异常?/p>
java.lang.IncompatibleClassChangeError
不兼容的cd化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时Q抛异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新~译而直接运行的情况下,Ҏ引发该错误?/p>
java.lang.InstantiationError
实例化错误。当一个应用试N过Java的new操作W构造一个抽象类或者接口时抛出该异?
java.lang.InternalError
内部错误。用于指CJava虚拟机发生了内部错误?/p>
java.lang.LinkageError
链接错误。该错误及其所有子cLC某个类依赖于另外一些类Q在该类~译之后Q被依赖的类改变了其cd义而没有重新编译所有的c,q而引发错误的情况?/p>
java.lang.NoClassDefFoundError
未找到类定义错误。当Java虚拟机或者类装蝲器试囑֮例化某个c,而找不到该类的定义时抛出该错误?/p>
java.lang.NoSuchFieldError
域不存在错误。当应用试图讉K或者修Ҏcȝ某个域,而该cȝ定义中没有该域的定义时抛错误?/p>
java.lang.NoSuchMethodError
Ҏ不存在错误。当应用试图调用某类的某个方法,而该cȝ定义中没有该Ҏ的定义时抛出该错误?/p>
java.lang.OutOfMemoryError
内存不错误。当可用内存不以让Java虚拟机分配给一个对象时抛出该错误?/p>
java.lang.StackOverflowError
堆栈溢出错误。当一个应用递归调用的层ơ太p导致堆栈溢出时抛出该错误?/p>
java.lang.ThreadDeath
U程l束。当调用ThreadcȝstopҎ时抛错误Q用于指C线E结束?/p>
java.lang.UnknownError
未知错误。用于指CJava虚拟机发生了未知严重错误的情c?/p>
java.lang.UnsatisfiedLinkError
未满的链接错误。当Java虚拟机未扑ֈ某个cȝ声明为nativeҎ的本a定义时抛出?/p>
java.lang.UnsupportedClassVersionError
不支持的cȝ本错误。当Java虚拟图从d某个cLӞ但是发现该文件的丅R次版本号不被当前Java虚拟机支持的时候,抛出该错误?/p>
java.lang.VerifyError
验证错误。当验证器检到某个cL件中存在内部不兼Ҏ者安全问题时抛出该错误?/p>
java.lang.VirtualMachineError
虚拟机错误。用于指C拟机被破坏或者l执行操作所需的资源不的情况?/p>
java.lang.ArithmeticException
术条g异常。譬如:整数除零{?/p>
java.lang.ArrayIndexOutOfBoundsException
数组索引界异常。当Ҏl的索引gؓ负数或大于等于数l大时抛出?/p>
java.lang.ArrayStoreException
数组存储异常。当向数l中存放非数l声明类型对象时抛出?/p>
java.lang.ClassCastException
c造型异常。假设有cA和BQA不是B的父cL子类Q,O是A的实例,那么当强制将O构造ؓcB的实例时抛出该异常。该异常l常被称为强制类型{换异常?/p>
java.lang.ClassNotFoundException
找不到类异常。当应用试图Ҏ字符串Ş式的cd构造类Q而在遍历CLASSPAH之后找不到对应名U的class文gӞ抛出该异常?/p>
java.lang.CloneNotSupportedException
不支持克隆异常。当没有实现Cloneable接口或者不支持克隆Ҏ?调用其clone()Ҏ则抛异常?/p>
java.lang.EnumConstantNotPresentException
枚D帔R不存在异常。当应用试图通过名称和枚丄型访问一个枚丑֯象,但该枚D对象q不包含帔RӞ抛出该异常?/p>
java.lang.Exception
根异常。用以描q应用程序希望捕L情况?/p>
java.lang.IllegalAccessException
q法的访问异常。当应用试图通过反射方式创徏某个cȝ实例、访问该cd性、调用该cL法,而当时又无法讉Kcȝ、属性的、方法的或构造方法的定义时抛异常?/p>
java.lang.IllegalMonitorStateException
q法的监控状态异常。当某个U程试图{待一个自己ƈ不拥有的对象QOQ的监控器或者通知其他U程{待该对象(OQ的监控器时Q抛异常?/p>
java.lang.IllegalStateException
q法的状态异常。当在Java环境和应用尚未处于某个方法的合法调用状态,而调用了该方法时Q抛异常?/p>
java.lang.IllegalThreadStateException
q法的线E状态异常。当县城未处于某个Ҏ的合法调用状态,而调用了该方法时Q抛出异常?/p>
java.lang.IndexOutOfBoundsException
索引界异常。当讉K某个序列的烦引值小?或大于等于序列大时Q抛异常?/p>
java.lang.InstantiationException
实例化异常。当试图通过newInstance()Ҏ创徏某个cȝ实例Q而该cL一个抽象类或接口时Q抛异常?/p>
java.lang.InterruptedException
被中止异常。当某个U程处于长时间的{待、休眠或其他暂停状态,而此时其他的U程通过Thread的interruptҎl止该线E时抛出该异常?/p>
java.lang.NegativeArraySizeException
数组大小值异常。当使用负数大小值创建数l时抛出该异常?/p>
java.lang.NoSuchFieldException
属性不存在异常。当讉K某个cȝ不存在的属性时抛出该异常?/p>
java.lang.NoSuchMethodException
Ҏ不存在异常。当讉K某个cȝ不存在的Ҏ时抛异常?/p>
java.lang.NullPointerException
I指针异常。当应用试图在要求用对象的地方使用了nullӞ抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计null对象的长度、用throw语句抛出null{等?/p>
java.lang.NumberFormatException
数字格式异常。当试图一个String转换为指定的数字cdQ而该字符串确不满x字类型要求的格式Ӟ抛出该异常?/p>
java.lang.RuntimeException
q行时异常。是所有Java虚拟机正常操作期间可以被抛出的异常的父类?/p>
java.lang.SecurityException
安全异常。由安全理器抛出,用于指示q反安全情况的异常?/p>
java.lang.StringIndexOutOfBoundsException
字符串烦引越界异常。当使用索引D问某个字W串中的字符Q而该索引值小?或大于等于序列大时Q抛异常?/p>
java.lang.TypeNotPresentException
cd不存在异常。当应用试图以某个类型名U的字符串表达方式访问该cdQ但是根据给定的名称又找不到该类型是抛出该异常。该异常与ClassNotFoundException的区别在于该异常是uncheckedQ不被检查)异常Q而ClassNotFoundException是checkedQ被查)异常?/p>
java.lang.UnsupportedOperationException
不支持的Ҏ异常。指明请求的Ҏ不被支持情况的异常?/p>
异常
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?/p>
在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一个字母的大小写和包的名称?nbsp;
-----------------------------------------------------------------------------------------------------------------
异常
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中声明?/p>
在struts-config.xml中的打字或者拼写错误也可导致这个异常的发生。例如缺一个标记的关闭W号/>。最好用struts console工具查一下?/p>
另外Qload-on-startup必须在web.xml中声明,q要么是一个空标记Q要么指定一个数|q个数值用来表servletq行的优先Q数D大优先低?/p>
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删除?/p>
资源文gApplicationResources.properties 不在classpath中应资源文件放?WEB-INF/classes 目录下,当然要在struts-config.xml中定?
-----------------------------------------------------------------------------------------------------------------
异常
Cannot find message resources under key org.apache.struts.action.MESSAGE
可能原因
很显Ӟq个错误是发生在使用资源文gӞ而Struts没有扑ֈ资源文g?/p>
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标记不正?/p>
使用的编码样式在本页中不支持?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.”的错误信息?/p>
---------------------------------------------------------------------------------------------------------------------------
异常
ServletException: BeanUtils.populate
解决Ҏ
在用Struts上传文g?遇到了javax.servlet.ServletException: BeanUtils.populate异常?br />
我的ActionServletq没有用到BeanUtilsq些工具cR后来仔l检查代码发现是在jsp文g里的form忘了加enctype="multipart/form-data" 了。所以写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;重新启动你的应用服务器,自动没有这个问?/p>