遇到的Exception/error及解决办法记录汇总

一、java.net.SocketException

  1、java.net.SocketException:Connection reset

    首先,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。
    然后,一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。
    简单的说就是在连接断开后的读和写操作引起的。

  2、如果在报错中有java.net.SocketInputStream.read():考虑要读取的输入流的资源不存在或者格式错误,也可能是路径地址出错

  3、socket-详细分析No buffer space available:参见 http://www.cnblogs.com/hjwublog/p/5114380.html

二、org.hibernate.Exception

  1、org.hibernate.ObjectNotFoundException: No row with the given identifier exists:

    原因可能是POJO映射文件中的字段和数据库里表的字段不匹配(不一致)。另外还有一种可能就是表A与表B之间存在关联关系,并且从表A中通过外键查询表B当中的符合条件的记录时,在表B找不到相应的记录,但这种关联关系还继续维持着!

    很可能是因为设置级联操作。 又或者是在删除表A的记录时,你并没有同时删除与之关联表B中的记录!!!

  2、org.hibernate.PropertyAccessException: exception setting property value:

    主要是数据库中number类型的字段为空导致的错误。其实挺好理解的当HIBERNATE获取到空时返回NULL,但是如果 你配置的映射文件中type 是long或者其他基本数据类型时,就会出现错误。解决的方法有2种

    第一:设定数据库,如果是number类型或者其他映射后是基本数据的类型时,为其设定默认值。

    第二:在POJO类中的set器 传入基本数据类型的封装类,然后进行判断,如果是NULL就赋给默认值。

  3、org.hibernate.LazyInitializationException: could not initialize proxy - no Session:

    这是一个lazy使用后的Exception,使用迟时加载,在session(hibernate里的session),关闭后使用该对象的未加载变量,也就是说session已经关闭,没有保存到内存中,然后你使用了,导致该异常。

      原因:<may-to-one>or<one-to-may>的lazy属性默认为:lazy = "proxy"
      解决:<many-to-one> & <set> 中设置 lazy="false"

三、org.apache.jasper.jasperException

  访问JSP时,报错:Attribute value is quoted with " which must be escaped when used within the value 。相信很多人都遇到过,以下结合本人查资料与亲自实践得到的结论。(有不对的地方还请指教)
    错误常发生的位置 value="<%=""+request.getAttribute("name")%>"
    错误产生的原因,是因为tomcat版本升级后(6.0以后),对双引号的处理机制引起的,如果出现双引号包含双引号的情况,就可能会出现这个错误。
    解决办法有好多种,大多数网上的意见是改为value=‘<%=""+request.getAttribute("name")%>’ 这样确实可以解决这个报错,可能无法完全解决问题,比如项目中有很多地方以前都用的是双引号,修改起来会非常麻烦,还容易出错。
      查看tomact文档有一段话这样描述的“If false the requirements for escaping quotes in JSP attributes will be relaxed so that an unescaped quote will not cause an error.
      If not specified, the specification compliant default of true will be used.” 这个描述针对的是tomact的org.apache.jasper.compiler. Parser.STRICT_QUOTE_ESCAPING属性。
      如此一来,我们知道只要在tomcat启动时将这个属性设为false就可以解决这个问题。
      那么怎么将这个属性设置到tomcat的system属性中呢,有至少两个办法:
        一种是利用tomcat启动的执行脚本,在执行过程中调用setenv.sh,在其中设置环境变量,如:JAVA_OPTS=%JAVA_OPTS%: -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false
        另一种是找到conf/catalina.properties文件,在最后添加org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false 即可。

四、java.lang.NoClassDefFoundError:TagSupport

  这个错误应该就是没有成功加载tomcat自带的jar包jsp-api.jar。

  在网上看到很多网友说要把tomcat/lib下的jsp-api.jar拷贝到项目/WEB_INF/lib下并导入,本人试了一下这是有问题的,这样虽然在启动tomcat的时候不会报错了但是在运行程序(比如打开网页)的时候就会报错,因为jar包冲突了。

  解决办法:

    1.引用jsp-api.jar

      项目右键-->properties-->java Build Path-->Libraries-->add External JREs-->tomcat下的jsp-api.jar

    2.直接整体加入tomcat的jar包

      项目右键-->properties-->java Build Path-->Libraries-->Add library-->Server Runtime-->Apache Tomcat xx

     注意:当你已经引用了tomcat/lib下的jsp-api.jar,在运行程序的时候如果报以下错误:

     java.lang.ClassCastException: org.apache.struts.taglib.bean.CookieTei cannot be cast to javax.servlet.jsp.tagext.TagExtraInfo

     需要去你发布的项目下:也就是/tomcat xxx/webapps/项目名/WEB-INF/lib下去删除jsp-api.jar,然后重启tomcat。

