• 关于 数据库 npe 的搜索结果

回答

说几个自己经常用的方法写代码过程中异常的主要来源: I/O,调用框架,java基础库,RPC超时,数据库连接,其他NPE,索引越界....首先明白你写的代码的,写出来是要对这个代码负责的,出了问题怎么能快速的定位问题呢?在和别的系统/框架/底层库交互的边界处, 加一层try,catch, 出错了记录日志(param,result,exception),确保这些数据出错了能够返回empty,而不是null,不会污染到自己的处理逻辑.在自己的代码中合理利用Optional类来判断null,规避很多NPE,代码也相对简洁了在自己接口的边界处,加一层大的try.catch1:记录你自己检查出来的参数检查错误,或者可以在逻辑处理过程中不用再处理可以直接 返回的错误; catch2( Throwable e):记录你未预知到的错误,并记录到特定的日志文件.有了上面三点: 有任何问题都方便排查了ps,在他人接口或者自己接口边界上注意success but empty, 和failed but msg 提示未找到数据的设计吧

墨少伶 2019-12-02 01:55:08 0 浏览量 回答数 0

回答

从 10 年前我开始写第一行 Java 代码至今,一直觉得 null 在 Java 中是一个最特殊的存在,它既是好朋友,可以把不需要的变量置为 null 从而释放内存,提高性能;它又是敌人,因为它和大名鼎鼎且烦不胜烦的 NullPointerException(NPE)如影随形,而 NPE 的发明人 Tony Hoare 曾在 2009 年承认:“Null References 是一个荒唐的设计,就好像我赌输掉了十亿美元”。 你看,null 竟然是一个亦敌亦友的家伙。 通常,为了表示列表中的元素不存在,我们首先想到的就是返回 null,这种想法很合理,合理到无法反驳。我们来模拟一个实际的应用场景,假设作者现在要从数据库中获取一个姓名的列表,然后将姓名打印到控制台,对应的代码如下。 public class NullDemo { public static void main(String[] args) { List names = getNamesFromDB(); if (names != null) { for (String name : names) { System.out.println(name); } } } public static List<String> getNamesFromDB() { // 模拟此时没有从数据库获取到对应的姓名。 return null; } } 由于 getNamesFromDB() 方法返回了 null 来作为没有姓名列表的标志,那就意味着在遍历列表的时候要先对列表判空,否则将会抛出 NPE 错误,不信你把 if (names != null) 去掉试试,立马给你颜色看。 Exception in thread "main" java.lang.NullPointerException at com.cmower.dzone.stopdoing3things.NullDemo.main(NullDemo.java:12) 那假如作者在遍历的时候不想判空又不想代码抛出 NPE 错误,他该怎么做呢?闭上你的大眼睛好好想一想。 嗯,报告,我想出来了,建议作者从数据库中获取姓名的时候返回长度为 0 的列表,来表示未找到数据的情况。代码示例如下所示: public class Null2Length0Demo { public static void main(String[] args) { List names = getNamesFromDB(); for (String name : names) { System.out.println(name); } } public static List<String> getNamesFromDB() { // 模拟此时没有从数据库获取到对应的姓名。 return Collections.emptyList(); } } 注:Collections.emptyList() 用于返回一个不可变的空列表,能理解吧?假如不能理解的话,我再写一个返回可变的空列表的示例,你对比着感受一下就理解了。 public class Null2Length0MutableDemo { public static void main(String[] args) { List names = getNamesFromDB(); for (String name : names) { System.out.println(name); } } public static List<String> getNamesFromDB() { // 模拟此时没有从数据库获取到对应的姓名。 return new ArrayList<>(); } } new ArrayList<>() 返回的就是可变的,意味着你还可以改变这个列表的元素,比如说增加,删除是不可能的了,因为本身就没有元素可删。 你看,Collections.emptyList() 和 new ArrayList<>() 都可以替代 null,来减少打印列表时不必要的判空以及那个讨厌的家伙——NPE。 除了我这个想法之外,你还能想到其他的解决方案吗?来,再次闭上你的大眼睛,替作者想一想,没准你还能想到一个—— Java 8 新增的 Optional 类,一个容器类,可以存放任意类型的元素,如果值存在则 isPresent() 方法会返回 true;Optional 类提供了很多专业的方法而不用显式进行空值检查,从而巧妙地消除了 NPE。 来,先读示例为快! public class Null2OptionalDemo { public static void main(String[] args) { Optional<List > list = getNamesFromDB(); list.ifPresent(names -> { for (String name : names) { System.out.println(name); } }); } public static Optional<List<String>> getNamesFromDB() { boolean hasName = true; if (hasName) { String [] names = {"沉默王二", "一枚有趣的程序员", "微信搜索关注我"}; return Optional.of(Arrays.asList(names)); } return Optional.empty(); } } 看得不太懂?我来负责任地介绍一下,你们握个手。 假如数据库中存在姓名,则使用 Optional.of() 对返回值进行包装,从而返回一个 Optional 类型的对象。为什么不用构造方法呢,因为构造方法是 private 的(源码如下所示)。 private Optional(T value) { this.value = value; } 那为什么要用 Optional.of() 呢?嗯,good question。继续上源码。 public static Optional of(T value) { return new Optional<>(Objects.requireNonNull(value)); } 1)如果 value 为 null,那么 Objects.requireNonNull(value) 就会抛出 NPE(嗯哼,总归是要碰面的,但好歹不用我们程序员主动 check 了)。 2)如果 value 不为 null,则通过 new 关键字创建正常的 Optional 对象。 假如数据库中不存在姓名呢?使用 Optional.empty() 作为返回值。来,继续上源码。 public static Optional empty() { @SuppressWarnings("unchecked") Optional t = (Optional ) EMPTY; return t; } 嗯哼,EMPTY 是什么玩意? private static final Optional<?> EMPTY = new Optional<>(null); 竟然是 Optional 类的一个私有常量(static + final)。怎么此刻我的脑子里想起了安徒生先生的寓言故事——皇帝的新衣,嗯,甭管了,反正“底层终究是丑陋的”。 这样的话,就可以使用 Optional 对象的 ifPresent() 方法来判断值是否存在,如果只需要处理值存在的情况,就可以使用 Lambda 表达式的方式直接打印姓名。 list.ifPresent(names -> { for (String name : names) { System.out.println(name); } }); 有点简单粗暴,对不对?但不管怎么说,终于可以在表象上和 null,NPE 说拜拜了,做人嘛,开心点~

剑曼红尘 2020-03-11 22:24:51 0 浏览量 回答数 0

问题

telnet 本地mysql服务时如何输入密码完成建立连接或者如何设置使得不用输入密码,数据库报错

python小菜菜 2020-06-01 19:36:26 0 浏览量 回答数 1

海外云虚拟主机包年25元/月起

海外独享虚拟主机全面上线,助力构建海外网站,提升公司国际形象;全球有效覆盖,超高性价比;建站入门首选,助力出口,适合跨境贸易企业。

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播