将 null 传递给方法[关闭]

2023-12-30

我正在阅读优秀的干净的代码 https://rads.stackoverflow.com/amzn/click/com/0132350882

一个讨论是关于将空值传递到方法中。

public class MetricsCalculator {
    public double xProjection(Point p1, Point p2) {
        return (p2.x - p1.x) * 1.5;
    }
}
...
calculator.xProjection(null, new Point(12,13));

它代表了处理此问题的不同方法:

public double xProjection(Point p1, Point p2) {
    if (p1 == null || p2 == null) {
        throw new IllegalArgumentException("Invalid argument for xProjection");
    }
    return (p2.x - p1.x) * 1.5;
}

public double xProjection(Point p1, Point p2) {
    assert p1 != null : "p1 should not be null";
    assert p2 != null : "p2 should not be null";
    return (p2.x - p1.x) * 1.5;
}

我更喜欢断言 http://java.sun.com/j2se/1.4.2/docs/guide/lang/assert.html方法,但我不喜欢断言默认关闭的事实。

书中最后指出:

在大多数编程语言中,没有好的方法来处理调用者意外传递的 null。因为是这种情况,所以合理的做法是默认禁止传递 null。

它并没有真正涉及您将如何执行此限制?

不管怎样,你们中有人有强烈的意见吗?


一般规则是如果您的方法不期望null那么你应该抛出参数系统参数NullException http://msdn.microsoft.com/en-us/library/system.argumentnullexception.aspx。正确投掷Exception不仅可以保护您免受资源损坏和其他不良情况的影响,还可以为您的代码用户提供指南,从而节省调试代码的时间。

另请阅读一篇文章防御性编程 http://en.wikipedia.org/wiki/Defensive_programming

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 null 传递给方法[关闭] 的相关文章

随机推荐

  • Pandas DataFrame:__getitem__() 的完整规范? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 简洁版本 对于熊猫Dataframe getitem 允许的输入是什么 实际上是输入类型 该函数会产生
  • 用于嵌套索引操作的 Rails 多态链接

    我已经尝试找到这个链接几个小时了 我有一个多态关联 其中系列和分类都有设计 收藏模型 has many designs as gt targetable 品种型号 has many designs as gt targetable 设计模型
  • 获取字符串中的最后一个数字 (JavaScript)

    var str 7 Dec 1985 var str 12 Jan 1703 var str 18 Feb 1999 我怎样才能把年份从字符串中取出来呢 我尝试了许多不同的正则表达式 但似乎都不起作用 我本以为re new RegExp d
  • 如何在 html.erb 文件中运行多行 Ruby

    我正在使用 Ruby on Rails 需要在我的 html erb 文件之一中运行一段 Ruby 代码 我这样做吗 或者像这样 谢谢阅读 如果您的视图中需要额外的函数 通常您可以在助手中声明它们 对于每个控制器 如果有助手 它会自动加载
  • 模板中带有 symfony 的动态菜单

    我正在构建一个 symfony 网站 并且我有自己的代码来动态构建带有子项的菜单 现在 我在 base html twig 文件 主布局 中使用一些 twig 代码来打印它 问题是当我需要传递带有菜单项的数组时 我实际上将它传递给单个控制器
  • 应该在命令式编程之前教授函数式编程吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么拆箱比装箱快100倍

    为什么装箱和拆箱操作之间的速度变化如此之大 有10倍的差别 我们什么时候应该关心这个 上周 Azure 支持人员告诉我们应用程序的堆内存存在问题 我很好奇这是否与装箱拆箱问题有关 using System using System Diag
  • EF Core 与 ASP MVC .NET 4.6

    在一个项目中 我需要设置 ASP NET MVC 使用 NET 4 6 1 但使用 新 EF Core 来访问数据库 不幸的是 每个文档都只解释了如何设置 ASP NETCoreMVC 项目 我刚刚尝试了一下 当通过包管理器控制台创建数据库
  • Oracle 中使用 Jetty 的连接池

    我正在努力实现这个概念ConnectionPooling in Oracle using Jetty服务器 我尝试了以下在教程中看到的内容 如果我使用部署它就可以工作Tomcat服务器 但是Jetty似乎给了我一种不寻常的感觉error 详
  • 查找图像中连续的黑色像素

    我一直在使用 OpenCVfindContours 找到连续黑色像素的区域 有时它会选择黑色像素周围的白色像素区域 例如在此图中 g e 和 n 按照我的预期用黑色像素选择 但其他三个字母由白色像素的周围区域选择 如轮廓的绿色点所示 有时
  • Promise.all 中每个函数需要多少时间? [复制]

    这个问题在这里已经有答案了 我有一些 URL 我想同时调用它们 我想知道每个请求需要多长时间 我的代码是这样的 var urls http req0 com http req1 com http req2 com Promis all ur
  • 在linux中运行python可执行文件

    我发现其他一些人问这个问题 但他们问题的答案对我没有帮助 我试图学习 python 并尝试使文件可执行 当我输入时练习脚本就会运行python userPrompt py 但是当我尝试将它作为可执行文件运行时 只是 userPrompt p
  • LINQ:如何将整数列表连接成逗号分隔的字符串?

    这可能是我错过的一些愚蠢的事情 但我尝试连接整数列表而不是将它们与 integerArray Aggregate accumulator piece gt accumulator piece 编译器抱怨参数错误 有没有一种巧妙的方法可以做到
  • Wix Silverlight 先决条件

    我有一个 Wix 引导程序项目 如果需要 它可以从网络安装 Net 框架 不 我想对 Silverlight 做同样的事情 最好是从网络上获取 但如果必须的话 我会将其捆绑在一起 那么如何添加 Silverlight 作为先决条件呢 解决了
  • 如何从EAGLView获取UIImage?

    我正在尝试从 EAGLView 中显示的内容获取 UIImage 关于如何执行此操作有什么建议吗 这是 Quakeboy 代码的清理版本 我在 iPad 上测试过 效果很好 改进包括 适用于任何尺寸的 EAGLView 适用于视网膜显示屏
  • 应用程序验证许可证执行情况?

    如果我对我的应用程序强制执行许可限制 例如应用程序第一次运行时 那么我的应用程序是否应该每次检查限制 可能是加密的许可证文件 你如何设计这部分 什么是最好的方法 基本上我想以某种方式节省CPU周期 加密意味着解密等等 我希望你理解我的担忧
  • 使用 FragmentStatePagerAdapter 通过 ViewPager 保留片段的位置

    我有一个包含 TabLayout 的活动 并为每个选项卡使用一个片段 作为回报 该片段包含另一个与 ViewPager 一起使用的片段 这是我的设置 例程活动 java public class RoutineActivity extend
  • 405 不允许 POST 方法

    我正在尝试使用 OAuth 开发 REST 提供程序 我正在使用 Django RESTFramework 和 DjangoOAuthToolkit 我执行了 GET 并且它工作正常 但我尝试使用 POST 并且服务器响应 detail M
  • 在 Visual Studio 安装之间传输保存的数据连接

    我经常使用 Visual Studio 中的数据和架构比较工具 我刚刚在新虚拟机上安装完 VS 2010 当然 我意识到以前安装时保存的所有数据连接都不可用 有没有办法在 VS 2010 安装之间转移这些连接 我相信你只需复制文件 C Us
  • 将 null 传递给方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi