什么在哪里系统对象可能抛出一个空指针异常的情景?(what are the scenarios wh

2019-09-29 06:03发布

我正在准备面试,而我所经历的空指针异常,我突然意识到每一个对象在某种程度上能够抛出一个空指针异常,但我似乎无法想像某些物体像系统,输出等扔NullPointerException 。 任何人都可以提这样的场景? 谢谢!

例如: System.out.println(s.get(name));

Answer 1:

首先, System是不是一个对象。 这是一类,它的方法是静态的。 其次, out是类,它是(最初)一个到标准输出参考的静态域PrintStream 。 您可以在更改PrintStream到自己与System.setOut(PrintStream)

最后,如果你做了

System.setOut(null);
System.out.println("42"); // because out is now a null reference 

你会得到一个NullPointerException

当然,你可以找到的方法, System抛出一个NullPointerException也是如此。

其中大多数的NullPointerException是由JVM当您尝试取消引用抛出null对象引用。

你不提领一类。

仅可执行代码可以抛出NPE,诸如方法,构造函数,或一个初始化。 -马尔科



Answer 2:

并不是每一个对象能够抛出一个NullPointerException的。 它通常最好尝试写类,不能!

public class ClassThatCannotNPE {

     public int getOne() {
         return 1;
     }
}

只有两件事情,你可以用上面的类做的,是要运行它的构造,并调用getOne()。 无论这些东西可以NPE。

我们必须小心地定义什么我们通过说“东西”抛出异常的意思。 此代码将在第2行抛出NPE:

Date d = null;
System.setProperty("now",d.toString());

但是,这不是从系统系统的例子,或代码,抛出异常。 上面的代码等同于:

Date d = null;
String temp = d.toString();
System.setProperty(temp);

这也将在第2行抛出一个NPE - System.setProperty()得到一个机会运行之前。 执行顺序是完全一样的前面的例子。

关于什么:

System.out.print(null);

这将抛出NPE。 但再次,它不是从系统的投掷它的代码。 它相当于:

PrintStream temp = System.out;
temp.print(null);

在NPE发生在2号线 - 这并不是指系统也没有任何指系统。


System是一类,而不是一个对象。 它不会有一个构造函数,因此不能被实例化。

然而,它有很多的静态方法。 是否有可能作出任何那些抛出NullPointerException?

其实,我们可以通过观察找出很快Javadoc文档系统 ,并搜索“空指针异常”。 许多的第一场比赛是在System.arraycopy() :

如果dest为null,则抛出NullPointerException异常。

所以你有它:

System.arrayCopy(null,0,null,0,0);

...会造成一些系统类的代码抛出NPE。


事实上,我们可以看一下对系统实际的源代码 ,看看它抛出NullPointerException异常。

488       public static native void arraycopy(Object src,  int  srcPos,
489                                           Object dest, int destPos,
490                                           int length);

哦。 arraycopy原产 - 这意味着实际执行是在JRE一些C代码。 还有什么,我们可以找到?

825       private static void checkKey(String key) {
826           if (key == null) {
827               throw new NullPointerException("key can't be null");
828           }
...

777       public static String setProperty(String key, String value) {
778           checkKey(key);
...

因此,另一种方式来从系统使代码抛出NPE是:

System.setProperty(null,"value");


Answer 3:

一个上的操作null对象将抛出一个NullPointerException 。 在该示例中s.get(name) e如果snullNullPointerException将被抛出。 由于System是一个class ,静态参考将不能为空。 查看源,你可以看到, out是静态的, final ,并最终用下面的命令初始化。

setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));

通常情况下,因为它是final ,这意味着它不会是null ,不能进行null 。 然而public static void setOut(PrintStream out)调用本地函数private static native void setOut0(PrintStream out) ,其中实现VM可以创建一个空引用。

这取决于方法它是否会抛出一个实施NullPointerException 。 具体println(String)在变量传递的操作之前会做一个空检查。

public void print(String s) {
    if (s == null) {
        s = "null";
    }
    write(s);
    }

因此,在这种情况下,方法本身不应该抛出一个NullPointerException ,只要PrintStream正确初始化它在的情况下, System是。

我希望对您有所帮助。 如果没有,请阐明在什么你正在寻找的意见。



Answer 4:

包装类是能够投掷NPE.Although Java提供了自动装箱的,但它们不是默认不像原始数据类型初始化。

Integer r;
if(r>1)


文章来源: what are the scenarios where System object might throw a null pointer exception?