【问题标题】:Java - passing null as an argument to print()Java - 将 null 作为参数传递给 print()
【发布时间】:2013-02-09 03:40:36
【问题描述】:

我想知道为什么下面的代码不起作用:

System.out.print(null);    
response.getWriter().print(null);

但下面的工作:

String s = null;
System.out.print(s);
response.getWriter().print(s);

传递null 与传递引用为null 有什么区别?

已编辑:前面提到的不起作用表示编译错误。

【问题讨论】:

  • 定义“不起作用”。
  • 有趣。我想只传递一个null 就可以了,这样程序就会把它当作什么都没有,而通过一个引用传递一个null 是可行的,因为它基本上表明变量本身没有价值。
  • 初始 null 未绑定到对象。第二个是包含空数据的字符串。这可能会返回与编译器可以接受的 "" 相同的结果
  • “不工作”==“不编译”或“不工作”==“不运行”?
  • @RyanS 空字符串与空字符串明显不同。

标签: java reference outputstream


【解决方案1】:

这是因为您可以传递 ObjectString。由于null两者都适合,编译器不知道使用哪个方法,导致编译错误。

方法定义:

相反,如果您提供ObjectString 变量(即使它具有null 值),编译器就会知道使用哪种方法。

编辑:更好地解释in this answer。至于指向Java规范的内部链接,你可以阅读here,这里适合这种情况:

非正式的直觉是一个方法比另一个方法更具体**如果第一个方法处理的任何调用可以传递给另一个方法而不会出现编译时类型错误。

可能没有一种方法是最具体的,因为有两种或多种方法是最具体的。

【讨论】:

  • 这叫做“重载”
  • 我不认为它可能是,但也不是。 System.out.println() 期望非空值。
  • @Raufio 如果您测试 OP 提供的第二个代码块(没有 response... 部分),在一个简单的 public static void main(String[] args) 方法中,程序将打印 null 和终止没有问题。
  • @Luiggi:编译器真的那么模棱两可吗?由于 null 是 Java 中已定义的关键字,因此编译器的设计者知道,如果它为 null,他们必须打印 null,不管它是 String 引用还是 Object 引用! Null 与类无关!!
  • @LuiggiMendoza 这是为了更深入地了解错误是如何发生的,而不仅仅是它的表面水平。
【解决方案2】:

这是因为System.out.println() 期望某种类型的东西。 null 没有类型,因此不能单独输出。这显示为:

不起作用:

 System.out.println(null);

作品:

 System.out.println((String)null);
 System.out.println((char[])null);
 System.out.println((Object)null);

是编译器对方法调用的参数进行类型检查。

【讨论】:

    【解决方案3】:

    谢谢大家的回答。根据您的意见,我自己编写了答案。似乎调用 System.out.print(null) 对编译器来说是模棱两可的,因为 print(null) 这里会找到两个最佳的特定匹配,即 print(String)print(char[]) 。所以编译器无法确定在这里调用哪个方法。
    小例子是:

    private void methodCall(String str) {
    }
    
    private void methodCall(char[] ch){
    }
    

    现在这段代码变得模棱两可:methodCall(null)

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 2013-02-27
      • 2014-11-17
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2018-10-20
      相关资源
      最近更新 更多