Java中常见的错误案例

181 阅读1分钟

1. System.out.println(null)

在程序中我们使用System.out.println(null)。会在编译时报错,即无法确定传入的值是属于字符数组对象还是String对象,错误信息如下:

reference to println is ambiguous, both
method println(char[]) in java.io.PrintStream and
method println(java.lang.String) in java.io.PrintStream match

PrintStream中有3println方法接受引用类型:

  • println(char x [])
  • println(String x)
  • println(Object x)

当您通过null时,所有3都适用。方法重载规则优先使用最具体参数类型的方法,因此不会选择println(Object x)。而编译会在println(String x)println(Object x) 之间进行选择,但它们这两个函数都是具体参数类型的方法,因此编译器无法做出判断。故抛出reference to println is ambiguous错误。

char s[]=null;
System.out.println(s);

最终会抛出空指针异常,如下所示:

Exception in thread "main" java.lang.NullPointerException
    at java.io.Writer.write(Writer.java:127)
    at java.io.PrintStream.write(PrintStream.java:470)
    at java.io.PrintStream.print(PrintStream.java:620)
    at java.io.PrintStream.println(PrintStream.java:759)
    ...

最主要的原因是在java.io.Writer.write存在着对数组长度的获取,即c.length。而c本身就是一个null,故产生了NullPointerException