免责声明

在继续之前,我必须指出,当我们对Java进行编程时,本文中描述的技术没有实际目的。 这就像填字游戏或拼图。 它主要训练您的大脑进行逻辑思维,可能发展您的Java语言知识甚至您的思维能力。 这就像魔术师执行的把戏。 最后,您意识到什么都不是样子。 切勿在现实生活的编程中做任何花招,以解决此难题。

问题

我最近阅读了一篇文章 ,其中描述了以下情况下的调试情况:

if(trouble != null && !trouble.isEmpty()) {System.out.println(“fine here: ” + trouble);}else{System.out.println(“not so fine here: ” + trouble);
}

正在打印:

fine here: null

实际的错误是字符串包含“ null”,也就是字符“ n”,“ u”,“ l”和“ l”。 在现实生活中可能会发生,特别是当您在不检查变量的空值的情况下连接字符串时。

然后,我开始考虑其他类似的奇怪代码和调试情况。 我能否做到这一点,以使变量不仅是带有这些字符的“空”字符串,而且实际上是空的? 好像疯了吗? 看一下代码:

package com.javax0.blog.nullisnotnull;public class NullIsNotNull {public static void troubled(){String trouble = new String("hallo");Object z = trouble != null && !trouble.toString().isEmpty() ? trouble.toString() : "";if (z == null) {System.out.println("z is really " + z + "?");}}
}

它会打印出:

z is really null?

题。 事实是,您可以创建一个包含public static void main()的Java类,以便在main()调用troubled()的方法troubled()时打印该句子作为Java应用程序。 换句话说:我确实调用了troubled()方法,解决方案不是main()打印该句子。

在这种情况下,变量z不仅被打印为“ null”,而且实际上为null。

提示

解决方案不应涉及

  • 反射
  • 字节码操作
  • 打电话给JNI
  • 特种装载机
  • Java代理
  • 注释处理器

这些工具太重了。 您不需要这种军械库。

提示#1

如果我更改代码,使变量zString它甚至不会编译:

这就是我在Eclipse中看到的

如果它使您更加困惑,那就对不起。 继续阅读!

提示2

在Java语言中, String是标识符而不是关键字。 Java语言规范 3.9节可能会提供有关此重要性的更多信息。

提示#3

Object中的toString()方法具有返回类型java.lang.String 。 您可能需要阅读我的文章 ,其中涉及类的名称,简单名称和规范名称之间的区别。 这可能会有所启发,并增加文章的点击数。

提示#4

要使用在同一程序包中声明的类,无需导入该程序包。

解决方案是在同一包中创建一个名为String的类。 在这种情况下,编译器将使用此类而不是java.lang.String 。 代码中的三元运算符是简单的魔术师技巧。 从重点出发,有些事情会引起您的注意。 要点是,上述代码中的String不是java.lang.String 。 如果仍然找不到如何创建把戏类的方法,请单击折叠的源代码块以全面了解它:

package com.javax0.blog.nullisnotnull;class String {private java.lang.String jString;private boolean first = true;public String(java.lang.String s) {jString = s;}public boolean isEmpty() {return jString.isEmpty();}@Overridepublic java.lang.String toString() {if( first ){first = false;return jString;}return null;}public static void main(java.lang.String[] args) {NullIsNotNull.troubled();}
}

翻译自: https://www.javacodegeeks.com/2014/11/when-null-checking-miserably-fails.html

