一.Java程序调试与错误收集
1.Web程序的调试与排错:尽量使用System.out.println();和打印hql语句的方式跟踪查错
(1).非代码引起的报错
①.jar包引起的错误:当从版本控制器上下载项目时,如果项目报错但是所有类文件和配置文件和所有手动建的包都没有报错的情况时是因为项目中的jar包有错,修改或删除jar包即可
②.编译器版本不合报错:当启动服务器或部署项目时控制台打印有:* https://www.doczj.com/doc/ef18755123.html,ng.UnsupportedClassVersionError:Bad version number in .class file的异常语句时是因
为当前MyEclipse使用的jdk版本和项目创建时的jdk版本不合而引起的,进入MyEclipse>Window>Preferences>点击弹出的对话框左边的树形菜单中的"Java"项下的Comp iler项>点右边显示框中Compiler compliance level:右边的下拉列表并选择和创建项目时的jdk版本相同的jdk版本号>点击右下角的"Apply"按钮>点击击右下角的"Ok "按钮即可
③.当控制台或页面上打印org.apache.jasper.JasperException: The absolute uri: https://www.doczj.com/doc/ef18755123.html,/jsp/jstl/core cannot be resolved in either web.xml o
r the jar files deployed with this application的异常语句时,是因为缺少jar包或jar包版本不对或web.xml配置问题
方法一:在工程中导入JSTL jar包后(把*.jar和*.tld放到/WEB-INF/lib目录下)在JSP页面中导入<%@ taglib uri="/WEB-INF/lib/c.tld" prefix="c"%>
方法二:修改web.xml(加上下面语句)
再在JSP文件中导入<%@ taglib uri="/WEB-INF/lib/c.tld" prefix="c"%>
④.当代码、配置文件和路径都没有错时,但是它总是报以前的错或不出效果,是因为服务器中任然还残留以前的代码,将服务器中的项目彻底删除后重新部署即可
⑤.当两个页面同时访问同一个资源时(),如果代码完全一样但一个可以访问另一个却不能访问(报404错)时,可能是因为另一个页面中有以下代码:<%String path=request .getContextPath();String
basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServer Port()+path+"/";%>
⑥.当访问页面时,如果确认路径和页面都存在却报404错误,关闭服务器再启动试一试(重启编译器不行),或将项目从服务器上和编译器上删除,重新导入另外备份的同一项目并重新部署,如果重新部署后报错,则是xml文件配置错误,如果不重新部署后不报错即可
⑦.404错误解决:当程序出现404路径错误时,如果实在找不到有什么错误,就用鼠标放到要找的超连接上,再看浏览器最下面的状态栏的路径是否和当前文件的路进相对
⑧.当重新部署项目到服务器时,如果部署完后控制台什么也没有打印并当重新访问项目的页面时路径和页面都存在却报404错误,关闭服务器再启动试一试(重启编译器不行)
⑨.在浏览器中出现404/400页面,检查Web是否正确部署到服务器及浏览器地址栏中输入的地址和端口号是否正确还要看项目名>Propertics>MyEclipse>Web>Context root >Web Context-root右边的名称是否和/项目名一样,Jsp文件只能放在WebRoot 目录下
⑩.在浏览器中出现"无法显示网页"的页面,检查Tomcat服务是否启动和正确运行及浏览器地址栏中输入的地址和端口号是否正确、再检查是否部署服务器
11.在浏览器中出现500/503页面,说明有语法/逻辑错误,或未打开服务器
12.当服务器无法启动(即:马上启动又马上关闭时)是因为端口一直被另一个程序占用的原因,可以打开任务管理器结束占用该端口的进程,也可以重启电脑解决该问题
13.部署项目到服务器时发生的错误:当部署项目时,如果部署到某时突然发生错误,把服务器上现有的项目删除后再重新部署即可
14.MyEclipse中启动Tomcat报Could not find the main class错:(意思是找不到Ant的主类,原因是MyEclipse中的ANT_HOME指向不对)Window>Preferences>Ant>Runtime>
单击右边显示框中的Classpath标签项>选中其中的Ant Home Entries项>单击右边的Ant Home按钮将Ant Home Entries的指向改为MyEclipse插件目录(MyEclipse安装盘
符:*\Genuitec\Common\plugins)下的org.apache.ant_1.7.*.v200**\lib
15.当打开/重启编译器(MyEclipse)后项目/代码报错(之前没有报错(重新打开/重
启编译器后报错)或代码和逻辑都没有错,点击错误前面的错误提示图标后提示有Change Workspace compliance and JRE to 1.5的信息),是因为工作空间配置不对,点击错误前面的错误提示图标再双击Change Workspace compliance and Jre to 1.5即可
注:当做有Hibernate的项目时,如果程序不报错,逻辑上也找不到不对的地方时,可将控制台打印的hql语句转换成sql语句后的语句复制到数据库中执行,以检查hql语句的错
误
(2).代码错误导致报的错
①.当页面/控制台报错时(没有遇到过的错/看不懂的错),先看错误信息中的错误信息来源于哪个类/方法/哪行代码,在根据那行代码多试几中方法
②.保存时发生的错误:当jsp文件中的内容改变,要保存的时候,要先把第一行的pageEncoding属性值设置为utf-8,否则将报错不能保存
③.启动服务器报错,可能的错误有:配置文件有错,也可能是JSP页面中的标签有错(此时它不一定报正在使用的程序的错,有可能报其他程序的错),可以在服务器的webapps 目录下把标签有错的项目删除
④.JavaBean引起的错误:
JavaBean的属性名首字母必须小写,否则即使再dao层、server层和servlet 中可以取得其中的值,在Jsp页面中无论用什么方法都不能取得
⑤.当不出现预想的效果时,如果确认不是浏览器缓存所致,但又找不出错误和原因并浏览器状态栏左边出现有"网页上有错误"的消息时,双击此消息>单击弹出框中的"显示详细信息"按钮查看错误(其中的"行"和"错误"说明了错误的位置和原因)
⑥.当在jsp页面中用
⑦.当导入一个包报错时,如果包名确认无误且当鼠标放在包名上提示The import java.... conflicts with a type defined in the same file时,表示声明的类名和导入的包名冲突
⑧.当控制台出现有https://www.doczj.com/doc/ef18755123.html,ng.ClassNotFoundException:的错误时,说明项目找不到Servlet,可能是web.xml中没有配置或配置错误,如果确认配置没有错但仍然报此错误时
,就把web.xml中对应的Servlet的节点删除,同时也把对应的Servlet删除重新新建
⑨.当一个jsp页面要有上传的功能时,要在form表单中加一个enctype="multipart/form-data"属性,但是在jsp页面的form表单中加了该属性后,该表单中的所有控件(包括
隐藏表单域)的值在servlet中不能用一般的方法获得,必须加判断那些是普通控件那些是上传文件的控件,再用别的方法获取,所以这时用作传参数的隐藏表单中的参数必须加在form表单的action属性中来传递,其方法是:action="servlet?name=value"(即:这时隐藏表单必须用action代替),这时在servlet 中才能用一般的获取值的方法
获取jsp页面传来的值
⑩.当一个jsp页面跳到servlet后又经过servle逃到另一个jsp页面,页面出现
乱码时,是因为没有在servlet中设置请求流和相应流的编码方式,response.setContentType(
"text/html;charset=utf-8");request.setCharacterEncoding("utf-8");
11.当控制台出现有"...将截取字符串错误..."的错误时,是因为数据库相应字段的数据长度不够
12.当访问任意一个页面都出现404错误时或当启动Tomcat服务器在控制台打印相关报错语句时,可能是因为web.xml或其他xml配置文件配置错误也可能是因为导入的jar 包
冲突.
13.当控制台出现有com.microsoft.sqlserver.jdbc.SQLServerException:到主机的TCP/IP连接失败。https://www.doczj.com/doc/ef18755123.html,.ConnectException:Connection refused:connect的错误时
,可能是因为数据库的端口号不对,打开SQL Server配置管理器中的SQL Server 2005网络配置中的SQLEXPRESS的协议的TCP/IP中的IP地址项中的所有TCP端口都设置对, 并将其中的活动和已启用项设为是/yes和协议项中的全部侦听、无延迟、已启用都设为是/yes,再重新启动SQL Server 2005服务中的SQL Server(SQLEXPRESS)即可
14.当从servlet或Action跳到一个查询或修改的页面时,如果报500错误并在控制台打印javax.el.PropertyNotFoundException:Property 'PropertyName' not found on type ...,可能是因为目标页面中的
的对象/属性名和javaBean中的不同(应仔细检查)
15.如果在使用
16.当控制台出现有https://www.doczj.com/doc/ef18755123.html,ng.SecurityException:class "org.objectweb.asm.CodeVisitor"'s signer information does not match signer information of other c
lasses in the same package的安全异常时,是因为包冲突引起的
17.当控制台出现有com.microsoft.sqlserver.jdbc.SQLServerException:Invalid object name'数据库名.dbo.表名/视图名'错误时,是因为数据库中不存在指定的表名
18.当控制台出现有Could not instantiate bean class [完整的包名+类型]:Constructor threw exception;nested exception is https://www.doczj.com/doc/ef18755123.html,ng.Error:Unresolved compi
lation problem:The 一段报错的语句 cannot be resolved的错误异常时是因为后台有报错的代码,改正报错的代码即可
19.当控制台/页面报有https://www.doczj.com/doc/ef18755123.html,ng.ClassCastException:...的错时,可能是因为数据类型装换时不对,或javabean封装/转换不对
3.总是在控制台提示"该连接已被关闭"时,是因为dao层的connection被声明为全局的(),改connection为局部即可
4.当重新部署项目到Tomcat报错或部署项目时选Tomcat不能Finish时,是因为Tomcat 的路径(Window>Preferences>MyEclipse>Application Servers>Tomcat>Tomcat 6.x>Tomcat home directory、Tomcat base directory、Tomcat temp directory的路径应为Tomcat
安装路径的根目录,即...Tomcat 6.0目录)没有选对
5.Ajax出现的错误:
(1).当控制台出现https://www.doczj.com/doc/ef18755123.html,ng.SecurityException:Script names may only contain Java Identifiers的错误时,可能是因为jsp页面中的代码错误,可以把此代码中的interface/后的dwr/去掉
(2).当保存web.xml在控制台出现https://www.doczj.com/doc/ef18755123.html,ng.reflecst.InvocationTargetException 的错误时,可能是因为web.xml中Ajax配置节点的所有
(3).当控制台出现有警告:Page not found. pathInfo='?/?/?.js' requestUrl='?/?/?.js'(?代表***路径)类似的信息时,是因为jsp页面上的代码中的src中的路径错误
6.CVS出现的错误:
(1).不能提交或提交时报错:确认客户端和服务器端是连接上的,或因为MyEclipse上的版本低于CVS服务器上的版本,则先Update
(2).Update或Commit失败时,首先看计算机是否连接上和服务器端的防火墙是否关闭
(3).当客户端能连接上服务器端(即能ping通并能共享文件)但又不能下载项目/Update/Commit时是因为服务器端的防火墙没有关闭
7.Hibernate出现的错误:
(1).在New一个数据库连接时,如果新建成功但连接不上数据库,这可能是因为Connection URL项处输入的连接地址中的端口和数据库名不对,或者在连接时突然弹出一个标题为
Error的报错窗口并在第二行提示The TCP/IP connection to the host has failed...时,是因为SQL Server配置管理器/SQL Server Configuration Manager中的(资源管理窗口中的)SQL Server配置管理器(本地)/SQL Server 2005网络配置/MSSQLSERVER的协议中的TCP/IP状态为已禁用(TCP/IP状态为已禁用是因为其属性中的协议项的已启
用值为否(应该为是),和IP地址项的已启用值为否(应该为是))
(2).不能将表映射为JavaBean的错误:
①.当生成JavaBean找不到要生成到的项目时,是因为在导如Hibernate jar包时,到步骤"选DB Drever右边的下拉选项中选创建的数据库连接名称"时没有选择所创建的数据库连接名称
②.当生成JavaBean不能生成(生成失败)时,是因为项目中没有导入Hibernate jar包
(3).当控制台出现有org.hibernate.MappingException:Unknown entity:entity.JavaBean的错误时,说明没有在Hibernate.cfg.xml文件中加
(4).当控制台出现有org.hibernate.id.IdentifierGenerationException:ids for this class must be manually assigned before calling save():https://www.doczj.com/doc/ef18755123.html,Bar的错误时 ,说明没有把Hibernate.cfg.xml文件中的主键生成器标签
(5).当控制台出现有Exception in thread "main" org.hibernate.HibernateException:/hibernate.cfg.xml not found的错误时,是因为hibernate.cfg.xml没有放在src的根
目录下,hibernate.cfg.xml文件必须放在src根目录下才可以.
(6).在有多对一的关联映射中,当控制台出现有Exception in thread "main" https://www.doczj.com/doc/ef18755123.html,zyInitializationException: could not initialize proxy-the owning Ses
sion was closed的错误时,是因为没有在多的方的hbm.xml文件的many-to-one 节点中配置lazy="false"属性(lazy是延时加载,值为false时关闭延时加载)
(7).当控制台出现有Exception in thread "main" https://www.doczj.com/doc/ef18755123.html,zyInitializationException: could not initialize proxy - the owning Session was closed的错误
时,说明
(8).当控制台出现有Exception in thread "main" org.hibernate.PropertyAccessException:exception setting property value with CGLIB (https://www.doczj.com/doc/ef18755123.html,e_r
eflection_optimizer=false for more info) setter of https://www.doczj.com/doc/ef18755123.html,puter.setNetBar的错误时,说明
(9).当控制台出现有org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions的错误时,是因为dao层所有方法的最后没
有关闭session(即:没有session.close();)
(10).当控制台出现有https://www.doczj.com/doc/ef18755123.html,ng.OutOfMemoryError: PermGen space的错误时重启服务器即可
(11).当执行了dao层的方法返回正确的结果但数据库中的数据仍然没有改变时,可能是dao层的方法中没有执行事务提交的方法commit();
(12).当控制台出现有... ids for this class must be manually assigned before calling Hibernate方法():JavaBean所在的包.JavaBean名;nested exception is org.h ibernate.id.IdentifierGenerationException:ids for this class must be manually assigned before calling Hibernate方法():JavaBean所在的包.JavaBean名Ca used by:org.hibernate.id.IdentifierGenerationException:ids for this class must be manually assigned before calling Hibernate方法():JavaBean所在的包 .JavaBean名at org.hibernate.id.Assigned.generate(Assigned.java:33)的错误时,是因为JavaBean的映射文件:*.hbm.xml中的id节点中的
性的值不是native
(13).当控制台出现有org.hibernate.exception.GenericJDBCException:could not execute query
... ...
Caused by:com.microsoft.sqlserver.jdbc.SQLServerException:只进结果集不支持
请求的操作的错误时,一般出现于分页查询的方法中,是因为传到方法中的排除量或其它参数小于0(为负数)
(14).当使用Hibernate或Hibernate与其它框架整合时,在执行了save/update/delet/其它方法后,如果执行结果成功(没有报异常)但是数据库中却没有效果(数据改变),是因为
hibernate的操作只提交到事务中,事务没有将执行结果提交到数据库的原因(即没有手动配置事务的commit方法(事务可以通过session创建/开始(只要可以调用get/save /其它方法的对象/方法都可以获得/开始事务)))
(15).当页面/控制台打印org.springframework.dao.InvalidDataAccessResourceUsageException:could not execute query;SQL[Hibernate将hql转换后的sql语句];nested
exception is org.hibernate.exception.SQLGrammarException:could not execute query异常时(说明hql语句是对的,所以才被Hibernate装换为sql语句),是因为java
Bean的映射文件中对应的数据库中的列名不合
(16).当控制台出现有* line 数字*或* unexpected token: *或* at org.hibernate.hql.antlr.HqlBaseParser *(HqlBaseParser.java:*)at org.hibernate.hql.ast.Quer
yTranslatorImpl.parse(QueryTranslatorImpl.java:*)或https://www.doczj.com/doc/ef18755123.html,ng.reflect.InvocationTargetException换行sun.reflect.NativeMethodAccessorImpl.invoke(Nativ
eMethodAccessorImpl.java:39)换行https://www.doczj.com/doc/ef18755123.html,ng.reflect.Method.invoke(Method.java:597)的错误时,是hql语句有错引起的(可能是from写成了form或select写成了selc
st/slect等)
注1:当页面/控制台报不明错误(从来没有遇到过的并用System.out.println()跟踪都不能检查出错的地方,或当在不同的地方调用同一个方法时,一个地方能正常调用而另一个地方却始终报错时)时,先打印出相关的hql语句看是否正确
注2:当控制台/页面打印有https://www.doczj.com/doc/ef18755123.html,ng.reflect.InvocationTargetException或https://www.doczj.com/doc/ef18755123.html,ng.NoSuchMethodError:org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr /Rec
ognitionException;Lantlr/collections/impl/BitSet;)V的错误时,是因为hql 语句的错误,先打印相关hql语句,看hql语句是否有正确
8.Struts出现的错误:
(1).struts2出现的错误:
①.当启动服务器或重新部署项目时控制台打印Unable to load configuration.-include -file:/盘符:/.../.metadata/.me_tcat/webapps/项目名/WEB-INF/classes/st
ruts.xml:8:32异常语句时是因为struts2.xml或拆分后的其它struts2配置文件中没有头文件
(2).struts1出现的错误
①.当控制台出现有https://www.doczj.com/doc/ef18755123.html,ng.IllegalArgumentException: Path Demo.jsp does not start with a "/" character的错误时,是因为struts-config.xml文件中 name="Demo" path="/Demo.jsp">
②.当控制台出现有javax.servlet.jsp.JspException:Cannot find ActionMappings or ActionFormBeans collection并页面上出现org.apache.jasper.JasperExceptio
n:An exception occurred processing JSP page/*.jsp at line *的错误时,是因为jsp页面中使用的
③.当控制台出现有https://www.doczj.com/doc/ef18755123.html,ng.NoSuchMethodException:Action[/*/*] does not contain specified method (check logs)的错误时,是因为当前的jsp页面的表单中传的参数method的值在action中没有此名的方法
④.当浏览器出现有HTTP Status 404-Invalid path was requested的字符串或者普通404错误时,是因为当前jsp访问Action的方式不对,因为如果是页面中的html标签表单
或html标签超连接访问Action时可以加.do,也可不加,但是如果是普通标签或普通超连接访问Action时就必须加.do
⑤.如果能确定一个一开始不需访问Action的页面(如添加信息的页面)中的代码没有错误,但是访问时发生500错误或同时在控制台打印org.apache.jasper.JasperExcepti on:/.../.../....jsp(29,1)Attribute Attribute invalid for tag form according to TLD之类的信息时,可能是因为页面中使用了html标签的控件或表单(因为htm l控件会自动绑定FormBean的属性值,而该页面又没有/不需要有相应的FormBean),把html控件或表单改为普通的即可
9.Spring出现的错误:
①.用Spring时,只要某个层报空异常,是因为Spring没有给该层中调用的接口注入相应的实现类对象
②.当页面/控制台打印以下错误语句时:org.springframework.orm.hibernate3.HibernateQueryException:javaBean名 is not mapped [hql语句];
nested exception is org.hibernate.hql.ast.QuerySyntaxException:javaBean名 is not mapped [hql语句],是因为Spring的配置文
件中没有配置相应的javabean..hbm.xml文件所致
10.SSH出现的错误:
(1).SSH2出现的错误
①.当控制台打印有org.springframework.dao.InvalidDataAccessApiUsageException:Write operations are not allowed in read-only mode (FlushMode.NEVER) - t
urnyour Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition的错误时,是因为Spring中的Hibernate的org.springframewor k.orm.hibernate3.support.OpenSessionInViewFilter打开后flushMode的默认值是MANUAL(手动)的,此时要将其改为AUTO(自动),可以在配置Hibernate的过滤节点
②.当用页面的