如何使方法取空值?

时间:2015-08-18 05:04:36

标签: java null method-signature

如果你有两个重载方法,那么:

public void methodName(File file){}
public void methodName(String string){}

如果您尝试使用methodName拨打null,则会收到错误消息,说明这是不明确的,这是可以理解的,因为它不知道要采用哪种方法。

我知道您可以投出null:methodName((String) null)但是如何创建专门用于处理调用methodName(null)的情况的方法?

这样的事情:

public void methodName(null null){}

如何创建一个必须为null的方法?

6 个答案:

答案 0 :(得分:4)

只需制作一个没有任何参数的方法。

public void methodName(){}

要求must take a null与需要总是需要5的方法或总是需要" foo"的方法相同的方法。如果传递的参数应该始终包含相同的值,则根本不需要该参数。

如果你要求的方法只要传递的参数为null就会被选中,无论它的类型如何(即下面的两个方法调用都会调用相同的重载方法),

File f = null;
String s = null;
methodName (f);
methodName (s);

这是不可能的,因为必须使用参数的编译时类型在编译时选择要使用的重载方法。在编译时,编译器无法在执行方法时知道传递的变量包含null。

答案 1 :(得分:2)

有一种类型通常用于表示null,这是Void,其唯一有效值为null

你可以写

void methodName(Void v);

通常用于通用返回类型,例如。

Future<Void> future = executorService.submit(new Callable<Void>() {
    public Void call() throws IOException {
        try(FileInputStream fis = new FileInputStream(filename)) {
            doSomething(fis);
        }
        return null;
    }
});

// later
future.get();

您可能想知道,为什么不使用Runnable,因为我们不需要return null;,但Runnable不能抛出已检查的异常,所以如果我们希望捕获IOException,我们会使用Callable在future对象中。

在Java 8中,你可以使用lambdas,但是如果抛出一个已检查的异常,编译器仍会期望返回null,因为它必须使用Callable

Future<Void> future = executorService.submit(() -> {
        try(FileInputStream fis = new FileInputStream(filename)) {
            doSomething(fis);
        }
        return null;
    });

答案 2 :(得分:0)

如果是Object ,传递的参数始终始终为null 。当你尝试在空引用上运行一个方法时,你会得到一个空指针异常。

因此,public void methodName(File file){}可以被称为methodName(null),没有例外。

然而,

public void methodName(File file) {
    file.delete();
}
如果传递null,

将导致空指针异常。

答案 3 :(得分:0)

您无法编写专门用null的方法。你必须做这样的事情:

methodName(File file) {
   if(file == null) {
      someOtherMethod();
   }
   else {
      // other stuff
   }
}

但是,只有methodName(File)句柄null更为常见,并记录它对null的作用。如果你有另外一种方法,methodName(File)someOtherMethod()都不是最终方法,你应该记录内部电话。

答案 4 :(得分:0)

你不能这样做。请记住,您可能隐含null。例如:

File file = null;
methodName(file);

但是,Java编译器必须将调用链接到特定方法签名,因此它应该在编译时知道null是否已通过。

另一方面,为什么坚持null?没有什么能阻止您定义特殊类型:

enum Null { NULL }
public void methodName(File file){}
public void methodName(String string){}
public void methodName(Null n) {}

methodName(Null.NULL); // or methodName(NULL); with import static

答案 5 :(得分:-1)

正如您所见,编译器无法解析在传递Array( [0] => Array ( [name] => View [key] => view [val] => 0 ) [1] => Array ( [name] => Add [key] => add [val] => 0 ) ) 时采用不同类型对象的两种方法。

解决这个问题的唯一方法是使用类型转换,就像你已经完成的那样,或者采用一种采用通用null类型并尝试向下转换的方法:

Object

编写看起来像这样的代码往往被视为臭,并且有充分的理由。它很快变得复杂,难以维护等等。最好的办法是进行类型转换或更改方法签名,以便您(和编译器)始终知道应该调用哪个函数来处理特定的public void methodName( Object object ) { if ( object == null ) { // do something with null } else if ( object instanceof File ) { // do something with ((File)object) } else { // do something else } } 对象。