当前位置: 首页 > 知识库问答 >
问题:

@NotNull在运行时工作吗

娄阳舒
2023-03-14

我最近决定开始使用空校验和注释(@NotNull),我使用Intellij Idea的注释库来访问这些注释。我试图弄清楚这些注释在运行时是否可以检查值是否为null,如果是,它如何处理这些错误(例如,它是否抛出NullPointerException,它是否只返回默认值(例如null,0,false))。此外,如果这些注释不起作用,是否存在一组在运行时起作用的更标准化注释(例如,javax)?如果这些不起作用,我应该停止使用它们并返回标准的空校验和(If(x==null)),还是应该同时使用注释和标准的空校验和?当我在这里的时候,像@Nullable这样的注释是个好主意吗?

共有2个答案

相温文
2023-03-14

此外,如果这些注释不起作用,是否有一组不同的注释可能是在运行时起作用的更标准化的注释(例如javax)?如果这些不起作用,我应该停止使用它们并返回标准的空校验和(If(x==null)),还是应该同时使用注释和标准的空校验和?

依赖注释进行运行时行为的问题在于,程序的正确性取决于所执行的注释处理的预期形式。例如,对于空检查,您需要一个注释处理器(可能集成到编译器中)在编译时或之前识别特定的注释,并执行您想要的操作:插入空检查代码。

尽管某些注释在运行时保留,但您不能直接从中获得运行时行为。相反,这样的注释及其属性可以由恰好对类进行反射分析的代码进行检查和操作。基本上,除了主动查找注释的代码之外,您从注释的运行时保留中什么也得不到。

如果需要运行时空检查,则应插入显式检查。如果您愿意依赖注释和相关的静态分析来确保空检查是不必要的,那么这就是您的决定。你应该记住的考虑因素包括:

>

  • 公共方法及其参数或公共字段上的注释不能可靠地静态保护代码不受第三方向代码提供空值的影响,因为它们不需要使用执行适当静态分析的工具来构建代码。

    注释也不能防止以反射方式或通过本机代码向方法提供空值,因为这两种方法都绕过了编译器和任何相关的静态分析。

    人们往往把NullPointerExceptions看得太重了。被IllegalArgumentException(比如)而不是NullPointerException告知误用几乎没有什么客观好处。NPE更具体地描述了问题的性质,而IAE更具体地描述了问题的背景。重要的是确保尽早发现问题。

    当我在这里的时候,像@Nullable这样的注释是个好主意吗?

    它们为代码添加了外部依赖项,这是应该考虑的成本。它们具体地表达了您的期望,并且机器可操作,这是一个相应的好处。如果您正在使用的注释库对于您希望向其分发源代码的每个人都是可用的,并且如果那些具有运行时保留的注释对于您希望运行代码的每个人都是可用的,那么注释可能是一个净好处。否则,它们将无法启动。

  • 咸琪
    2023-03-14

    是的,它在运行时进行检查,并在null时抛出一个IllegalArgumentExc0019

     类似资料:
    • 我有一个Spring实体,其中有一个用javax.validation.constraints中的@NotNull注释的字段 问题是,如果为name字段设置了空值,则将其存储在数据库中。但是,如果我按以下方式更改类,它会引发我想要接收的异常: ApplicationContext-JPA 由于我使用的是存储库,因此我还报告了corrisponding实体存储库:

    • 我正在写一个程序,显示如下所示的航班信息: 我的问题是使用方法时: 当正常运行时,由于某种原因它不会执行,但是当我使用调试器执行程序时,一切都执行得很好,我得到了一个有意义的输出(格式不是很好,但我可以使用),为什么会发生这种情况? 输出应该是这样的: 当我正常运行时,我会得到这个: 这是当我一步虽然(或运行调试): 我希望输出的是单步执行部分(稍后我将处理格式化) eddit:我已经在错误流中添

    • 我正试图将我写的一个python工具打包到一个exe文件中,以便在Windows10上使用。据我所知,exe是正确构建的。如果我从命令行运行它,它就会加载并且一切正常。 但是,如果我试图从资源管理器运行该工具(双击图标),我会得到一个“执行脚本失败”的错误。我尝试使用--debug开关构建它,希望在cmd关闭之前可以快速捕获任何输出,但速度太快了。 我用来构建工具的代码行是: 在我开始使用repo

    • 我正在尝试使用Hibernate验证器制作简单的验证表单。我的Customer类中有两个字段,我希望其中一个字段是必需的(lastName)。关键是,即使im没有填充这个字段,我也不会得到错误消息,BindingResult也不包含任何错误。我的代码中缺少什么吗? 编辑:表单代码: 编辑2:我添加到类路径validation-api.jar(包含抽象API和注释扫描程序)。 还插入了@initbi

    • 我使用ByteBuddy创建了一个java代理用于方法日志记录。 具有用。但是,在这些方法中,我引用了一个公共静态类及其所有属性和方法公共静态。在运行应用程序时,我能够使用这种方法记录所有方法,没有问题。 但是,当我运行一个用注释的测试类时,出现了一个问题。出于某种原因,插入指令的代码似乎消失了。还有其他人经历过类似的问题吗? 作为参考,当在IntelliJ中运行测试类时,我做了一个,并且在测试类

    • 我正在使用Service Worker创建一个渐进式Web应用程序,我正在使用Service Worker工具箱来缓存我的内容。Service Worker代码来缓存我的内容: 代码运行正常,因为我在控制台上没有看到任何错误。但是我如何检查是否从云前或上面配置的网址的图像正在缓存和从缓存本身渲染。