当null检查非常失败时相关推荐

  1. null导入失败_当null检查非常失败时

    null导入失败 免责声明 在继续之前,我必须指出,当我们对Java进行编程时,本文中描述的技术没有实际目的. 就像填字游戏或拼图. 它主要训练您的大脑进行逻辑思维,可能发展您的Java语言知识甚至您 ...

  2. android动态设置错误页面,Android中替换WebView加载网页失败时的页面

    我们用webView去请求一个网页链接的时候,如果请求网页失败或无网络的情况下,它会返回给我们这样一个页面,如下图所示: 上面这个页面就是系统自带的页面,你觉得是不是很丑?反正小编本人觉得非常丑,很难 ...

  3. access设置0字段为null是因为类型转换失败_Apache Pulsar 2.6.1 版本正式发布:2.6.0 加强版,新增 OAuth2 支持

    在 Apache Pulsar 2.6.0 版本发布后的 2 个月,2020 年 8 月 21 日,Apache Pulsar 2.6.1 版本正式发布! Apache Pulsar 2.6.1 修复 ...

  4. 如何正确的使用Java8中的Optional类来消除代码中的null检查

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:一书生VOID lw900925.github.io/jav ...

  5. 登录失败时记住访问的地址

    登录失败时记住访问的地址 使用spring MVC 访问时,在拦截器中记录访问的地址: Java代码   String path = request.getRequestURI();//"/ ...

  6. 当原图片加载失败时,如何让图片加载上我们默认给的图片

    我们可能会遇到这样的问题,当页面中的图片的加载失败时,我们想要该图片加载我们给的默认的图片,我在这里分享一下几种做法,希望对大家有所帮助. 1.在img标签中加上 οnerrοr="this ...

  7. img图片加载失败时,展示默认图片的方法

    1. 图片加载失败时会触发onerror事件,可以通过onerror事件使默认图片代替加载失败的图片 <img src="要展示的图片的地址" onerror="t ...

  8. img图片加载失败时的处理

    当想对图片加载失败时进行特殊处理,可以使用onerror事件,里面为需要执行的代码. 如果由于其他原因导致onerror事件里加载图片时又报错,此时有可能会导致栈溢出而弹框报错,我们只需在inerro ...

  9. 用户sa登陆失败时,应该如何解决

    用户sa登录失败时,应该如何解决   文章作者:R热血江湖私服网 文章来源:网络转载       用户 sa 登录失败.原因: 未与信任 SQL Server 连接 的解决方法2007-04-19 0 ...

最新文章

  1. 2014年新鲜出炉的16款免费英文字体
  2. VOA AGRICULTURE REPORT - Two Efforts Seek to Increase Food Security in Africa
  3. MySQL查询语句中的IN 和Exists 对比分析
  4. 为什么PCB板通常是绿色的?
  5. 【剑指offer - C++/Java】3、从尾到头打印链表
  6. 窃取发送到服务器的任何信息,担心信息泄密?MIUI 11测试“空信息授权”,保护你的隐私...
  7. 组织结构及权限模型设计
  8. 微型计算机地基本结构,微型计算机地基本结构.ppt
  9. amesim2020安装
  10. python课程设计实验报告-Python语言课程设计报告格式.doc
  11. Nordic fds 文件系统源码探究
  12. 操作实例:创建自定义 Windows PE 映像
  13. 合工大OJ 1359
  14. Raspberry 4B
  15. 从初级到资深:程序员的职业生涯思考与可迁移技能培养
  16. Mac动画交互设计软件Principle
  17. 骞云科技SmartCMP v3.5版本正式发布
  18. 个人常用的sql脚本语句
  19. IDS与IPS工作原理
  20. SQL SERVER 20005 分布式事务配置

热门文章

  1. React前端格式化时间
  2. vpn mysql_MYSQL数据库
  3. myeclipse窗口布局控件任意_木辛老师的编程课堂:Python和Qt第2讲之布局管理初探(三)...
  4. java 平台级模块系统_Java平台模块系统公众审查未能通过
  5. 海贼王为什么画风突变_什么是突变测试?
  6. Servlet和JSP之间的区别
  7. javafx swing_JavaFX技巧9:请勿混用Swing / JavaFX
  8. Java性能:For-eaching与Streaming
  9. java字节码_掌握Java字节码
  10. maven插件依赖_当Maven依赖插件位于