首页
学习
活动
专区
圈层
工具
发布

HashMap和Hashtable的key和value可以为null吗,ConcurrentHashMap呢

文章目录一、前言二、Hashtable的key为什么不能为null三、HashMap的key为什么可以null四、ConcurrentHashMap的key和value都不能为null五、总结一、前言HashMap...value为null,throw new NullPointerException() 也会抛出异常所以Hashtable的key、value都不能为空(区别与HashMap的put、hash方法)如果希望允许...0 : (h = key.hashCode()) ^ (h >>> 16);}当key为null的时候,不走hashCode()方法,直接返回0,不会抛出空指针异常,所以HashMap的key可以为null...} } } addCount(1L, binCount); return null;}根据源码可知,当key为null、或value为null时,会抛出空指针异常...Hashtable首先判断null是否为null;后续也会直接调用key的hashCode()方法,因此如果key为null,则抛出空指针异常HashMap可以存储一个Key为null,多个value为

62410

@SentinelResource注解如何使用?请你过目!

@SentinelResource 注解包含以下属性: value:资源名称,必需项(不能为空) entryType:entry 类型,可选项(默认为 EntryType.OUT) blockHandler...exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。...SentinelResource 注解用于定义资源 * @param s * @return */ @Override //value:资源名称,必需项(不能为空...} 启动我们的项目,访问我们的测试方法(多刷新几次,去看控制面板) 限流测试 现在我们为我们的资源:hello 配置一个流控规则,配置步骤如下图 配置成功: 回到我们的页面,快速刷新页面,我们会发现偶尔有如下信息显示...,说明我们配置的流控规则成功进行了拦截 控制台日志: 根据我们上面的学习,如果超过我们配置的QPS,代码会抛出BlockException异常,为什么代码里面是FlowException,通过查看源码我们会发现

