网站建设的需求客户,上海做网站推广公司,小程序开发商排名,江宁建设局网站Java虚拟机里面的异常使用Throwable或其子类的实例来表示#xff0c;抛异常的本质实际上是程序控制权的一种即时的、非局部#xff08;Nonlocal#xff09;的转换——从异常抛出的地方转换至处理异常的地方。绝大多数的异常的产生都是由于当前线程执行的某个操作所导致的抛异常的本质实际上是程序控制权的一种即时的、非局部Nonlocal的转换——从异常抛出的地方转换至处理异常的地方。绝大多数的异常的产生都是由于当前线程执行的某个操作所导致的这种可以称为是同步的异常。与之相对的异步异常是指在程序的其他任意地方进行的动作而导致的异常。Java虚拟机中异常的出现总是由下面三种原因之一导致的1.虚拟机同步检测到程序发生了非正常的执行情况这时异常将会紧接着在发生非正常执行情况的字节码指令之后抛出。例如字节码指令所蕴含的操作违反了Java语言的语义如访问一个超出数组边界范围的元素。类在加载或者链接时出现错误。使用某些资源的时候产生资源限制例如使用了太多的内存。2.athrow字节码指令被执行。3.由于以下原因导致了异步异常的出现调用了Thread或者ThreadGroup的stop方法。Java虚拟机实现的内部程序错误。    当某条线程调用了stop方法时将会影响到其他的线程或者在线程组中的所有线程。这时候其他线程中出现的异常就是异步异常因为这些异常可能出现在程序执行过程的任何位置。虚拟机的内部异常也被认为是一种异步异常    《Java虚拟机规范》允许在异步异常被抛出时额外执行一小段有限的代码允许代码优化器在不违反Java语言语义的前提下检测并把这些异常在可处理它们的地方抛出①。    抛出异常的动作在Java虚拟机之中是一种被精确定义的程序控制权转移过程当异常抛出、程序控制权发生转移的那一刻所有在异常抛出的位置之前的字节码指令所产生的影响②都应当是可以被观察到的而在异常抛出的位置之后的字节码指令则应当是没有被执行过的。如果虚拟机执行的代码是被优化后的代码③有一些在异常出现位置之后的代码可能已经被执行了那这些优化过的代码必须保证被它们提前执行所产生的影响对用户程序来说都是不可见的。    由Java虚拟机执行的每一个方法都会配有零至多个异常处理器Exception Handlers异常处理器描述了其在方法代码中的有效作用范围通过字节码偏移量范围来描述、能处理的异常类型以及处理异常的代码所在的位置。要判断某个异常处理器是否可以处理某个具体的异常需要同时检查异常出现的位置是否在异常处理的有效作用范围内并且出现的异常是否异常处理器声明可以处理的异常类型或其子类型两个条件。当有异常被抛出时Java虚拟机搜索当前方法的包含的各个异常处理器如果能找到可以处理该异常的异常处理器则将代码控制权转向到异常处理器中描述的处理异常的分支之中。    搜索异常处理器时的搜索顺序是很关键的在Class文件里面每个方法的异常处理器都存储在一个表中。在运行时当有异常出现之后Java虚拟机就按照Class文件中的异常处理器表描述异常处理器的先后顺序从前至后进行搜索。    需要注意Java虚拟机本身不会对方法的对异常处理器表做排序或者其他方式的强制处理所以Java语言中对异常处理的语义实际上是通过编译器适当安排异常处理器在表中的顺序来协助完成的。在Class文件中定义了明确的异常处理器查找顺序才能保证无论Class文件是通过何种途径产生的Java虚拟机执行时都能有一致的行为表现。 转载于:https://blog.51cto.com/zangyanan/1855720