|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
还有就是总有人问我到底该学习什么语言,什么语言有前途,那么我的回答是不论是C,C++,java,.net,ruby,asp或是其他语言都可以学,编程的关键不是语言,而是思想。毛病1,空指针毛病java.lang.NullPointerException
利用基础的JAVA数据范例,变量的值要末已是默许值,假如没有对其一般赋值,程序便不克不及经由过程编译,因而利用基础的JAVA数据范例(double,float,boolean,char,int,long)一样平常不会引发空指针非常。因而可知,空指针非常次要跟与对象的操纵相干。
上面先列出了大概产生空指针非常的几种情形及响应办理计划:
不论对象是不是为空就间接入手下手利用。
(JSP)代码段1:
out.println(request.getParameter("username"));
形貌:
代码段1的功效非常复杂,就是输入用户输出的表域"username"的值。
申明:
看上往,下面的语句找不出甚么语法毛病,并且在年夜多半情形下也遇不到甚么成绩。可是,假如某个用户在输出数据时并没有供应表单域"username"的值,或经由过程某种路子绕过表单间接输出时,此时request.getParameter("username")的值为空(不是空字符串,是空对象null。),out对象的println办法是没法间接对空对象操纵,因而代码段1地点的JSP页面将会抛出"java.lang.NullPointerException"非常。
即便对象大概为空时,也挪用java.lang.Object或Object对象自己的一些办法如toString(),equals(Objectobj)等操纵。
(JSP)代码段2:
StringuserName=request.getParameter("username");
If(userName.equals("root"))
{....}
形貌:
代码段2的功效是检测用户供应的用户名,假如是用户称号为"root"的用户时,就实行一些出格的操纵。
申明:
在代码段2中,假如有效户没有供应表单域"username"的值时,字符串对象userName为null值,不克不及够将一个null的对象与另外一个对象间接对照,一样,代码段2地点的JSP页面就会抛出(java.lang.NullPointerException)空指针毛病。
(JSP)代码段3:
StringuserName=session.getAttribute("session.username").toString();
形貌:
代码段3的功效是将session中session.username的值掏出,并将该值赋给字符串对象userName。
申明:
在一样平常情形下,假如在用户已举行某个会话,则不会呈现甚么成绩;可是,假如此时使用服务重视新启动,而用户还没有从头登录,(也多是用户封闭扫瞄器,可是仍翻开本来的页面。)那末,此时该session的值就会生效,同时招致session中的session.username的值为空。对一个为null的对象的间接实行toString()操纵,就会招致体系抛出(java.lang.NullPointerException)空指针非常。
办理计划:
为了确保举行操纵或援用的对象非空,倘使我们要对某对象举行操纵或援用,我们起首往反省该对象是不是已实例化且不为空;而且在体系中到场针对对象为空时情形的处置。
如:接纳String对象保留用户提交的了局;在假如触及对象的操纵时,先检测其是不是为空后,反省到对象为空后,可再选择举行以下任一种处置体例:
处置体例1)反省到对象为空时,设置对象值为空字符串或一个默许值;
处置体例2)检测到对象为空时,基本不实行某操纵,间接跳转到其他处置中。
处置体例3)反省到对象为空时,提醒用户操纵有毛病。
将代码段2按以上体例举行改写,失掉:
体例1:
StringuserName=request.getParameter("username");
//该变量值为空时,转化为默许空字符串
If(userName==null)
userName="";
If(userName.equals("root"))
{..........}
体例2:
StringuserName=request.getParameter("username");
//该变量值为空时,转化为默许空字符串,不实行有关操纵。
If(usreName!=null)
{
If(userName.equals("root"))
{..........}
}
体例3:
StringuserName=request.getParameter("username");
//该变量值为空时,转化为默许空字符串,不实行有关操纵。
If(usreName==null)
{
//提醒用户输出信息为空
}
实践中,下面供应到三种处置体例也一样合用于其他非常的处置:
非常处置体例1)反省到非常呈现,设置对象值为空字符串或一个默许值;
非常处置体例2)检测到非常呈现,基本不实行某操纵,间接跳转到其他处置中。
非常处置体例3)反省到非常呈现,提醒用户操纵有毛病。
2。格局化数字毛病java.lang.NumberFormatException剖析
(JSP)代码段3:
Strings_memberid=request.getParameter("memberid");
inti_memberid=Integer.parseInt(s_memberid);
形貌:
以上代码段的感化是将用户提交的表单域memberid的值转化为整数。
申明:
假如用户输出准确的数字如:1082,不会有甚么成绩。但是,假如用户输出T1082时,因为T1082不是正当的数字格局,JAVA没法将其转化为符合的数字,招致抛出java.lang.NumberFormatException数字格局化非常。
办理计划:
在任何用到字符串转化为数字时,捕获非常,对非常情形举行处置按非常处置体例1:反省到非常产生,即赋给某变量一个默许值;(大概在某些情形下招致一其他程序毛病[例如说其他模块中并未处置您所付与的默许值情形,大概招致一些非常或毛病呈现。])按非常处置体例3:反省到非常产生,提醒用户利用准确的数字格局输出。(完成略微贫苦一点,可是将毛病反对在您的模块前[即您供应给其他模块的值均是平安的]。)按这类办法对程序举行改写,在编程时略微贫苦一点,但这切实其实会您的模块加倍强健。将代码段3按以上请求举行改写,失掉:
Strings_memberid=request.getParameter("memberid");
inti_memberid;
try
{
i_memberid=Integer.parseInt(s_memberid);
...
}
catch(NumberFormatExceptionnfe)
{
//体例1:(复杂,间接给该编号为一个默许值0;)
i_memberid=0;
//体例2:(很大略的做法,倡议利用更友爱的提醒体例)
out.println("<script>alert(您供应的用户编号有误,请从头输出。;history.go(-1);</script>");
}
3,字符串越界毛病java.lang.StringIndexOutOfBoundsException等字符串类相干毛病
代码段4:
Strings_all_power="1010011";
Strings_access_power=s_all_power.substring(3,4);
形貌:
以上代码段功效的功效是猎取字符串s_all_power中的第4个字符。
申明:
一样平常情形下,程序不会有成绩,假如因为某种缘故原由,s_all_power长度变短,程序就会抛出字符串毛病。
办理计划:对字符串举行截取(substring,charAt)、转换为字节数组(getBytes),字符数组转换为字符串(valueOf)操纵时,先对操纵字符串对象的存在性(是不是为空)及长度举行反省后,再举行操纵。
改写失掉:
Strings_all_power="1010011";
if(s_all_power.length>4)
Strings_access_power=s_all_power.substring(3,4);
4。类界说未找到毛病java.lang.NoClassDefFoundError
缘故原由:
因为该程序挪用到的JAVA类文件没有准确上传;
办理计划:
将JAVA类文件从头上传。
JAVA类文件已上传,但使用服务器并未检测到,倡议将JSP页面从头更新。
办理计划:
将JSP页面更新并上传;或将使用程序服务器举行从头启动。
5,JAVA毛病java.lang.Error
缘故原由:
1.对体系所会见内部资本,未实行封闭操纵,招致内部资本大批华侈,终极大概招致体系没法一般运转;
2.对体系所会见的内部资本封闭次数太多,内部体系没法一般处置;
3.体系会见的内部资本呈现非常情形。
办理计划:
1.会见内部资本前,起首反省该资本(如数据库)是不是可一般毗连或操纵。
2.会见内部资本时,假如举行了毗连,必定举行封闭操纵,并仅举行一次封闭操纵。
3.只管在统一操纵中共享内部资本,以削减该操纵对资本的消耗,进步程序的实行效力。
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译) |
|