0

下面是代码片段,我很困惑。方法的返回类型是 int ,所以该方法不能返回 null。但是,当我取消注释第一个返回语句和注释第二个返回语句时,方法的甚至没有显示任何错误警告。我很困惑这背后的原因是什么。我使用的是 java 版本 7。

 protected int calculateLogicalPageRangeForTitles(String logicalpage) throws Exception {
     //return StringUtils.isNumeric(logicalpage) ? Integer.parseInt(logicalpage) : null;
     return null;
 }
4

7 回答 7

3

该代码是合法的并且可以编译。

请参阅 Java 规范: http ://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.25

如果第二个和第三个操作数之一是空类型,另一个是引用类型,那么条件表达式的类型就是那个引用类型。

这意味着,?: 的结果将是一个整数,它将被拆箱为 int。此拆箱将引发 NullPointerException。

于 2013-01-22T13:31:25.033 回答
1

此语句仅返回一个int. parseInt返回一个int并且0是一个int

return StringUtils.isNumeric(logicalPage) ? Integer.parseInt(logicalPage) : 0;
于 2013-01-22T12:43:39.033 回答
1

第一个return声明

return StringUtils.isNumeric(logicalPage) ? Integer.parseInt(logicalPage) : 0;

总是返回一个int值(或异常)。该方法也Integer.parseInt()返回一个原始int值。因此不会显示错误或警告。

然而,第二个声明,

return null;

尝试返回原始返回类型的null值,该值无效并因此导致编译器错误。int

于 2013-01-22T12:44:24.603 回答
0

您的第一行也无效。如果结果为假并尝试返回该null值,则会引发异常。

如果你把代码写成一个冗长的 if 语句,它会给你错误。喜欢:

if (StringUtils.isNumeric(logicalpage){
    return Integer.parseInt(logicalpage);
}else{
    return null;
}
于 2013-01-22T13:00:53.993 回答
0

那是因为parseInt返回一个 int (原始类型),它与您的方法的签名相匹配。

null另一方面,它与原始 int 不兼容,这就是您遇到错误的原因。

于 2013-01-22T12:43:46.153 回答
0

因为您的第一条语句将始终返回一个int. 所以它编译。

但是第二条语句返回null的是Object类型。如果您的返回类型是Integer而不是,这将编译int

于 2013-01-22T12:43:47.173 回答
0

int 是一个原始的......因此它必须有一个值。null 是一个值,告诉我们(对类的)引用不引用任何实例。

于 2013-01-22T12:44:42.563 回答