我正在准备面试,而我所经历的空指针异常,我突然意识到每一个对象在某种程度上能够抛出一个空指针异常,但我似乎无法想像某些物体像系统,输出等扔NullPointerException
。 任何人都可以提这样的场景? 谢谢!
例如: System.out.println(s.get(name));
我正在准备面试,而我所经历的空指针异常,我突然意识到每一个对象在某种程度上能够抛出一个空指针异常,但我似乎无法想像某些物体像系统,输出等扔NullPointerException
。 任何人都可以提这样的场景? 谢谢!
例如: System.out.println(s.get(name));
首先, 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,诸如方法,构造函数,或一个初始化。 -马尔科
并不是每一个对象能够抛出一个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");
一个上的操作null
对象将抛出一个NullPointerException
。 在该示例中s.get(name)
e如果s
是null
则NullPointerException
将被抛出。 由于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
是。
我希望对您有所帮助。 如果没有,请阐明在什么你正在寻找的意见。
包装类是能够投掷NPE.Although Java提供了自动装箱的,但它们不是默认不像原始数据类型初始化。
Integer r;
if(r>1)