1.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java异常的优雅的设计

    比如,你在写一个service,其中在写到某段代码处,你发现可能会产生问题,那么就请抛出异常吧,相信我,你此时抛出异常将是一个最佳时机。...当我们在写某个方法的时候,可能会偶然遇到某个错误,我们认为这个问题时运行时可能为发生的,并且理论上讲,没有这个问题的话,程序将会正常执行的时候,它不强制要求调用者一定要捕获这个异常,此时抛出RuntimeException...的 收货地址的必要字段不能为 空 如果用户还没有收货地址,当此收货地址创建时设置成默认收货地址 — 删除收货地址: 入参: 用户id 收货地址id 约束: 用户id不能为空,且此用户确实是存在的 收货地址不能为空...,且此用户确实是存在的 收货地址不能为空,且此收货地址确实是存在的 判断此收货地址是否是用户的收货地址 默认地址设置: 入参: 用户id 收货地址id 约束: 用户id不能为空,且此用户确实是存在的 收货地址不能为空...所以这就是为什么在service中一定要判断好约束条件,再进行业务逻辑操作的原因了。

    1.1K20

    如何优雅的设计 Java 异常

    比如,你在写一个service,其中在写到某段代码处,你发现可能会产生问题,那么就请抛出异常吧,相信我,你此时抛出异常将是一个最佳时机。...当我们在写某个方法的时候,可能会偶然遇到某个错误,我们认为这个问题时运行时可能为发生的,并且理论上讲,没有这个问题的话,程序将会正常执行的时候,它不强制要求调用者一定要捕获这个异常,此时抛出RuntimeException...的 收货地址的必要字段不能为 空 如果用户还没有收货地址,当此收货地址创建时设置成默认收货地址 — 删除收货地址: 入参: 用户id 收货地址id 约束: 用户id不能为空,且此用户确实是存在的 收货地址不能为空...,且此用户确实是存在的 收货地址不能为空,且此收货地址确实是存在的 判断此收货地址是否是用户的收货地址 默认地址设置: 入参: 用户id 收货地址id 约束: 用户id不能为空,且此用户确实是存在的 收货地址不能为空...所以这就是为什么在service中一定要判断好约束条件,再进行业务逻辑操作的原因了。

    2.4K00

    这样设计 Java 异常更优雅,赶紧学!

    比如,你在写一个service,其中在写到某段代码处,你发现可能会产生问题,那么就请抛出异常吧,相信我,你此时抛出异常将是一个最佳时机。...当我们在写某个方法的时候,可能会偶然遇到某个错误,我们认为这个问题时运行时可能为发生的,并且理论上讲,没有这个问题的话,程序将会正常执行的时候,它不强制要求调用者一定要捕获这个异常,此时抛出RuntimeException...的 收货地址的必要字段不能为 空 如果用户还没有收货地址,当此收货地址创建时设置成默认收货地址 — 删除收货地址: 入参: 用户id 收货地址id 约束: 用户id不能为空,且此用户确实是存在的 收货地址不能为空...,且此用户确实是存在的 收货地址不能为空,且此收货地址确实是存在的 判断此收货地址是否是用户的收货地址 默认地址设置: 入参: 用户id 收货地址id 约束: 用户id不能为空,且此用户确实是存在的 收货地址不能为空...所以这就是为什么在service中一定要判断好约束条件,再进行业务逻辑操作的原因了。

    66220

    你如何检查参数的合法性?

    背景 大部分的方法和构造函数对传入的参数值有一些限制,比如:常见的索引值必须是非负数,对象引用不能为空。 你应该使用清晰的文档来标注所有的这些限制,然后在方法体开始的地方强制他们检查。...最糟糕 方法正常返回,但是一些对象处在一个不正确的状态,未来一个不确定的时间点在某些无关联的点会造成一个错误。 一句话总结:参数不校验会导致原子性失败。...只要你已经已经在文档中标注了方法参数的限制和违反限制会抛出的异常,限制将是一个简单的事情,下面是一个典型的例子。...mod将抛出NullPointException, 尽管这个方法确实会这样。...所以:这里有一个小店,在开始的时候检查列表中的元素应该是可以互相比较的,注意:修改合法性检查会丧失原子失败。 偶尔,一个计算执行了一个需要的合法性检查,但是当执行检查失败的时候,抛出了一个错误的异常。

    1.8K10

    Dubbo服务如何优雅的校验参数

    , messageTemplate='用户手机号不能为空'}, ConstraintViolationImpl{interpolatedMessage='用户标识不能为空', propertyPath=..., messageTemplate='用户手机号不能为空'}, ConstraintViolationImpl{interpolatedMessage='用户标识不能为空', propertyPath=...因此对于参数校验不合法的情况,服务调用方自然不希望服务端抛出一大段包含堆栈信息的异常信息,而是希望还保持这种统一的返回形式,就如下面这种返回所示: Dubbo接口服务端配置: { "code":...1001, "msg": "用户名不能为空", "data": null } 3.1 ValidationFilter & JValidator 想要做到返回格式的统一,我们先来看下前面所抛出的异常是如何来的...3.2 自定义参数校验异常返回 从前一小节我们可以很清晰的了解到了为什么会抛出那样的异常信息给调用方,如果想做到我们前面想要的诉求:统一返回格式,我们需要按照下面的步骤去实现。

    1.8K10

    内存管理--35:僵尸对象(Zombie Object)

    ,也就是0) 为了避免给野指针发送消息会报错,一般情况,当一个对象被释放后我们就会将这个对象的指针置为空指针 注:在OC中,给空指针发送消息是不会报错的 用“僵尸对象”调试内存管理问题 程序若有内存问题就会导致程序偶尔崩溃...,这是为什么?...其问题的根本原因取决于对象所占的内存有没有被其他内容所覆写,而这块内存有没有移作他用,又无法确定,所以导致程序偶尔崩溃。...iOS中,提供了僵尸对象(zombie)调试功能,开启这项调试功能,如果出现内存管理问题,运行期系统会把所有已经回收的问题实例对象转化为特殊的“僵尸对象”,而不会真正回收它们,僵尸对象收到消息后,会抛出异常...开启调试的方式: 在Xcode编辑器设置僵尸对象 举个例子 未开启“僵尸对象”调试 未开启“僵尸对象”调试 开启“僵尸对象”调试(会多一句提示信息

    43810

    五、Apache Commons Configuration2.x别样的Builder模式:ConfigurationBuilder

    模式可能和你熟知的使用上可能并不太一样,它并没有build()方法,而是getXXX,并且使用一个Map来管理各个属性… 题外话:Commons Configuration的设计里大量的使用到了Map传值,我个人觉得这么做非常不面对对象...XML和Properties文件喽。...// 管理注册上来的监听器们 private final EventListenerList eventListeners; // 初始化的时候是否允许失败,如果是false:那遇到异常就抛出...= new HashMap(); // params.put("fileName", "YourBatman"); // 此处不能设置,因为它没有名为`fileName`的这个属性值,所以会抛错...> configClass) { ... } // 当前文件的Handler // 因为是FileBased,所以肯定与文件有关嘛,所以交给FileHandler来处理 private

    1.2K20

    还在到处写 != null ?Java 代码异味该改改了

    = null 根本不是什么策略 —— 这只是一种防御性的拼凑做法,往往会掩盖设计和沟通中更深层次的问题。 在本文中,我们将探讨: • 为什么到处写 !...= null 的真正问题 让我们来聊聊为什么这是一种不好的实践: 1. 它掩盖了糟糕的设计 如果你的对象在任何时候都可能为 null,问问自己:它们为什么会是 null ? 是数据缺失了?...= null) { process(user); } 我们没有去理解用户为什么可能为 null,而是跳过了这个更深层次的问题,只是简单地“防御”它。 2. 容易出错 你越依赖 !...示例: // 有人在这里漏掉了空值检查 order.getCustomer().getName(); // 崩溃 3. 让代码难以阅读 大量的空值检查会产生冗长、嵌套、难以理解的逻辑。...userOpt.get(); // 如果为空,会抛出 NoSuchElementException 更安全的方式: User user = userOpt.orElse(new GuestUser())

    25810

    IllegalArgumentException ⚠️:Method has been passed an illegal or inappropriate argument 完美解决方法

    当方法被传入了非法或不恰当的参数时,Java运行时系统会抛出这个异常。这个问题通常发生在参数验证不当或开发人员对API的使用方式有误解时。...如果这些条件未满足,方法将无法正常运行,Java会抛出IllegalArgumentException。 常见的 IllegalArgumentException 场景分析 1....空值传递 有些方法不允许null值作为参数传入。如果传入了null,则会抛出IllegalArgumentException。...void setName(String name) { if (name == null) { throw new IllegalArgumentException("名称不能为空...方法来简化null值的验证: public void processOrder(String orderId) { Objects.requireNonNull(orderId, "订单ID不能为空

    73110

    类型声明与空安全(Void Safety)

    在 Kotlin 中,不可能为空的变量和可能为空的变量被强行分开了(Java 有 @Nullable 和 @NonNull 注释,但只会提供警告)。那 Kotlin 为什么要这样设计呢?...再考虑到并发操作,即mAudioPlayer这个变量在任何使用的时候都可能为 null。 但外部已经有空条件判断了,且这是最新的版本才暴露的问题,为什么会这样呢?...前者的行为是,如果非空则调用,否则不调用;后者行为是,如果非空则调用,否则抛出 Illegalstateexception。...getMyCode() // ok } 生产环境不建议使用双叹号!!,一般只用于测试环境。使用双叹号可以理解为放弃 Kotlin 的空安全特性。 3....所以,可空是具有传递性的。 双叹号由于在变量为空时会抛出异常,所以它的返回值就还是为 Int,因为抛了异常的话,后面的代码已经不会被执行了。

    1.3K50

    有效处理Java异常的三个原则,你知道吗?

    为什么出错? 在有效使用异常的情况下,异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出,如果你的异常没有回答以上全部问题,那么可能你没有很好地使用它们。...堆栈信息立即反映出什么出了错(提供了非法参数值),为什么出错(文件名不能为空值),以及哪里出的错(readPreferences()的前部分)。这样我们的堆栈信息就能如实提供: ?...另外,其中包含的异常信息("文件名为空")通过明确回答什么为空这一问题使得异常提供的信息更加丰富,而这一答案是我们之前代码中抛出的NullPointerException所无法提供的。...既然文件不存在,变量in就是空的,一个 NullPointerException就会被抛出。 调试程序时,本能告诉我们要看日志最后面的信息。...把责任交给 readPreferences()的调用者,让它来研究处理配置文件缺失的恰当方法,它有可能会提示用户指定其他文件,或者使用默认值,实在不行的话也许警告用户并退出程序。

    2K10
    领券