首页 / 知识
关于Java:将null传递给方法
2023-04-13 11:49:00

Passing null to a method我正在阅读优秀的《清洁规范》 一个讨论是关于将空值传递给方法。
它代表了不同的处理方式:
我更喜欢断言方法,但是我不喜欢断言默认情况下处于关闭状态的事实。 该书最后指出:
它实际上并没有涉及如何实施此限制? 无论哪种方式,您中的任何人都有强烈的意见。
一般规则是,如果您的方法不希望使用 另请阅读有关防御性编程的文章 也不是立即使用,而是与Spec#的提及有关。有一个建议在Java的未来版本中添加"空安全类型":"增强的空处理-空安全类型"。 根据提案,您的方法将变为
其中 断言的使用和异常的抛出都是有效的方法。任何一种机制都可以用来指示编程错误,而不是运行时错误,如此处的情况。
选择实际上取决于项目的开发实践。整个项目需要确定一个断言策略:如果选择是在所有开发过程中启用断言,那么我会说要使用断言来检查这种无效参数-在生产系统中,由于以下原因而抛出NullPointerException:无论如何,编程错误都不太可能以有意义的方式捕获和处理,因此就像断言一样。 但是实际上,我知道许多开发人员不相信断言会在适当的时候启用,因此选择了抛出NullPointerException的安全性。 当然,如果您不能为代码实施策略(例如,如果您正在创建库,并且这取决于其他开发人员如何运行您的代码),则应该选择对这些代码抛出NullPointerException的安全方法库API的一部分的方法。
如果它们传入null,则通过抛出ArgumentExcexception来强制实施。
我更喜欢使用断言。 我有一条规则,我只能在公共方法和受保护方法中使用断言。这是因为我相信调用方法应确保将有效参数传递给私有方法。 Spec#看起来非常有趣! 当类似的东西不可用时,我通常会通过运行时空检查和内部方法的断言来测试非私有方法。我没有在每个方法中显式地编写null检查代码,而是将其委托给具有check null方法的实用程序类:
然后检查变成:
可以与编辑器宏或代码处理脚本一起添加。
我发现,到目前为止,JetBrains的 http://www.jetbrains.com/idea/documentation/howto.html 将此(或类似的东西)作为java标准会很好。
由于离题似乎已成为话题,因此Scala为此采取了一种有趣的方法。假定所有类型都不为空,除非您将其明确地包装在
我通常不喜欢任何一种,因为这只是在减慢速度。无论如何,稍后都会引发NullPointerException,这将迅速导致用户发现他们正在将null传递给该方法。我曾经检查过,但是我40%的代码最终还是要检查代码,这时我认为这不值钱。 @克里斯·卡歇尔,我会说完全正确。我要说的唯一一件事是分别检查参数,并让exeption报告参数为空的参数,因为这使跟踪零点的来源变得更加容易。 @wvdschel哇!如果编写代码对您来说太费力,则应考虑使用PostSharp(或Java等效语言,如果可用的话)之类的东西,可以对程序集进行后处理并为您插入参数检查。 稍微偏离主题,但我认为findbug的一个非常有用的功能是能够注释方法的参数,以描述哪些参数不应传递空值。 通过对代码进行静态分析,findbug可以指出使用潜在的空值调用该方法的位置。 这有两个优点: 仅在可以访问调用方法的代码时才有用,但通常是这种情况。 我同意还是不同意wvdschel的帖子,这取决于他的具体说法。
在这种情况下,请确保此方法将在 但是,如果该方法仅存储传递的数据,并且稍后有其他方法可以处理该数据,则尽早发现错误的输入是更快修复错误的关键。在此之后的某个时刻,可能会有无数种方式将错误的数据恰巧提供给您的班级。这是在试图弄清事实之后老鼠如何进入您的房子,并试图在某个地方找到洞。 尽管它不是严格相关的,但您可能要看一下Spec#。 我认为它仍在开发中(由Microsoft开发),但是可以使用一些CTP,并且看起来很有希望。基本上,它允许您执行以下操作:
要么
它还提供了诸如Notnull类型的其他功能。它建立在.NET Framework 2.0之上,并且完全兼容。您可能会看到,语法为C#。
我认为,在方法开始时立即抛出C# 对于运行时异常,应该始终保持谨慎-方法签名上未声明的异常。由于编译器不会强制您捕获这些错误,因此很容易忘记它们。确保您具有某种"全部捕获"异常处理,以防止软件突然停止。那是用户体验中最重要的部分。 处理此问题的最佳方法实际上是使用异常。最终,断言最终将给最终用户提供类似的体验,但是在向最终用户显示异常之前,开发人员无法调用您的代码来处理这种情况。 Ultimatley,您想确保尽早测试无效输入(尤其是在面向公众的代码中),并提供调用代码可以捕获的适当异常。 以Java的方式,假设null来自编程错误(即永远不应该超出测试阶段),然后让系统将其抛出,或者如果有副作用到达该点,请在开始时检查null并抛出IllegalArgumentException或NullPointerException。 如果null可能来自实际的特殊情况,但是您不想为此使用检查的异常,那么您肯定想在方法开始时使用IllegalArgumentException路由。 |
最新内容
相关内容
python的调用绑定方法和非绑定方法
python的调用绑定方法和非绑定方法,代码,方法,实例,第一,培训,时计,奇数,偶数,参数,定义,在Python中,如果用实例去调用方法,这种限制就被称为PyPython网络编程调用接收数据的三种
Python网络编程调用接收数据的三种方法,数据,代码,基础,通用,通讯,服务,网络,培训,方法,报文,最近在使用python进行网络编程开发一个通用的tcPython 3.6 中针对文件系统的神奇
Python 3.6 中针对文件系统的神奇方法,数字,代码,数据,标准,信息,培训,首次,工作,文件名,常数,Python3.6首次发布于2016年,尽管它已经发布了很Python 之模块重载的五种方法
Python 之模块重载的五种方法,环境,培训,方法,模块,文件夹,例子,下面,内容,语句,请看,python环境准备新建一个foo文件夹,其下包含一个bar.py文提升Python数据分析能力的方法
提升Python数据分析能力的方法,分析,数据,工具,代码,时间,环境,报告,信息,培训,标准,1.Pandas分析包这个工具的好处是显而易见的。下面的动画Python中字典合并的实现方法
Python中字典合并的实现方法,培训,结果,以上,版本,字典,方法,函数,下面,背景,发现,TableofContents背景Methon1:适用于Python3.5及以上版本呢M学习python的三种方法
学习python的三种方法,项目,代码,公司,时间,工程,培训,中级,初级,资料,第一,Python的用途十分广泛,不同的程序员将其用于不用的领域,不同的程序Python文件读取相关方法
Python文件读取相关方法,数据,位置,文件,中行,培训,方法,字节,内容,结果,字符串,我们知道,对文件的读取操作需要将文件中的数据加载到内存中,而Python文件读取相关方法
Python文件读取相关方法,数据,位置,文件,中行,培训,方法,字节,内容,结果,字符串,我们知道,对文件的读取操作需要将文件中的数据加载到内存中,而Python 多线程死锁问题的巧妙解决
Python 多线程死锁问题的巧妙解决方法,异常,持有,代码,情况,信息,管理,数据,包装,策略,预期,死锁死锁的原理非常简单,用一句话就可以描述完。列举Python面向对象中带双下划线的
列举Python面向对象中带双下划线的特殊方法,信息,代码,培训,对象,属性,方法,实例,字符串,里边,内容,__new__:生成实例__init__:生成实例的属性_python函数调用和参数传递
python函数调用和参数传递,位置,培训,函数,变量,参数,指针,例子,内存,整数,操作,定义过函数后,就可以在后面程序中使用这一函数printsquare_su