Java根底—反常处理总结乐橙lc8 - 乐橙lc8

Java根底—反常处理总结乐橙lc8

2019年02月16日11时27分50秒 | 作者: 云天 | 标签: 办法,运用,运转 | 浏览: 11980

public void test2() throws MyException{ 
... 
try{ 
... 
}catch(SQLException e){ 
... 
throw new MyException(); 

}

还有一个代码,很有意思:

 

public void test2() throws MyException{ 
... 
try { 
... 
} catch (MyException e) { 
throw e; 

}

这段代码实际上捕获了反常,然后又言无不尽,没有一点含义,假如这样还有什么好处理的,不处理就行了,直接在办法前用throws声明抛出不就得了。反常的捕获就要做一些有含义的处理。

 

五、运转时反常和受查看反常

Exception类能够分为两种:运转时反常和受查看反常。

1、运转时反常

RuntimeException类及其子类都被称为运转时反常,这种反常的特点是Java编译器不去查看它,也就是说,当程序中或许呈现这类反常 时,即便没有用try...catch句子捕获它,也没有用throws字句声明抛出它,仍是会编译经过。例如,当除数为零时,就会抛出 java.lang.ArithmeticException反常。

2、受查看反常

除了RuntimeException类及其子类外,其他的Exception类及其子类都归于受查看反常,这种反常的特点是要么用try...catch捕获处理,要么用throws句子声明抛出,不然编译不会经过。

3、两者的差异

运转时反常表明无法让程序康复运转的反常,导致这种反常的原因一般是由于履行了过错的操作。一旦呈现过错,主张让程序停止。

受查看反常表明程序能够处理的反常。假如抛出反常的办法本身不处理或许不能处理它,那么办法的调用者就有必要去向理该反常,不然调用会犯错,连编译也无法经过。当然,这两种反常都是能够经过程序来捕获并处理的,比方除数为零的运转时反常:

 

public class HelloWorld { 
public static void main(String[] args) { 
System.out.println("Hello World!!!"); 
try{ 
System.out.println(1/0); 
}catch(ArithmeticException e){ 
System.out.println("除数为0!"); 

System.out.println("除数为零后程序没有停止啊,呵呵!!!"); 


运转成果: 
Hello World!!! 
除数为0! 
除数为零后程序没有停止啊,呵呵!!!

4、运转时过错

 

Error类及其子类表明运转时过错,一般是由Java虚拟机抛出的,JDK中与界说了一些过错类,比方VirtualMachineError

和OutOfMemoryError,程序本身无法修正这些过错.一般不去扩展Error类来创立用户自界说的过错类。而RuntimeException类表明程序代码中的过错,是可扩展的,用户能够创立特定运转时反常类。

Error(运转时过错)和运转时反常的相同之处是:Java编译器都不去查看它们,当程序运转时呈现它们,都会停止运转。

5、最佳处理方案

关于运转时反常,咱们不要用try...catch来捕获处理,而是在程序开发调试阶段,尽量去防止这种反常,一旦发现该反常,正确的做法就会改善程 序规划的代码和完成办法,修正程序中的过错,然后防止这种反常。捕获并处理运转时反常是好的处理办法,由于能够经过改善代码完成来防止该种反常的发作。

关于受查看反常,没说的,老老实实去依照反常处理的办法去向理,要么用try...catch捕获并处理,要么用throws抛出!

关于Error(运转时过错),不需要在程序中做任何处理,呈现问题后,应该在程序在外的当地找问题,然后处理。

六、反常转型和反常链

反常转型在上面现已说到过了,实际上就是捕获到反常后,将反常以新的类型的反常再抛出,这样做一般为了反常的信息更直观!比方:

public void run() throws MyException{ 
... 
try{ 
... 
}catch(IOException e){ 
... 
throw new MyException(); 
}finally{ 
... 

}

反常链,在JDK1.4今后版别中,Throwable类支撑反常链机制。Throwable 包括了其线程创立时线程履行仓库的快照。它还包括了给出有关过错更多信息的音讯字符串。最终,它还能够包括 cause(原因):另一个导致此 throwable 抛出的 throwable。它也称为反常链 设备,由于 cause 本身也会有 cause,依此类推,就形成了反常链,每个反常都是由另一个反常引起的。

 

浅显的说,反常链就是把原始的反常包装为新的反常类,并在新的反常类中封装了原始反常类,这样做的意图在于找到反常的底子原因。

经过Throwable的两个结构办法能够创立自界说的包括反常原因的反常类型:

Throwable(String message, Throwable cause)

结构一个带指定具体音讯和 cause 的新 throwable。

Throwable(Throwable cause)

结构一个带指定 cause 和 (causenull ? null :cause.toString())(它一般包括类和 cause 的具体音讯)的具体音讯的新 throwable。

getCause()

回来此 throwable 的 cause;假如 cause 不存在或不知道,则回来 null。

initCause(Throwable cause)

将此 throwable 的 cause 初始化为指定值。

在Throwable的子类Exception中,也有相似的指定反常原因的结构办法:

Exception(String message, Throwable cause)

结构带指定具体音讯和原因的新反常。

Exception(Throwable cause)

依据指定的原因和 (causenull ? null : cause.toString()) 的具体音讯结构新反常(它一般包括 cause 的类和具体音讯)。

因而,能够经过扩展Exception类来结构带有反常原因的新的反常类。

七、Java反常处理的准则和技巧

1、防止过大的try块,不要把不会呈现反常的代码放到try块里边,尽量坚持一个try块对应一个或多个反常。

2、细化反常的类型,不要不管什么类型的反常都写成Excetpion。

3、catch块尽量坚持一个块捕获一类反常,不要疏忽捕获的反常,捕获到后要么处理,要么转译,要么从头抛出新类型的反常。

4、不要把自己能处理的反常抛给他人。

5、不要用try...catch参加操控程序流程,反常操控的底子意图是处理程序的非正常状况。

      八、常见的几种反常及或许的导致原因:

 

       算术反常类:ArithmeticExecption

空指针反常类:NullPointerException

类型强制转化反常:ClassCastException

数组负下标反常:NegativeArrayException

数组下标越界反常:ArrayIndexOutOfBoundsException

违背安全准则反常:SecturityException

文件已完毕反常:EOFException

文件未找到反常:FileNotFoundException

字符串转化为数字反常:NumberFormatException

操作数据库反常:SQLException

输入输出反常:IOException

办法未找到反常:NoSuchMethodException

java.lang.AbstractMethodError

笼统办法过错。当运用企图调用笼统办法时抛出。

java.lang.AssertionError

断语错。用来指示一个断语失利的状况。

java.lang.ClassCircularityError

类循环依靠过错。在初始化一个类时,若检测到类之间循环依靠则抛出该反常。

java.lang.ClassFormatError

类格局过错。当Java虚拟机企图从一个文件中读取Java类,而检测到该文件的内容不符合类的有用格局时抛出。

java.lang.Error

过错。是一切过错的基类,用于标识严峻的程序运转问题。这些问题一般描绘一些不该被运用程序捕获的反常状况。

java.lang.ExceptionInInitializerError

初始化程序过错。当履行一个类的静态初始化程序的过程中,发作了反常时抛出。静态初始化程序是指直接包括于类中的static句子段。

java.lang.IllegalAccessError

违法拜访过错。当一个运用企图拜访、修正某个类的域(Field)或许调用其办法,可是又违背域或办法的可见性声明,则抛出该反常。

java.lang.IncompatibleClassChangeError

不兼容的类改动过错。当正在履行的办法所依靠的类界说发作了不兼容的改动时,抛出该反常。一般在修正了运用中的某些类的声明界说而没有对整个运用从头编译而直接运转的状况下,简单引发该过错。

java.lang.InstantiationError

实例化过错。当一个运用企图经过Java 的new操作符结构一个笼统类或许接口时抛出该反常.

java.lang.InternalError

内部过错。用于指示Java虚拟机发作了内部过错。

java.lang.LinkageError

链接过错。该过错及其一切子类指示某个类依靠于别的一些类,在该类编译之后,被依靠的类改动了其类界说而没有从头编译一切的类,进而引发过错的状况。

java.lang.NoClassDefFoundError

未找到类界说过错。当Java虚拟机或许类装载器企图实例化某个类,而找不到该类的界说时抛出该过错。

java.lang.NoSuchFieldError

域不存在过错。当运用企图拜访或许修正某类的某个域,而该类的界说中没有该域的界说时抛出该过错。

java.lang.NoSuchMethodError

办法不存在过错。当运用企图调用某类的某个办法,而该类的界说中没有该办法的界说时抛出该过错。

java.lang.OutOfMemoryError

内存缺乏过错。当可用内存缺乏以让Java虚拟机分配给一个目标时抛出该过错。

java.lang.StackOverflowError

仓库溢出过错。当一个运用递归调用的层次太深而导致仓库溢出时抛出该过错。

java.lang.ThreadDeath

线程完毕。当调用 Thread类的stop办法时抛出该过错,用于指示线程完毕。

java.lang.UnknownError

不知道过错。用于指示 Java虚拟机发作了不知道严峻过错的状况。

java.lang.UnsatisfiedLinkError

未满意的链接过错。当Java 虚拟机未找到某个类的声明为native办法的本机言语界说时抛出。

java.lang.UnsupportedClassVersionError

不支撑的类版别过错。当Java虚拟机企图从读取某个类文件,可是发现该文件的主、次版别号不被其时Java虚拟机支撑的时分,抛出该过错。

java.lang.VerifyError

验证过错。当验证器检测到某个类文件中存在内部不兼容或许安全问题时抛出该过错。

java.lang.VirtualMachineError

虚拟机过错。用于指示虚拟机被损坏或许持续履行操作所需的资源缺乏的状况。

java.lang.ArithmeticException

算术条件反常。比如:整数除零等。

java.lang.ArrayIndexOutOfBoundsException

数组索引越界反常。当对数组的索引值为负数或大于等于数组巨细时抛出。

java.lang.ArrayStoreException

数组存储反常。当向数组中寄存非数组声明类型目标时抛出。

java.lang.ClassCastException

类造型反常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O结构为类B的实例时抛出该反常。该反常常常被称为强制类型转化反常。

java.lang.ClassNotFoundException

找不到类反常。当运用企图依据字符串办法的类名结构类,而在遍历CLASSPAH之后找不到对应称号的class文件时,抛出该反常。

java.lang.CloneNotSupportedException

不支撑克隆反常。当没有完成Cloneable接口或许不支撑克隆办法时,调用其clone()办规律抛出该反常。

java.lang.EnumConstantNotPresentException

枚举常量不存在反常。当运用企图经过称号和枚举类型拜访一个枚举目标,但该枚举目标并不包括常量时,抛出该反常。

java.lang.Exception

根反常。用以描绘运用程序希望捕获的状况。

java.lang.IllegalAccessException

违法的拜访反常。当运用企图经过反射办法创立某个类的实例、拜访该类特点、调用该类办法,而其时又无法拜访类的、特点的、办法的或结构办法的界说时抛出该反常。

java.lang.IllegalMonitorStateException

违法的监控状况反常。当某个线程企图等候一个自己并不具有的目标(O)的监控器或许告诉其他线程等候该目标(O)的监控器时,抛出该反常。

java.lang.IllegalStateException

违法的状况反常。当在Java环境和运用没有处于某个办法的合法调用状况,而调用了该办法时,抛出该反常。

java.lang.IllegalThreadStateException

违法的线程状况反常。当县城没有处于某个办法的合法调用状况,而调用了该办法时,抛出反常。

java.lang.IndexOutOfBoundsException

索引越界反常。当拜访某个序列的索引值小于0或大于等于序列巨细时,抛出该反常。

java.lang.InstantiationException

实例化反常。当企图经过newInstance()办法创立某个类的实例,而该类是一个笼统类或接口时,抛出该反常。

java.lang.InterruptedException

被间断反常。当某个线程处于长期的等候、休眠或其他暂停状况,而此刻其他的线程经过Thread的interrupt办法停止该线程时抛出该反常。

java.lang.NegativeArraySizeException

数组巨细为负值反常。当运用负数巨细值创立数组时抛出该反常。

java.lang.NoSuchFieldException

特点不存在反常。当拜访某个类的不存在的特点时抛出该反常。

java.lang.NoSuchMethodException

办法不存在反常。当拜访某个类的不存在的办法时抛出该反常。

java.lang.NullPointerException

空指针反常。当运用企图在要求运用目标的当地运用了null时,抛出该反常。比如:调用null目标的实例办法、拜访null目标的特点、核算null目标的长度、运用throw句子抛出 null等等。

java.lang.NumberFormatException

数字格局反常。当企图将一个String转化为指定的数字类型,而该字符串确不满意数字类型要求的格局时,抛出该反常。

java.lang.RuntimeException

运转时反常。是一切Java虚拟机正常操作期间能够被抛出的反常的父类。

java.lang.SecurityException

安全反常。由安全管理器抛出,用于指示违背安全状况的反常。

java.lang.StringIndexOutOfBoundsException

字符串索引越界反常。当运用索引值拜访某个字符串中的字符,而该索引值小于0或大于等于序列巨细时,抛出该反常。

java.lang.TypeNotPresentException

类型不存在反常。当运用企图以某个类型称号的字符串表达办法拜访该类型,可是依据给定的称号又找不到该类型是抛出该反常。该反常与 ClassNotFoundException的差异在于该反常是unchecked(不被查看)反常,而ClassNotFoundException 是checked(被查看)反常。

java.lang.UnsupportedOperationException

不支撑的办法反常。指明恳求的办法不被支撑状况的反常。

     反常

javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login (/Login是你的action姓名)

或许原因

action 没有再struts-config.xml 中界说,或没有找到匹配的action,例如在JSP文件中运用 后边运用 Struts的html符号。别的要留意或许你不经意运用的无主体的符号,如 ,这样web 服务器解析时就当作一个无主体的符号,随后运用的一切符号都被以为是在这个符号之外的,如又运用了 还有就是在运用taglib引进HTML符号库时,你运用的prefix的值不是html。

-

反常

org.apache.jasper.JasperException: Cannot retrieve definition for form bean null

或许原因

这个反常是由于Struts依据struts- config.xml中的mapping没有找到action希望的form bean。大部分的状况或许是由于在form-bean中设置的name特点和action中设置的name特点不匹配所造成的。换句话说,action和 form都应该各自有一个name特点,而且要准确匹配,包括巨细写。这个过错当没有name特点和action相关时也会发作,假如没有在action 中指定name特点,那么就没有name特点和action相相关。当然当action制造某些操控时,比如依据参数值跳转到相应的jsp页面,而不是处理表单数据,这是就不必name特点,这也是action的运用办法之一。

-

反常

No action instance for path /xxxx could be created

或许原因

特别提示:由于有许多中状况会导致这个过错的发作,所以引荐我们调高你的web服务器的日志/调试等级,这样能够从更多的信息中看到潜在的、在企图创立action 类时发作的过错,这个action类你现已在struts-config.xml中设置了相关(即添加了标签)。

在 struts-config.xml中经过action标签的class特点指定的action类不能被找到有许多种原因,例如:定位编译后的.class文件失利。Failure to place compiled .class file for the action in the classpath (在web开发中,class的的方位在r WEB-INF/classes,所以你的action class有必要要在这个目录下。例如你的action类坐落WEB-INF/classes/action/Login.class,那么在 struts-config.xml中设置action的特点type时就是action.Login).

拼写过错,这个也时有发作,而且不易找到,特别留意第一个字母的巨细写和包的称号。

-

反常

javax.servlet.jsp.JspException: No getter method for property username of bean org.apache.struts.taglib.html.BEAN

或许原因

没有位form bean中的某个变量界说getter 办法

这个过错首要发作在表单提交的FormBean中,用struts符号 时,在FormBean中有必要有一个getUsername()办法。留意字母“U”。

-

反常

java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm

或许原因

这个过错首要发作在在classpath中找不到相应的Java .class文件。假如这个过错发作在web运用程序的运转时,首要是由于指定的class文件不在web server的classpath中(/WEB-INF/classes 和 /WEB-INF/lib)。在上面的过错中,原因是找不到ActionForm类。

-

反常

javax.servlet.jsp.JspException: Exception creating bean of class org.apache.struts.action.ActionForm: {1}

或许原因

Instantiating Struts-provided ActionForm class directly instead of instantiating a class derived off ActionForm. This mightoccur implicitly if you specify that a form-bean is this Struts ActionForm class rather than specifying a child of this classfor the form-bean.

Not associating an ActionForm-descended class with an action can also lead to this error.

-

反常

javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection

或许原因

不是标识Struts actionServlet的符号就是映射.do扩展名的符号或许两者都没有在web.xml中声明。

在struts-config.xml中的打字或许拼写过错也可导致这个反常的发作。例如短少一个符号的封闭符号 / 。最好运用struts console东西查看一下。

别的,load-on-startup有必要在web.xml中声明,这要么是一个空符号,要么指定一个数值,这个数值用来表servlet运转的优先级,数值越大优先级越低。

还有一个和运用load-on-startup有关的是运用Struts预编译JSP文件时也或许导致这个反常。

-

反常

java.lang.NullPointerException at org.apache.struts.util.RequestUtils.forwardURL(RequestUtils.java:1223)

或许原因

在struts-config.xml中的forward元素短少path特点。例如应该是如下办法:

-

反常

javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope

Probable Causes

企图在Struts的form符号外运用form的子元素。这常常发作在你在

-

反常

javax.servlet.jsp.JspException: Missing message for key xx.xx.xx

Probable Causes

这个key的值对没有在资源文件ApplicationResources.properties中界说。假如你运用 eclipse时常常碰到这样的状况,当项目从头编译时,eclipse会主动将classes目录下的资源文件删去。

资源文件 ApplicationResources.properties 不在classpath中应将资源文件放到 WEB-INF/classes 目录下,当然要在struts-config.xml中界说)

-

反常

Cannot find message resources under key org.apache.struts.action.MESSAGE

或许原因

很显然,这个过错是发作在运用资源文件时,而Struts没有找到资源文件。

Implicitly trying to use message resources that are not available (such as using empty html:options tag instead of specifyingthe options in its body this assumes options are specified in ApplicationResources.properties file)

XML parser issues too many, too few, incorrect/incompatible versions

-

反常

Strange and seemingly random characters in HTML and on screen, but not in original JSP or servlet.

或许原因

混和运用Struts的html:form符号和规范的 HTML符号不正确。

运用的编码款式在本页中不支撑。

-

反常

"Document contained no data" in Netscape

No data rendered (completely empty) page in Microsoft Internet Explorer

或许原因

运用一个 Action的派生类而没有完成perform()办法或execute()办法。在Struts1.0中完成的是perform()办法,在 Struts1.1中完成的是execute()办法,但Struts1.1向后兼容perform()办法。但你运用Struts1.1创立一个 Action的派生类,而且完成了execute()办法,而你在Struts1.0中运转的话,就会得到"Document contained nodata" error message in Netscape or a completely empty (no HTML whatsoever) page rendered in Microsoft Internet Explorer.”的过错信息。

-

反常

ServletException: BeanUtils.populate

处理方案

在用Struts上传文件时,遇到了 javax.servlet.ServletException: BeanUtils.populate反常。

我的ActionServlet 并没有用到BeanUtils这些东西类。后来仔细查看代码发现是在jsp文件里的form忘了加enctype=" multipart/form-data" 了。所以写程序遇到过错或反常应该从多方面考虑问题存在的或许性,想到体系提示信息以外的东西。

1. 界说Action后, 假如指定了name, 那么有必要要界说一个与它同名的FormBean才干进行form映射.2. 假如界说Action后, 提交页面时呈现 "No input attribute for mapping path..." 过错, 则需要在其input特点中界说转向的页面.3. 假如刺进新的数据时呈现 "Batch update row count wrong:..." 过错, 则阐明XXX.hbm.xml中指定的key的类型为原始类型(int, long),由于这种类型会主动分配值, 而这个值往往会让体系以为现已存在该记载, 正确的办法是运用java.lang.Integer或java.lang.Long目标.4. 假如刺进数据时呈现 "argument type mismatch" 过错, 或许是你运用了Date等特别目标, 由于struts不能主动从String型转化成Date型,所以, 你需要在Action中手动把String型转化成Date型.5. Hibernate中, Query的iterator()比list()办法快许多.6. 假如呈现 "equal symbol expected" 过错, 阐明你的strtus标签中包括另一个标签或许变量, 例如:

html:select property="test" onchange=" %=test% "/

或许
html:hidden property="test" value=" bean:write name="t" property="p"/ "/
这样的状况...

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表乐橙lc8立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章