异常——JAVA异常(A)
在我刚从事开发工作的时候,常常被各种程序上的异常所困扰。当然现在看起来这些异常是无比简单,但是在当年各种稀奇古怪的Exception真是让人头大。
后来经历的问题多了,有时候看到一些异常就能知道问题出在哪里了。当然随着各种异常交叉在一起,自己难免也会记混一些东西。所以从今天开始我尝试整理自己开发中使用的语言、框架和其他组件中的异常。即使对自己经验的整理,也是一次重新学习的过程。当然对于很多异常(JAVA早期版本的异常或者一些很少用的包内的异常)我只能根据网上其他开发者的反馈或者自己根据源码中的注释来猜测可能的原因及办法。
ps.排查故障绝对是开发中最消耗精力的工作了。更让人绝望的是,很多时候明明我使用了和别人一样的操作,教程是好的,但是自己却各种报错。或者是我和别人出现了一样的错误,但是使用别人的解决方案却没有生效。很多时候因为自己系统环境或者操作步骤导致在各种解决方案中找不到一个可以使用的。整理这一系列文章的时候我也尝试能提供尽可能多的解决方案,但是后来发现每个人都有不同的可能,无数的可能造成了同样的异常,而这些异常又可能存在无数种解决方案。学会写作业比学会抄作业更有意义。所以后续的整理中,对于一些网上很少有人询问或者很少见的异常或者我很少接触的异常,我只做分析可能的原因以及可能的解决策略。
JAVA异常 —— A
此JAVA异常指的是java.lang.Exception
的子类,对异常源码中注释的分析主要是基于JDK8
。异常顺序是根据异常最终类名的首字母进行排序。本篇主要整理的是A
开头的异常。
AclNotFoundException
此异常属于JAVA早期版本使用的异常,现在应该很少会出现。
异常全路径
java.security.acl.AclNotFoundException
异常介绍
首先解释一下ACL。其全称为Access Control List,就是访问控制列表。是JAVA提供的一套权限控制。在java.security.acl
包中可以看到定义的相关权限对象。
而出现此异常表示,引用了不存在的ACL(访问控制列表)
解决方法
假如发现了此异常,很可能是访问的程序中使用时JAVA定义的相关权限控制规则,或者是开发人员借用了JAVA的此异常来表示进行了一次错误的访问控制操作。当你遇见了此异常可能需要你排查是否存在ACL。
ActivationException
此异常在当前版本已经不可用,创建对应实例会抛出IllegalStateException
异常。
异常全路径
java.rmi.activation.ActivationException
异常介绍
首先介绍一下java.rmi.activation
这个包,这个包主要是为 RMI 对象**提供支持。利用 RMI **机制,能使一个远程对象的引用是“持久的”,并且可**为一个“活动的”对象。
- RMI
RMI为远程方法调用(远程方法调用),按照设计当有接口继承了下面接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定的服务。
public interface Remote {}
解决方法
而按照异常注释内容General exception used by the activation interfaces.
可以知道,此接口是在**对应远程接口时抛出的异常。此时需要检测在创建远程对象过程中是否存在问题。
ps.需要注意的是此异常在1.4版本之后已经不能使用,如果在日常开发中出现了此异常,我觉得此时是不是考虑升级系统的JDK版本。
AlreadyBoundException
异常全路径
java.rmi.activation.AlreadyBoundException
异常介绍
和上一个异常一样都是属于java.rmi.activation
下的异常,此异常是在将对象和注册表进行绑定时出现错误时产生的。
根据JAVA代码java.rmi.Naming
中的一些使用方式,在尝试将一个Remote
对象绑定到已经绑定过数据的name
上的时候会出现相关异常。
public static void bind(String name, Remote obj)
throws AlreadyBoundException,
java.net.MalformedURLException,
RemoteException
{
ParsedNamingURL parsed = parseURL(name);
Registry registry = getRegistry(parsed);
if (obj == null)
throw new NullPointerException("cannot bind to null");
registry.bind(parsed.name, obj);
}
解决方法
此时需要检查,在进行数据绑定的时候是否将已经绑定过Remote
对象的name
再次绑定Remote
对象。
ApplicationException
Spring也存在一个相同名称的异常,显然Spring中的同名异常比Java这个人气高多了。
异常全路径
org.omg.CORBA.portable.ApplicationException
异常介绍
此异常属于org.omg.CORBA.portable
包下,根据百科描述此包的作用是:提供可移植性层,即可以使一个供应商生成的代码运行在另一个供应商ORB上的ORB API 集合。
- CORBA
关于CORBA,我这里接触的不多,还好CSDN上人才济济,我找到了几篇相关介绍的文章
解决方法
在org.omg.CORBA.portable.Delegate
中的操作可以看到在进行远程调用的时候会抛出此异常。
public InputStream invoke(org.omg.CORBA.Object self,
OutputStream output)
throws ApplicationException, RemarshalException {
throw new org.omg.CORBA.NO_IMPLEMENT();
}
根据源码中的注释描述,此异常为应用程序级别的异常。在此异常之前应该会有更详细的异常报告,所以可以查看详细的异常报告。
AWTException
此异常是一个在学习JAVA时候会遇到而工作中几乎不太会遇到的BUG
异常全路径
java.awt.AWTException
异常介绍
java.awt
为JAVA提供的用于创建界面以及图形绘制的软件包。对于上学刚开始学习JAVA的学生,初期可能会用此包绘制一些简单的交互操作。当然实际工作后这个包下的内容就很少被使用了。
解决方法
此异常是用来表示,抽象的窗口工具发生了异常,其并不是应用于某一种异常。所以源码中要求此异常必须提供一个用来解释异常内容的信息。当遇见了此异常需要根据异常中输出的msg内容来进行判断。
public AWTException(String msg) {
super(msg);
}
个人第一次尝试写一些有关技术不一样的内容。但是很多内容受限于本人浅薄的知识以及工作之余稀少的时间导致没法写的更加详细。我只是希望这篇文字能够给阅读他的人带来一些启发,假如有所帮助希望能点一个赞。你的点赞就是我前进的动力。