五、javax.net.ssl.SSLHandshakeException

  I.报错: javax.net.ssl.SSLHandshakeException

  II.原因分析:
    CAS部署时,常常要涉及到HTTPS的证书发布问题。由于在实验环境中,CAS和应用服务常常是共用一台PC机,它们跑在相同的JRE环境和Tomcat服务器上,因此忽略了证书的实际用途,一旦将CAS和应用分别部署在不同的机器上时,就晕了!

    这里假设如下实验环境来说明相应的部署
      机器A: 部署CAS服务
      机器B: 部署OA应用
      机器C: 用户浏览器端

    1.由机器A上生成.keystore的证书文件,证书颁发者是机器A的完全域名
    2.机器A上用于部署CAS的Tomcat的server.xml文件中定义HTTPS的配置,指向.keystore文件证书
    3.从.keystore中导出的凭证文件要copy到机器B上,并导入机器B的JRE环境的证书库中
    4.机器B上部署OA的Tomcat必须指定运行在导入凭证JRE环境上,而不是JDK,这点常有人搞错。

  III.导入证书步骤:
    1.找到JRE
      1)机器B的OA应用直接部署在Tomcat
      >>>独立的JRE
        如果你在安装JDK时,选择了同时安装JRE,那么系统是跑在独立的JRE上。
        为什么?因为在安装独立JRE的时候程序自动帮你把jre的java.exe添加到了系统变量中,验证的方法很简单,大家看到了系统环境变量的 path最前面有“%SystemRoot%system32;%SystemRoot%;”这样的配置,

        那么再去Windows/system32下面去看看吧,发现了什么?有一个java.exe。
      >>>JDK里的JRE
        如果没有同时安装独立JRE,那么系统跑在JDK自带的JRE上。
      2)机器B的OA应用在MyEclipse中开发测试中
        MyEclipse-右键project-Java Build Path-Libraries-双击JRE-一般是Workspace default JRE;
        MyEclipse-windows-Preferences-Java-Installed JREs-右边有Myeclipse默认自带的JDK,双击即可查到JRE home;
    2.到机器A拷贝证书xxx.cer文件到机器B
    3.导入命令
      cmd进入命令行窗口;cd进入JRE目录libsecurity;
      keytool -import -alias cacerts -keystore JRE目录libsecuritycacerts -file 证书目录xxx.cer -trustcacerts;
      提示输入密码:changeit;
      确定:y
    4.如果keytool用不了,查看下path,classpath是否配置正确。

  IV.自己总结的证书导入步骤(cmd进入命令行窗口,cd进入JRE目录libsecurity):

    1.查看证书:keytool -list -keystore /xxx/cacerts -storepass changeit

    2.删除同名证书:keytool -delete -alias 证书名称 -keystore /xxx/cacerts -keypass changeit

    3.导入证书:keytool -import -alias 证书名称 -file /xxx/server.cer -keystore /xxx/cacerts -storepass changeit 或者

      keytool -import -v -rfc -trustcacerts -alias 证书名称 -file /xxx/server.cer -keystore /xxx/cacerts -storepass changeit -keystore cacerts所在完整路径 -storetype JKS;

    4.如果keytool不可用(提示不是内部命令);cd /xxx/jdk1.xxx/bin

      或者直接在classpath里面配置%JAVA_HOME%lib ools.jar;

六、CASAuthenticationException: Unable to validate ProxyTicketValidator

  单点登录报错:Unable to validate ProxyTicketValidator
    edu.yale.its.tp.cas.client.CASAuthenticationException: Unable to validate ProxyTicketValidator
    [[edu.yale.its.tp.cas.client.ProxyTicketValidator proxyList = [ null ]
    [edu.yale.its.tp.cas.client.ServiceTicketValidator casValidateUrl =
    [https: // sourcesite:8443/cas/proxyValidate] ticket=[ST-0-UMjsI0YOhF15RhutnkHW]
    service=[http%3A%2F%2Fdestsite%3A8080%2Fservlets-examples%2Fservlet%2FHelloWorldExample]
    renew=false]]]
     ...

  可能的原因:
    1.证书未正确产生和导入。在SSL握手中,CAS Client无法识别CAS Server的证书(X),即无法建立一条从cacerts信任证书到X的信任路径,读者可以看一个叫做PKIX规范。
      解决办法是检查tomcat使用的信任证书路径,通常是jre/lib/security/cacerts文件,看是否已经导入了所需信任证书。
    2. 未使用域名作为访问服务器。
    3. tomcat使用的jvm不是系统默认的jdk所带的JVM,这个经常发生。

七、java.lang.OutOfMemoryError: Java heap space

  1、首先得确定有没有跑多个java进程,
  2、然后看一下tomcat/wapps下面是不是有忘了remove的项目(本人就是关闭了一个之前的项目,但是还在wapps里面没有移除)

  3、引起java.lang.OutOfMemoryError: Java heap space异常,可能是由JAVA的堆栈设置太小的原因

    根据网上的答案大致有以下两种解决方法:

      1)、在D:/apache-tomcat-6.0.18/bin/catalina.bat最前面加入:set JAVA_OPTS=-Xms384m -Xmx384m

        注意:只有startup.bat启动tomcat,设置才能生效,如果利用windows的系统服务启动tomcat服务,上面的设置就不生效了,
        就是说set JAVA_OPTS=-Xms384m -Xmx384m没起作用

      2)、在Eclilpse中修改启动参数,在VM arguments 加入了-Xms384m -Xmx384m,设置如下图所示

        

八、java.lang.RuntimeException: Unable to create XMLReader

  XmlReader 读取文件异常:

    java.lang.RuntimeException: Unable to create XMLReader
    org.jasig.cas.client.util.XmlUtils.getXmlReader(XmlUtils.java:44)
    org.jasig.cas.client.util.XmlUtils.getTextForElement(XmlUtils.java:116)
     root cause

      java.lang.ClassNotFoundException: org.apache.xerces.parsers.SAXParser

      ...

  解决办法:(jar包下载)

    导入dom4j.jar和xerces.jar;尤其是需要后面一个jar包.

九:org.xml.sax.SAXParseException: The string "--" is not permitted within comments.

  异常明显是xml文件中注释的问题。

  首先:添加注释一定要在<!-- -->之间添加要注释的内容,千万不能让<!-- -->是空的

  其次:<!-- 【注释】--> 注释与-->之间要有空格 否则也可能造成xml解析错误

  最后:在注释中不能再有--之类的东西。。。如:<!-- 某某--注释 -->这种情况。sqlmap加载配置时,会报错 

原文地址:https://www.cnblogs.com/zhaoyhBlog/p/6237808.html