热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

JAVA基础:JAVA几个常见错误简析

JAVA基础:JAVA几个常见错误简析--Linux通用技术-Linux编程与内核信息,下面是详情阅读。
  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(Object obj)等操作。

??(JSP)代码段2:
??String userName = request.getParameter("username");
??If (userName.equals("root"))
??{....}

??描述:
??代码段2的功能是检测用户提供的用户名,如果是用户名称为"root"的用户时,就执行一些特别的操作。

??说明:
??在代码段2中,如果有用户没有提供表单域"username"的值时,字符串对象userName为null值,不能够将一个null的对象与另一个对象直接比较,同样,代码段2所在的JSP页面就会抛出(java.lang.NullPointerException)空指针错误。

??(JSP)代码段3:
??String userName = 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:

??String userName = request.getParameter("username");
??// 该变量值为空时,转化为默认空字符串
??If (userName == null)
??userName = "";
??If (userName.equals("root"))
??{..........}

??方式2:

??String userName = request.getParameter("username");
??// 该变量值为空时,转化为默认空字符串,不执行有关操作。
??If (usreName != null)
??{
???If (userName.equals("root"))
???{..........}
??}

??方式3:

??String userName = request.getParameter("username");
??// 该变量值为空时,转化为默认空字符串,不执行有关操作。
??If (usreName == null)
??{
??// 提示用户输入信息为空
??}

??实际中,上面提供到三种处理方式也同样适用于其他异常的处理:

??异常处理方式 1) 检查到异常出现,设置对象值为空字符串或一个默认值。
??异常处理方式 2) 检测到异常出现,根本不执行某操作,直接跳转到其他处理中。
??异常处理方式 3) 检查到异常出现,提示用户操作有错误。

??2、格式化数字错误 java.lang.NumberFormatException分析

??(JSP)代码段3:
??String s_memberid = request.getParameter("memberid");
??int i_memberid = Integer.parseInt(s_memberid);

??描述:
??以上代码段的作用是将用户提交的表单域memberid的值转化为整数。

??说明:
??如果用户输入正确的数字如:1082,不会有什么问题。然而,如果用户输入T1082时,由于T1082不是合法的数字格式,JAVA无法将其转化为合适的数字,导致抛出java.lang.NumberFormatException数字格式化异常。

??解决方案:
??在任何用到字符串转化为数字时,捕捉异常,对异常情况进行处理按异常处理方式1:检查到异常发生,即赋给某变量一个默认值;(可能在某些情况下导致一其他程序错误[比方说其他模块中并未处理您所赋予的默认值情况,可能导致一些异常或错误出现。])按异常处理方式3:检查到异常发生,提示用户使用正确的数字格式输入。(实现稍微麻烦一点,但是将错误阻挡在您的模块前[即您提供给其他模块的值均是安全的]。)按这种方法对程序进行改写,在编程时稍微麻烦一点,但这的确会您的模块更加健壮。将代码段3按以上要求进行改写,得到:

??String s_memberid = request.getParameter("memberid");
??int i_memberid;
??try
??{
???i_memberid = Integer.parseInt(s_memberid);
???...
??}
??catch(NumberFormatException nfe)
??{
???//方式1:(简单,直接给该编号为一个默认值0;)
???i_memberid = 0;
???//方式2:(很简陋的做法,建议使用更友好的提示方式)
???out.println("");
??}

??3、字符串越界错误 java.lang.StringIndexOutOfBoundsException等字符串类相关错误

??代码段4:
??String s_all_power = "1010011";
??String s_access_power = s_all_power.substring(3,4);

??描述:
??以上代码段功能的功能是获取字符串s_all_power中的第4个字符。

??说明:
??一般情况下,程序不会有问题,如果由于某种原因,s_all_power长度变短,程序就会抛出字符串错误。

??解决方案:
??对字符串进行截取(substring, charAt)、转换为字节数组(getBytes),字符数组转换为字符串(valueOf)操作时,先对操作字符串对象的存在性(是否为空)及长度进行检查后,再进行操作。

??改写得到:

??String s_all_power = "1010011";
??if (s_all_power.length>4)
???String s_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.尽量在同一操作中共享外部资源,以减少该操作对资源的消费,提高程序的执行效率。
推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 无线认证设置故障排除方法及注意事项
    本文介绍了解决无线认证设置故障的方法和注意事项,包括检查无线路由器工作状态、关闭手机休眠状态下的网络设置、重启路由器、更改认证类型、恢复出厂设置和手机网络设置等。通过这些方法,可以解决无线认证设置可能出现的问题,确保无线网络正常连接和上网。同时,还提供了一些注意事项,以便用户在进行无线认证设置时能够正确操作。 ... [详细]
  • 本文详细介绍了相机防抖的设置方法和使用技巧,包括索尼防抖设置、VR和Stabilizer档位的选择、机身菜单设置等。同时解释了相机防抖的原理,包括电子防抖和光学防抖的区别,以及它们对画质细节的影响。此外,还提到了一些运动相机的防抖方法,如大疆的Osmo Action的Rock Steady技术。通过本文,你将更好地理解相机防抖的重要性和使用技巧,提高拍摄体验。 ... [详细]
  • 本文详细介绍了华为4GLTE路由器B310的外置天线安装和设置方法。通过连接电源和网线,输入路由器的IP并登陆设置页面,选择手动设置和手动因特网设置,输入ISP提供商的用户名和密码,并设置MTU值。同时,还介绍了无线加密的设置方法。最后,将外网线连在路由器的WAN口即可使用。 ... [详细]
  • 本文讨论了前端工程化的准备工作,主要包括性能优化、安全防护和监控等方面需要注意的事项。通过系统的答案,帮助前端开发者更好地进行工程化的准备工作,提升网站的性能、安全性和监控能力。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 如何修改路由器密码?路由器登录密码和无线密码的修改方法
    本文介绍了修改路由器密码的两种方法:一是修改路由器登录口令,需要进入路由器后台进行操作;二是修改无线连接密码,通过进入路由器后台的无线设置和无线安全设置进行修改。详细步骤包括复位处理、登录路由器后台、选择系统工具、填入用户名和用户密码、保存修改等。 ... [详细]
  • 本文介绍了2019年上半年内蒙古计算机软考考试的报名通知和考试时间。考试报名时间为3月1日至3月23日,考试时间为2019年5月25日。考试分为高级、中级和初级三个级别,涵盖了多个专业资格。报名采取网上报名和网上缴费的方式进行,报考人员可登录内蒙古人事考试信息网进行报名。详细内容请点击查看。 ... [详细]
author-avatar
糖猫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有