在Java中取消引用'null'时是否可能产生未定义的行为? P>我刚刚知道,C和C++中的撤销代码 null 有时会产生。这对我来说非常有趣,就像所有奇怪的编程行为一样(我曾经有人告诉我,他们在合法的生产环境中调试了“损坏的RAM-程序没有按编写的方式运行”)。因为我主要是一名Java开发人员,所以我想知道在这种语言中是否也可能发生这种情况
JLS没有具体说明如何实现在Java中取消引用'null'时是否可能产生未定义的行为? P>我刚刚知道,C和C++中的撤销代码 null 有时会产生。这对我来说非常有趣,就像所有奇怪的编程行为一样(我曾经有人告诉我,他们在合法的生产环境中调试了“损坏的RAM-程序没有按编写的方式运行”)。因为我主要是一名Java开发人员,所以我想知道在这种语言中是否也可能发生这种情况,java,memory,null,nullpointerexception,Java,Memory,Null,Nullpointerexception,JLS没有具体说明如何实现null引用(,),因此我不太确定。但是我想,通过直接使用。不幸的是,我对JVM的内部工作没有足够的了解,不知道这是否可行 如果这是可能的,那么恶意程序也有可能这样做,这将引发一个有趣的安全问题 因此:Java在取消引用null时是否可能有未定义的行为,而不是简单地抛出NullPointerException?JLS没有具体说明如何实现null引用,但它指定了它的行为。换句话说,不存在未指明的行为。如果您遇到JLS中未指定的行为,则这是一个错误 让我澄清一下:您可以使用
null
引用(,),因此我不太确定。但是我想,通过直接使用。不幸的是,我对JVM的内部工作没有足够的了解,不知道这是否可行
如果这是可能的,那么恶意程序也有可能这样做,这将引发一个有趣的安全问题
因此:Java在取消引用
null
时是否可能有未定义的行为,而不是简单地抛出NullPointerException
?JLS没有具体说明如何实现null引用,但它指定了它的行为。换句话说,不存在未指明的行为。如果您遇到JLS中未指定的行为,则这是一个错误
让我澄清一下:您可以使用本机代码来丢弃某些结构,让JVM崩溃,但这与任何Java行为都无关。但是在典型的JVM实现中,null
行为的实现是您最不可能干扰的。重要的是,如果您从本机代码重写任意内存,您将丢弃什么并不重要
“未指定的行为”意味着规范本身允许在结果行为中存在差异。Java的情况并非如此。在纯Java中,无法从
null
中获得未定义的行为(除非JVM中存在严重错误!)。JLS规定,任何显式或隐式取消引用null
的尝试都将导致NullPointerException
。不存在允许任何与处理null
相关的未定义行为的回旋空间
但是,如果您的应用程序包括。。。或者利用native
方法,其中一个方法可能错误处理null
,导致未定义的行为。您还可以使用Unsafe
类获得未定义的行为。但这两种情况都意味着您没有使用纯Java。(当您脱离纯Java时,JLS的保证不再适用!)
(在多线程中可能会发生不可预测的事情。但即使如此,也定义了一组可能的行为。例如,如果没有充分同步状态共享,则可能会在字段中看到过时的值。但不会看到完全随机的值…或导致分段冲突的错误地址。)
如果这是可能的,那么恶意程序也有可能这样做,这将引发一个有趣的安全问题
恶意程序几乎可以做任何事情。但正确的处理方法是在沙箱中执行您不信任的代码(即,可能是恶意代码)。典型的沙盒将禁止调用
不安全的或加载本机库。。。以及恶意程序可能利用的许多其他东西。该行为定义如下:
否则,将调用一个实例方法,并且存在一个目标
参考资料如果目标引用为null,则会生成NullPointerException
此时抛出。否则,目标引用称为引用
指向目标对象,并将用作关键字this的值
在调用的方法中。调用的其他四种可能性
然后考虑模式
DERealEngult NULL应该引发Null PoExtExistExist.< /P> < P>非常有定义的语言特征的概念是C和C++标准的作者用来说明标准不需要任何特定行为的东西。这给C和C++的各种实现者做了对于实现的特定硬件或操作系统来说最有效或最方便的事情。这是因为C总是优先考虑性能而不是可移植性。但Java的优先级正好相反;它早期的口号是“写一次,到处跑”。因此Java语言规范不讨论未定义的行为,而是努力定义所有语言特性的行为
您似乎认为在某些情况下使用空引用可能会损坏内存。我认为您将C/C++指针与Java引用混淆了。指针本质上是一个内存地址:通过将其强制转换为void*
并解除对它的引用,您可以不受限制地损坏内存内容。Java引用与内存地址不同,因为垃圾收集器必须能够自由地将对象移动到内存中的不同位置。Java引用到内存地址的转换是只有JVM才能完成的事情;它永远不可能是Java程序本身能够做的事情。由于此转换完全由JVM控制,JVM可以确保转换始终有效,并且始终指向它应该指向的对象,而不是其他对象。取消引用null是什么意思?类似于null.doSomething()代码>在Java中是非法的。无法取消对Null的引用。否。除非在某些奇怪的情况下,您以某种方式引发某些系统例程内部的行为,否则NullPointerException及其周围的环境是定义良好的。@Radiodef-I可以String x=null;x、 charAt(0)代码>@HotLicks你能帮我吗