在我看来,Kotlin 没有帮开发者解决了 NPE (Kotlin: 臣妾真的做不到啊),而是通过在语言层面增加各种强规则,强制开发者去自己处理可能的空指针问题,达到尽量减少(只能减少而无法完全避免)出现...三、强规则之下的 NPE 问题 在 Kotlin 这么严密的防御之下,NPE 问题是否已经被终结了呢?答案当然是否定的。...在实践过程中我们发现主要有以下几种容易导致 NPE 的场景: 1. data class(含义对应 Java 中的 model)声明了非空 例如从后端拿 json 数据的场景,后端的哪个字段可能会传空是客户端无法控制的...可以很方便得将“可空”转为“非空”,但可空变量值为 null,则会 crash。 因此使用上建议在确保非空时才用 !!: param!! 否则还是尽量放在判空代码块里: param?....两个代码块的对象不同 以 let 为例,在 let 代码块里可以用 it 指代该对象(其他高阶函数可能用 this,类似的),那么我们在写如下代码时可能会顺手这样写: activity {
NPE事发场景 参数是Integer等包装类,自动拆箱时 字符串比较 如ConcurrentHashMap这种不支持K.V为null的容器 A对象含B对象,通过A对象的字段获得B对象后,没有判空B就调用...我设置个断点看下入参不就知道了吗? 但在实际项目中,NPE通常在极其特殊条件下才会出现,自测时一般都难以复现。...中使用JSON传过来的User对象通过JPA更新到数据库中,最后返回保存到数据库的数据 首先,在DB初始化一个用户,age=36、name=zhuye、create_date=2020年1月...NPE原因 DTO字段null的含义 JSON到DTO的反序列化过程,null的描述有歧义: 客户端不传某个属性或传null,该属性在DTO中都是null。...为测试使用Optional是否可以有效区分JSON中没传属性还是传了null,在JSON中设个null的age,结果是正确得到了年龄不能为空的错误提示: curl -H "Content-Type:application
而且,这个和你使用的 JDK 版本是无关的,我在 JDK 6、JDK 8 和 JDK 14 上做了测试,均会抛出 NPE。...),而 nullBoolean 是 null,这就出现了 null.booleanValue,从而抛出 NPE。...但是,并不是所有人都熟知这个规则,所以在实际应用中,还会出现以下几种定义方式: boolean x4 = flag ?...就需要对对象进行拆箱操作,由于该对象为 null,所以在拆箱过程中调用 null.booleanValue() 的时候就报了 NPE。...而 x4 是因为三目运算符运算结束后根据规则他得到的是一个对象类型,但是在给变量赋值过程中进行自动拆箱所导致的 NPE。
大家好,我是坤哥 网上看到一个很有意思的美团面试题:为什么线程崩溃崩溃不会导致 JVM 崩溃,这个问题我看了不少回答,但发现都没答到根上,所以决定答一答,相信大家看完肯定会有收获,本文分以下几节来探讨.../openjdk-jdk8u,有兴趣的可以下载来看看 我们只要研究 Linux 下的 JVM,为了便于说明,也方便大家查阅,我把其中关于信号处理的关键流程整理了下(忽略其中的次要代码) 可以看到,在启动...和 NPE,这就是为什么 JVM 不会崩溃且我们能捕获这两个错误/异常的原因 如果针对 SIGSEGV 等信号,在以上的函数中 JVM 没有做额外的处理,那么最终会走到 report_and_die...这个方法,这个方法主要做的事情是生成 hs_err_pid_xxx.log crash 文件(记录了一些堆栈信息或错误),然后退出 至此我相信大家明白了为什么发生了 StackoverflowError...原因其实就是虚拟机内部定义了信号处理函数,而在信号处理函数中对这两者做了额外的处理以让 JVM 不崩溃,另一方面也可以看出如果 JVM 不对信号做额外的处理,最后会自己退出并产生 crash 文件 hs_err_pid_xxx.log
,在 JVM 中会经过三步: (1)为 singleton 分配内存空间 (2)初始化 singleton 对象 (3)将 singleton 指向分配好的内存空间 指令重排序是指:JVM 在保证最终结果正确的情况下...,这样在多线程环境下就不会发生 NPE 异常了。...oos = new ObjectOutputStream(new FileOutputStream("Singleton.file")); // 将单例对象写到文件中 oos.writeObject...防止反序列化创建多个枚举对象 在读入 Singleton 对象时,每个枚举类型和枚举名字都是唯一的,所以在序列化时,仅仅只是对枚举的类型和变量名输出到文件中,在读入文件反序列化成对象时,使用 Enum...所以,在序列化和反序列化的过程中,只是写出和读入了枚举类型和名字,没有任何关于对象的操作。 ?
本文将详细剖析 NPE 出现的原因,重新梳理相关知识点,并进一步扩展,帮助大家彻底理解这个问题。 文末福利:下载《Java 开发手册》解读电子书。...但是,并不是所有人都熟知这个规则,所以在实际应用中,还会出现以下三种定义方式: //当第二位和第三位表达式都是对象时,表达式返回值也为对象。boolean x4 = flag ?...所以,日常开发中就有可能出现以上 6 种情况。聪明的读者们读到这里也一定想到了,在以上 6 种情况中,如果是涉及到自动拆箱的,一旦对象的值为 null,就必然会发生 NPE。...就需要对对象进行拆箱操作,由于该对象为 null,所以在拆箱过程中调用 null.booleanValue() 的时候就报了 NPE。...之所以会出现这样的不同,这个就说来话长了,我挑其中的重点内容简单介绍下吧,以下内容主要还是围绕 Java 8 的 JLS 。
你好呀,我是why。 给大家分享一个小知识点。 之前逛知乎,看到这个问题的时候我一下都懵逼了。 为什么 return null 的时候,程序不会抛出 NPE 呢? 好像有千言万语,又不知从何说起。...在Java里,下述操作隐含对引用的解引用: 读字段(字节码 getfield):x.y,当x为null时抛NPE; 写字段(字节码 putfield):x.y = z,当x为null时抛NPE。...null时抛NPE; 抛异常(字节码 athrow):throw obj,当obj(throw表达式的参数)为null时抛NPE; 用synchronized关键字给对象加锁(字节码 monitorenter...说真的,我也认为在程序里面引入 return null 不太好,加入这样一行代码后势必会带来一个非空判断,是不太优雅的。 还不如抛出一个异常。...而关于这个问题,在《阿里巴巴JAVA开发手册》里面是这样描述的: 总之,求同存异,目的都是为了防止 NPE 的出现。 防止 NPE 是程序员的基本修养。
在本文中,我将解释这个问题的根源并提供解决该问题的方法。 2 问题的根源:Java 弱类型安全 你听说过编译类型安全吗?如果不在本文中,您可以了解它是什么以及编译时和类型安全之间的区别。...Null 值代表所有未初始化的对象。而且,只要可以初始化任何对象,就可以将 Null 值分配给任何类型。 因此,Java 允许下一个分配: 这里有什么问题?对象未初始化,因此它们指向空引用。...您可以在本文中找到有关异常及其性质的更多详细信息。 6 为什么 NullPointerException 是最常见的异常? 开发人员是人类,总是习惯于忘记一些事情。...因此,他们错过了: 初始化对象 验证对象 没有治愈人性的方法,也与它无关。避免NPE的实用方法是什么?让我们在下面回顾一个示例并尝试修复它。...不幸的是,我还没有找到在 maven 编译步骤中添加它的方法。因此,如果存在,请在评论中告诉我,我会对其进行测试并将其添加到文章中。
虽然看起来是个小错误,但带来的影响却不小,Tony Hoare(null 引用的发明者)在 2009 年说过 NPE 大约给企业造成数十亿美元的损失。在这工作半年内,我就踩了好几次 NPE 的坑。...概述的 6 个可能发生情况: 在空对象上调用实例方法。...避开 NPE 的建议 这节将介绍如何在开发过程中避开 NPE 的一些建议。...(6)避免不必要的装箱拆箱 如果包装对象为 null,在拆箱时容易发生 NPE。...再举个 Jackson 中的例子,当子节点不存在时, path()会返回一个 MissingNode 对象,当调用 MissingNode 对象的 path() 方法是将继续返回 MissingNode
: url:文件的所在地址 destfile:下载后文件的保存地址,默认为工作目录 method: 提供"internal", "wget", "curl" 和 "lynx"四种method,在windows...使用getwd获取当前工作路径,setwd可以改变它 读入XML XML可以说是我们非常熟悉的一类数据。我们通常在网上看到的电子表格便是XML文件的一部分。我们可以看到XML文件大抵是长这样的. ?...关于XML这种可扩展性标记语言,我们不再赘述,可以参阅wiki.这里我们关注的是在得到XML文件后如何分析处理。 R提供了XML包供我们来读取这样一个文件。...我们以github的API数据为例,下面是我的github的代码仓库部分数据的json格式信息,完整版本在这里 { "id": 20472818, "name": "courses",...我们不仅可以读入JSON数据也可以通过函数toJSON将数据框写为JSON格式,例如将鸢尾花数据集写为JSON格式(输出结果较长,在此从略): data(iris) toJSON(iris, pretty
从 10 年前我开始写第一行 Java 代码至今,一直觉得 null 在 Java 中是一个最特殊的存在,它既是好朋友,可以把不需要的变量置为 null 从而释放内存,提高性能;它又是敌人,因为它和大名鼎鼎且烦不胜烦的...我们来模拟一个实际的应用场景,假设小二现在要从数据库中获取一个姓名的列表,然后将姓名打印到控制台,对应的代码如下。...return null; } } 由于 getNamesFromDB() 方法返回了 null 来作为没有姓名列表的标志,那就意味着在遍历列表的时候要先对列表判空,否则将会抛出 NPE 错误,不信你把...我来负责任地介绍一下,你们握个手。 假如数据库中存在姓名,则使用 Optional.of() 对返回值进行包装,从而返回一个 Optional 类型的对象。...但不管怎么说,终于可以在表象上和 null,NPE 说拜拜了,做人嘛,开心点。 ?
: url:文件的所在地址 destfile:下载后文件的保存地址,默认为工作目录 method: 提供"internal", "wget", "curl" 和 "lynx"四种method,在windows...使用getwd获取当前工作路径,setwd可以改变它 读入XML XML可以说是我们非常熟悉的一类数据。我们通常在网上看到的电子表格便是XML文件的一部分。我们可以看到XML文件大抵是长这样的. ?...关于XML这种可扩展性标记语言,我们不再赘述,可以参阅wiki.这里我们关注的是在得到XML文件后如何分析处理。 R提供了XML包供我们来读取这样一个文件。...我们以github的API数据为例,下面是我的github的代码仓库部分数据的json格式信息,完整版本在这里 { "id": 20472818, "name": "courses",...Useful link: Rwordseg的相关信息,例子 Rweibo的相关信息,例子 我们不仅可以读入JSON数据也可以通过函数toJSON将数据框写为JSON格式,例如将鸢尾花数据集写为JSON格式
为什么要统一返回值 在我们做后端应用的时候,前后端分离的情况下,我们经常会定义一个数据格式,通常会包含code,message,data这三个必不可少的信息来方便我们的交流,下面我们直接来看代码 ReturnVO...public String msg() { return msg; } private String val; private String msg; } 这里,我并没有将需要存储的数据直接放到枚举中...,传入的参数是properties文件的位置,这样的话,本文最初代码中的也就得到了解释。...否则就会导致切点无效,同时需要在启动类中配置: @ComponentScan(value = "indi.viyoung.viboot.*") 导入的正是common包下的所有文件,以保证可以将ResponseAop...return userService.list(); } PS:这里我将返回值统一为Object,以便数据存入data,实际类型应是Service接口的返回类型。
【推荐】防止 NPE,是程序员的基本修养,注意 NPE 产生的场景: 返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE。...我们来分析一下原因,在 IDEA 的 target - classes 目录下找到 DEMO 编译后的 class 文件,IDEA 会自动帮我们反编译: public class OrderUpdateParam...如果我们没有拉取源码的习惯,直接通过前面的转换工具类去转换。 我们潜意识会认为外部接口的对象类型也都是包装类型,这时候很容易因为转换出现 NPE 而导致线上 BUG。...下面将介绍几种预防 NPE 的一些常见方法: 图片描述 4.1 接口提供者角度 4.1.1 返回空集合 如果参数不符合要求直接返回空集合,底层的函数也使用一致的方式: public List<Order...4.1.3 使用空对象设计模式 该设计模式为了解决 NPE 产生原因的第 1 条 “调用 null 对象的实例方法”。
:将视图名解析为一个URL文件•jasperReportsViewResolver:将视图名解析为报表文件对应的URL 我们可以选择一种视图解析器或混用多种视图解析器,并且每个视图解析器都实现了 Ordered...在方法体内,我们可以通过入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。...导入依赖之后还需要配置json转换器,一种比较简单的方法是在SpringMVC的配置文件中加入注解驱动配置,也可以手动配置。 <!...4)@RequestBody 与 @ResponseBody相对的还有 @RequestBody,它可以把请求体中json格式的数据封装成指定的对象。...ResponseEntity 将文件的byte[] 数据放置在其中,之后设置响应头然后返回这个对象,这里演示的是图片的展示。
在本文中,我将以run_squad.py以及SQuAD数据集为例介绍阅读理解的源码,官方代码基于tensorflow-gpu 1.x,若为tensorflow 2.x版本,会有各种错误,建议切换版本至...需要注意,不同人的文件路径都是不一样的,你不能照搬我的,要改成自己的路径。..._repr_方法只是在有start_position的时候进行字符串的拼接。 创造实例 用于训练的数据集是json文件,需要用json库读入。...然后将example变成SquadExample的实例化对象,将example加入大列表——examples并返回,至此实例创建完成。...实例转换 把json文件变成实例之后,我们还差一步便可以把数据塞进模型进行训练了,那就是将实例转化为变量。
最近,小黑哥在一个业务改造中,使用三目运算符重构了业务代码,没想到测试的时候竟然发生 NPE 的问题。 ?...但是我明明为 simpleObj做过判空判断,simpleObj 对象肯定不是 null,那么只有 simpleObj#getCode 返回为 null。...但是我的代码并没有对这个方法返回值做任何操作,为何会触发 NPE? 难道是又是自动拆箱导致的 NPE 问题? 在解答这个问题之前,我们首先复习一下条件表达式。 点赞再看,养成习惯。...nullInteger : simpleInt; 这个案例为开头的例子的简化版本,运算上述代码,将会发生 NPE 的。 为什么会发发生 NPE 呢?...只要我们在开发过程重点注意包装类型的自动拆箱问题就好了,另外也要注意条件表达式的计算结果再赋值的时候自动拆箱引发的 NPE 的问题。
只能被动的测试出现问题,更甚的是如果是线上出现这种问题,我想可能…都明白哈。 2)场景二 简单来说就是我们如果自定义了一个 Student 类,其中有一个属性是成绩 score ....所有NPE的场景: 返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPE。...public int f() { return Integer 对象; } 如果为null,自动解箱抛NPE。 数据库的查询结果可能为 null。...集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null。 远程调用返回对象时,一律要求进行空指针判断,防止 NPE。...正例:使用 JDK8 的 Optional 类来防止 NPE 问题。了解JDK8 Optional 类 五、自言自语 你好,我是博主宁在春:主页 希望本篇文章能让你感到有所收获!!!
今天来介绍一下Python的文件操作,后面的五六七我只是比较浅显的介绍了一下,前面四节的内容才是我们主要掌握的 目录 一、输入一行数据,并保存到文件word中(.doc) 二、在文件中输入多条内容,并保存到...可以让我们优雅的处理文件操作的异常,下面我将文件名改成正确的试试看 有了try except就可以处理文件异常(比如文件丢失),但是讲了这么多,我还是没有讲文本的读取 接下来我们就讲讲文件内容的读取...比如,给你一篇文章,我让你去计算某一个特定词语出现的次数的时候,你可以用下面这个方法 这是一个我之前创建好的一个 txt 文件 我的任务是查找 “exercise” 这个单词的位置,我们可以用循环遍历这个文件中每一行的内容...,我们对文件进行只读操作 #将数据读入一个行列表 text_list = open("more_line text.txt","r").readlines() #读取每一行 counter 的值加一,...,是我们 肉眼看不懂的,计算机理解的一种进制,这个就不做介绍了 还可以尝试用JSON—— JavaScript 对象标记,JSON是一种可读的纯文本形式,下面我就以下面的一个简单的实例简要介绍一下JSON
我选择的是肯塔基州的莱克星顿(Lexington)市。 为什么不选纽约、洛杉矶,却要选它呢? 因为我在美国访学的时候,周末经常去那里。 我访问的大学坐落在村子里。...JSON JSON是JavaScript Object Notation(JavaScript对象标记)的缩写,是一种轻量级的数据交换格式。它跟CSV一样,也是文本文件。...我们在Jupyter Notebook中打开下载的JSON文件,检视其内容: 我们需要的数据都在里面,下面我们回到Python笔记本文件ipynb中,尝试读取JSON数据内容。...继续来: 还是只展示前几行: 这不就是我们想要读取的数据吗? 为了和csv数据做出区分,我们这次将数据读取后存储在df1变量。 显示一下前几行: 数据都对,可是列名称怪怪的。...你可能会有以下疑问: 既然CSV文件这么小巧,Pandas读取起来也方便,为什么还要费劲去学那么难用的JSON和XML数据读取方法呢? 这是个好问题! 我能想到的,至少有两个原因。
领取专属 10元无门槛券
手把手带您无忧上云