java没有指针为什么会有空指针异常,javaweb空指针异常怎么解决
如何避免Java中的空指针异常也是初级程序员成长为中级程序员的常见问题。
程序员不知道或不信任正在使用的约定,并仔细检查是否为空。程序员写代码时,总是依赖返回Null来表示某种意义,所以调用者需要检查NULL。
空指针检查有两种情况:
预期结果为空。预期结果不为空。第二个很简单。您可以使用assert或允许程序报告错误,例如抛出NullPointerException。断言是Java1.4中添加的一个未被充分利用的特性。语法如下:
断言条件或
Assert Condition 3360对象条件是布尔表达式,对象是对象(其toString()方法的输出会包含在错误中)。
校对:我测试了JDK1.4及以上版本,运行前设置了vm参数-ea。
public static void main(String[]args){ String name=null;assert (name!=null) :“名称为null”;}线程“main”中的异常;Java。java.lang.AssertionError:变量名为null Nullat Logutil。主(Logutil。Java:37)。如果条件为false,AssertionError将抛出AssertionError。Java默认忽略断言。您可以通过在JVM中传递-ea参数来启用断言。
您可以为单个包或类启动和关闭断言。这意味着您可以在开发和测试期间通过断言来验证代码,并在发布产品时关闭它,尽管在我下面展示的测试中,断言不会造成性能损失。在这段代码中,不需要断言,因为它会失败,就像添加一个断言一样。唯一的区别是断言可能发生得更快,更有意义,并且增加了一些额外的信息,可以帮助你理解失败的原因。
第一个有点棘手。如果你不能控制你正在调用的代码,你就卡住了。如果Null是一个合理的返回值,您应该检查它。如果是你能控制的代码,那就完全不同了。尽量避免将NULL作为返回值。很容易返回集合的集合,返回Empty(一个空的集合或数组)而不是总是用null作为返回值。对于不返回集合的方法来说会有点复杂。考虑下面的例子:
公共接口操作{ void do something();}公共接口解析器{ Action find Action(String user input);}Parser将用户的输入作为参数,然后做一些事情(比如模拟命令行)。现在您可以返回null。如果没有找到输入对应的动作,这就会导致刚才说的空指针检查。
另一种解决方案是永远不返回null,而是返回一个空对象。
公共类MyParser实现Parser { private static Action DO _ NOTHING=new Action(){ public void DO something(){/* DO NOTHING */} };公共操作findAction(字符串userInput) { //.if (/*我们找不到任何动作*/){ return DO _ NOTHING;}}}比较这段代码:
parser parser=parser factory . get parser();if (parser==null) { //现在怎么办?//这将是null不是(或不应该是)有效响应的示例} Action Action=parser . find Action(some input);if(action==null){//do nothing } else { action . do something();}而这一段:
ParserFactory.getParser()。findAction(someInput)。do something();这是一个更好的设计。
,因为足够简洁,避免了多余的判断。
即便如此,或许比较合适的设计是:findAction()方法之恶杰抛出一个异常,其中包含一些有意义的错误信息—–特别是在这个案例中你依赖于用户的输入。
让findAction()方法抛出一个异常而不是简单的产生一个没有任何解释的NullPointerException 要好得多。
try { ParserFactory.getParser().findAction(someInput).doSomething();} catch(ActionNotFoundException anfe) { userConsole.err(anfe.getMessage());}
或者你认为try/catch 的机制太丑了,你的action应该跟用户提供一个反馈而不是什么都不做:
public Action findAction(final String userInput) { /* Code to return requested Action if found */ return new Action() { public void doSomething() { userConsole.err("Action not found: " + userInput); } }}
补充:个人在做项目时,对NullPointerException的几点总结,请网友拍砖!!!多多提意见,
1.对于别人接口的返回对象要做非空判断,因为我们不清楚获得的对象会不会为空,对于Collection Map 我一般会调用CollectionUtils MapUtils ,对于返回的String对象,我会调StringUtils.isNotEmpty()进行非空判断。他们中isNotEmpty不仅判断了NULL 还判断了空集合和空串。例如从数据中查询的结果。工作流中返回的定价URL
2. 对于自己创建的对象,要留心对象进行哪些操作,中间会不会造成对象为空,如果可能加非空判断,尤其是对于集合的操作,很容易就报空指针!!!所以每次对操作集合时,我都会非常的留心。
3. 对于前台的领域对象要非常的留心,因为这些对象是框架创建的,假如我没有在前台的文本框内输入值,虽然提交时后台获得的是空串,但发生NullPointerException的概率很高。
4. 对于String 的操作尽量使用apache 的StringUtils类,与String相比这个是非常的安全。对于集合的操作使用apache的CollectionUtils 、MapUtils, 相比apache工具类的执行效率也非常的高,比如StringUtils.split();
有人说过多的判断会影响性能,我个人认为这里的性能牺牲和系统的安全相比是微不足道的。
总结
到此这篇关于Java中空指针异常该如何避免的文章就介绍到这了,更多相关Java空指针异常内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。