Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何告诉检查器旧方法将接受可为空的类型?_Java_Checker Framework - Fatal编程技术网

Java 如何告诉检查器旧方法将接受可为空的类型?

Java 如何告诉检查器旧方法将接受可为空的类型?,java,checker-framework,Java,Checker Framework,考虑这一点: @Nullable Object obj = null; Optional<Object> optional = Optional.ofNullable(obj); @Nullable Object obj=null; Optional Optional=Optional.ofNullable(obj); 这失败了,因为checker框架假定的Nullable不能接受null值(毕竟,它的参数没有标记为@Nullable) 有没有一种好方法可以告诉checker f

考虑这一点:

@Nullable Object obj = null;
Optional<Object> optional = Optional.ofNullable(obj);
@Nullable Object obj=null;
Optional Optional=Optional.ofNullable(obj);
这失败了,因为checker框架假定
的Nullable
不能接受
null
值(毕竟,它的参数没有标记为@Nullable)

有没有一种好方法可以告诉checker framework,该方法(或遗留代码中我无法更改的其他方法)在任何地方都接受@Nullable类型,而无需在任何地方更改代码?

我不确定您为什么说“其参数未标记为@Nullable”。 当我看文件的时候 checker framework/checker/jdk/nullness/src/java/util/Optional.java, 我看到以下带注释的方法:

public static <T> Optional<@NonNull T> ofNullable(@Nullable T value) {
    return value == null ? empty() : of(value);
}
publicstaticoptionalofnullable(@nullabletvalue){
返回值==null?空():of(值);
}
此外,当我在以下代码上运行Checker框架时,它不会发出警告

// run like this:
// javacheck -g TestOptional.java -processor nullness

import java.util.*;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.checker.nullness.qual.NonNull;

public class TestOptional {

  void m() {

    @Nullable Object obj = null;
    Optional<Object> optional1 = Optional.ofNullable(obj);

  }

}
//像这样运行:
//javacheck-g TestOptional.java-处理器空值
导入java.util.*;
导入org.checkerframework.checker.nullness.qual.Nullable;
导入org.checkerframework.checker.nullness.qual.NonNull;
公共类TestOptional{
void m(){
@可空对象obj=null;
Optional optional1=可选的不可用值(obj);
}
}
我不确定您的案例中发生了什么,因为您没有提供完整的测试用例,没有说明运行了什么命令,也没有给出实际的错误消息。(您确实提供了诊断,但我不确定是否准确。)


也许提供更多细节可以更好地理解您的问题。

编辑:此答案基于评论和

如果您像我一样不想或不能使用带注释的JDK,您将遇到这个问题

注意:在我工作过的大多数Java商店中,我们根本无法切换我们使用的编译器或提供“自定义”JDK(这真是不可思议)。为了便于移植,首先,我必须将自定义JDK添加到我的源代码存储库中,或者将其分发到每台机器上,包括编译代码的CI服务器,并确保它们在不同操作系统中处于完全相同的路径。只是不酷

解决方案是将它们作为参数提供并传递给
javac
进程

无论您使用什么工具来编译,这都可以很容易地完成

例如,对于Maven(使用标准):


这种方法很简单,只需要很少的工作,完全不会弄乱我使用的编译器或Java库,确保这些定义只与checkerframework一起使用(因此,例如,我可以将其添加到Maven概要文件中,并仅在我想通过简单地传递Maven参数来启用它),将跨机器和操作系统工作,而无需使用真正的Java方式进行设置。

这似乎是该框架当前的一个限制。在我看来,解决方案是允许自定义配置将类型注释添加到外部库(在我看来,默认情况下,假设所有内容都为非null是可以的),包括JavaSDK。例如,让我向配置文件中添加以下声明:“Optional java.util.Optional.ofNullable(@Nullable T)”将“覆盖”实际定义。当然,它应该只添加类型注释,而不是更改它们或弄乱返回/参数类型。这将消除对“带注释的JDK”的需要,并使向任何库添加注释成为可能。这不是框架的当前限制,因为您提出的功能已经存在并被调用。它可以与带注释的JDK一起使用。您假设我正在使用带注释的JDK,但我没有,我在评论中提到了这一点。知道这一点,就没有其他相关的了。我将NullnessChecker作为一个简单的注释处理器运行(在Maven中,但这并不相关)。使用带注释的JDK是绝对不可能的(它是不可移植的,可能会导致兼容性/安全性问题,考虑到提供存根类的可能性,它甚至看起来是完全多余的-也许您应该在默认情况下添加Jdk8的存根并删除带注释的JDK),您的回答并没有回答我更一般的问题:“有没有一种好的方法告诉checker framework这个方法(或者我无法更改的遗留代码中的其他方法)…”。哦,您没有使用带注释的JDK。你没有在评论或其他地方这样说。为什么不使用它呢?这将是解决你的问题的一个简单方法。关于遗留代码的注释,我的初始注释已经将您引向了手册中对遗留代码的讨论。我看到你现在在回答中重复了这一点(但没有对我的评论给予赞扬)。不管怎样,我很高兴你现在理解了。我在我的答案说明中解释了为什么我不能使用带注释的JDK。我同意我应该说清楚我没有用它。在我的回答中,我会对你的评论加上一点赞扬,对此我很抱歉。顺便说一句,这个框架做得很好!我希望能够为它的改进做出贡献。我正在使用带注释的djdk,并且在一些方法中仍然会出现编译器错误,其中null是一个完全可以接受的值。是否有地方建议对存根文件进行添加?
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <annotationProcessors>
            <annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker</annotationProcessor>
         </annotationProcessors>
         <compilerArgs>
             <arg>-Astubs=checkerframework/stubs</arg>
             <arg>-AstubWarnIfNotFound</arg>
         </compilerArgs>
     </configuration>
 </plugin>
    <dependency>
        <groupId>org.checkerframework</groupId>
        <artifactId>checker-qual</artifactId>
        <version>1.9.2</version>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.checkerframework</groupId>
        <artifactId>checker</artifactId>
        <version>1.9.2</version>
        <optional>true</optional>
    </dependency>
package java.util;

import org.checkerframework.checker.interning.qual.*;

import javax.annotation.Nullable;

class Optional<T> {
    static <T> Optional<T> ofNullable(@Nullable T value);

    @Nullable T orElse(@Nullable T other);
}