将空值作为参数发送到Java

时间:2015-05-05 18:28:53

标签: java methods null parameter-passing static-analysis

我在下面有一个相当简单的测试用例。我可以向构造函数发送空值而没有任何问题或错误,但是当我尝试向方法发送空值时,它会出错:error: incompatible types: <null> cannot be converted to int(或者预期的任何类型)。我不确定为什么会发生这种情况,而且我在很多地方看到过发送空值是可以接受的做法。在所有现实中,我只需要空值,以便我可以将此示例泵入Soot和Spark进行静态分析,因此除了Spark-static分析中入口点的语义必要性之外,发送给方法的实际参数是无关紧要的。

public class Test {
    public Test(Object var1, Object var2) {
        //do irrelevant stuff here with var1 and var2
    }

    public void api1(int x, int y) {
        // do irrelevant stuff with x and y
    }

    public List<String> api2(String x, int y, boolean a) {
        // do irrelevant stuff with x, y, and a and return a new ArrayList<String>()
    }
}

public class Main {
    public static void main(String[] args) {
        Test usingVars = new Test(1, 2);  // works, compiles and no errors
        Test usingNulls = new Test(null, null); // works, compiles and no errors

        /**
         * usingVars will obviously work and not complain at all
         */
        usingVars.api1(1, 2); // works, compiles and no errors
        usingVars.api2("test", 1, false); // works, compiles and no errors

        /**
         * usingNulls should work, but throws this error on compilation:
         *     error: incompatible types: <null> cannot be converted to int
         */
        usingNulls.api1(null, null); // should work, doesn't compile errors out
        usingNulls.api2(null, null, null); // should work, doesn't compile errors out

    }
}

3 个答案:

答案 0 :(得分:6)

原语(例如int s)无法取null个。如果您绝对必须使用null值,则应将方法参数定义为相应的包装类(例如java.lang.Integer的{​​{1}}):

int

答案 1 :(得分:1)

在Java中,您有两种类型的变量,基元和引用。

引用可以是null,因为它不引用任何内容。原语(例如int)不能是null,它必须是数字。

如果您不关心价值观,可以使用0-1Integer.MIN_VALUE

答案 2 :(得分:1)

new Rest().new Config();传递给方法,构造函数或其他方式是不可能的原始类型(例如restful.new Config();nullintshort )因为在java中你有两个类型系统,基元和对象。可以将基元强制转换为对象包装器(例如bytefloatIntegerShort)并用作对象,因此如果需要要传递null,请使用Byte,而不是Float。但是,java中用于传递Integer无用值的约定是使用int