return null 和抛出异常有什么区别?

what is different between return null and throw exception?

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}

这个方法有一个 IBinder 作为 return 值,但它只是抛出一个异常,我的问题不是关于服务,我的问题是为什么这个方法不显示编译器错误?

如果我们写 return null(如果我们不想实现这个方法)或者我们写 throw exception 有什么不同?

return null return 为空值。 throw new 您抛出的任何异常都会中止方法的执行并引发指定类型的异常。在这种情况下抛出异常不会显示编译器错误,因为如果这是您唯一要做的事情,那么您永远不会 return 任何事情,这也是有效的。例如,如果异常是在 if/else 的分支中抛出的,则需要在另一个分支中抛出异常或 return 一个值,否则编译器会提示错误你必须 return 一个 IBinder.

类型的值

通常,抛出异常更好,因为它比 returning null 提供更多信息,而且因为调用代码不能简单地忽略 returned 值到随后的无信息 NullPointerException。

但是,the documentation for onBind 明确表示可以 return null。由于这就是 API 的设计方式,因此在这种特殊情况下 return null 比抛出异常更有意义。

一般来说,抛出异常更好,因为它可以防止调用代码在操作实际上没有成功时假设可以继续,就好像操作成功了一样。但在这种情况下,当操作不受支持时,该方法实际上应该 return null(我认为这不是一个好的设计决策)。