JAVA异常 —— C、D、E
此JAVA异常指的是java.lang.Exception
的子类,对异常源码中注释的分析主要是基于JDK8
。异常顺序是根据异常最终类名的首字母进行排序。本篇主要整理的是C、D、E
开头的异常。
CertificateException
异常全路径
javax.security.cert.CertificateException
或者java.security.cert.CertificateException
异常介绍
- javax.security.cert
此软件包主要负责公钥证书相关的内容,而在1.4版本开始相关功能使用java.security.cert
替换原来的软件包。
- CertificateException
此异常是在使用公钥证书时发生错误时抛出的异常。
解决方法
目前根据网络上资料整理的可能导致使用证书时发生错误的原因有下面可能:
Certificates does not conform to algorithm
java.security.cert.CertificateException: Certificates does not conform to algorithm constrain
根据描述此异常时因为在进行SSL通讯的时候,使用的证书算法不符合要求。具体来说在之前的JAVA版本用有三个参数控制相关算法jdk.certpath.disabledAlgorithms
,jdk.jar.disabledAlgorithms
,jdk.tls.disabledAlgorithms
。
在之前版本其参数配置
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024
jdk.jar.disabledAlgorithms=MD2, RSA keySize < 1024
jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768
后续版本成为了
jdk.certpath.disabledAlgorithms=MD2, MD5, SHA1 jdkCA & usage TLSServer, RSA keySize < 1024, DSA keySize < 1024, EC keySize < 224
jdk.jar.disabledAlgorithms=MD2,MD5,RSA keySize < 1024
jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768, EC keySize < 224
- 解决方法
目前网络上很多人都是建议修改其配置
jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768
但是上面修改存在安全级别降低的严重问题。但是
记一次线上异常:Certificates does not conform to algorithm constraints 这篇文章提供了一个其他的解决办法。大概的思路是
- 如果TrustAnyTrustManager是实现接口X509TrustManager,而不是继承抽象类:X509ExtendedTrustManager,那么JDK则会默认用自己的实现类AbstractTrustManagerWrapper来对服务器的证书算法进行验证,检查她们是否符合java.security里的配置要求。
- 而如果我们的TrustAnyTrustManager继承了抽象类:X509ExtendedTrustManager,则SSLContextImpl就会使用我们自己的TrustAnyTrustManager来验证证书算法,而我们这个类所有的验证方法都是空方法(也就是不验证),那么自然也就不会抛异常了。
No subject alternative names present
java.security.cert.CertificateException: No subject alternative names present
根据描述此异常时因为在进行SSL通讯的时候,证书验证的结果不符合设置内容。
- 解决方法
网络上有些解决方案是设置https对证书的忽略,此解决方式就有些莫名其妙了,本身使用https就是需要通过SSL来进行访问,现在出了问题就绕过SSL显得多此一举了。
另外一种解决方案解释此异常是因为在配置证书时,域名和IP地址缺失导致的。需要在生成证书的时候补充域名以及IP信息。
keytool -genkey -alias tomcat2 -keyalg RSA -keystore ./jerry2.keystore -ext SAN=dns:域名,ip:证书
No name matching casserver found
java.security.cert.CertificateException: No name matching casserver found
此异常出现的时机是在外部接口的https证书中的主机名称与本地https请求的主机名称不一致导致的。
- 解决方法
解决方法在这篇文章中已经说得很清楚了 Java SSL - CertificateException: No name matching
文章中提供了两种解决方法:第一种就是让客户端信任所有的主机,这个显然会冒很大风险。另外一种是需要服务端重新制作证书,需要将证书中的subject CN name signed成自己真正的被客户端连接时使用的hostname.
CloneNotSupportedException
异常全路径
java.lang.CloneNotSupportedException
异常介绍
当执行对JAVA进行克隆操作的时候,当操作的对象没有实现java.lang.Cloneable
接口时会抛出此异常。
ps.关于什么是JAVA的克隆,可以看这篇文章: Cloneable接口的作用与深入理解深度克隆与浅度克隆
解决方法
需要将被操作的对象,实现java.lang.Cloneable
接口
DataFormatException
异常全路径
java.util.zip.DataFormatException
异常介绍
- java.util.zip
此软件包是JAVA用来进行压缩和解压操作的软件包。按照网上的资料,此异常出现时的信息为:
java.util.zip.DataFormatException: invalid distance too far back
解决方法
所有关于这个异常的问题,在网络上都没有明确的解决办法。根据源码中的注释Improperly formatted compressed (ZIP) data
发生此异常可能的原因是数据错误。但是当出现数据不全的时候可能也会导致出现此异常。所以当遇见此问题的时候需要注意数据源是否完成,传输过程时候正常。
DatatypeConfigurationException
异常全路径
javax.xml.datatype.DatatypeConfigurationException
异常介绍
此异常主要是用在javax.xml.datatype.DatatypeFactory
类中,其主要是表示在实例化DatatypeFactory
时出现了配置上的错误。
根据源码,可以看出在实例化对象的时候出现任何异常都会抛出此异常,但是不同之处,类不存在的时候使用了独特的异常描述。
// javax.xml.datatype.DatatypeFactory.newInstance
catch (ClassNotFoundException x) {
throw new DatatypeConfigurationException(
"Provider " + className + " not found", x);
}
catch (Exception x) {
throw new DatatypeConfigurationException(
"Provider " + className + " could not be instantiated: " + x,
x);
}
解决方法
根据源码可以看到一般会出现两种可能:
- 类不存在,此时会抛出
"Provider " + className + " not found"
,此时需要检查配置的类是否正确。 - 指定的类无法实例化,此时会抛出
"Provider " + className + " could not be instantiated"
,此时需要检查配置的类内部是否存在逻辑问题导致实例化失败。
DestroyFailedException
异常全路径
javax.security.auth.DestroyFailedException
异常介绍
在 后台报错了——JAVA异常(A)中已经介绍了相关包为JAVA提供的安全相关的包。而javax.security.auth
包则提供了身份验证和授权的相关功能。 当我们需要销毁身份凭证或者授权的时候需要通过javax.security.auth.Destroyable
接口来销毁相关内容。
public interface Destroyable {
......
public default void destroy() throws DestroyFailedException {
throw new DestroyFailedException();
}
......
}
而当销毁身份凭证javax.security.auth.Subject
失败的时候则会抛出此异常
解决方法
这里需要注意,一般使用Java身份验证和授权服务(JAAS)的时候,我们一般会使我们自己的凭据实现Destroyable
接口,此时此接口抛出的异常应该和开发者自己的业务相关,所以此时需要排查destroy()
方法中的代码逻辑是否正确。
ExecutionException
异常全路径
java.util.concurrent.ExecutionException
异常介绍
在 后台报错了——JAVA异常(B)中已经介绍过了此包为并发编程相关内容。而此异常多数用在java.util.concurrent.Future
中使用get()
时抛出,产生的原因主要是在尝试检索引发异常而中止的任务的结果此时会抛出java.util.concurrent.ExecutionException
。需要注意根源上产生此异常的错误来源于导致任务中止的错误。
解决方法
因为此异常时因为任务中止而产生的,所以需要找到任务中止的原因,所以此异常后面出现的异常描述才是解决问题的关键。这里就介绍几个目前在网上找到的此异常导致的问题以及解决方案。
Tomcat相关错误
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: ......
此问题主要的可能三种
- tomcat的配置
server.xml
中间配置错误。文章:java.util.concurrent.ExecutionException 错误解决 - 启动maven配置失败,或者(未使用maven)导入的jar包出现问题。
安卓相关
Error:java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.AaptException
此问题因为本人安卓开发了解实在不多,所以借用了CSDN其他博主的文章 com.android.builder.internal.aapt.AaptException
PS. 此异常只是证明在并发执行任务的时候,尝试获取已经因为异常中断的任务的结果时抛出的问题。而上面举的tomcat例子也是因为网上有很多人去询问,真实情况任何导致任务中断的行为都有可能导致出现此异常,比如:java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError
(内存溢出)等等其他可能。
ExpandVetoException
异常全路径
javax.swing.tree.ExpandVetoException
异常介绍&解决方法
这个软件包javax.swing
在为JAVA提供了窗口相关功能,在之前已经介绍过了,这次就不再累述。此异常主要是在编写JAVA树的折叠和展开监听器的时候使用的。
因为本身JAVA的绘图功能使用的不多,而官方也提供了一个如何使用树折叠/展开监听器的案例: 如何编写树将扩展侦听器
。所以可以从官方的案例中找到相关答案。
个人第一次尝试写一些有关技术不一样的内容。但是很多内容受限于本人浅薄的知识以及工作之余稀少的时间导致没法写的更加详细。我只是希望这篇文字能够给阅读他的人带来一些启发,假如有所帮助希望能点一个赞。你的点赞就是我前进的动力。