与此问题相同,但对于java
更新 根据少数人的评论和回复,很明显Java几乎没有未定义的行为.
所以我想问一下什么行为不明显.请在回答时区分两者:)
与线程有关... :)
也:
重写方法并期望它们在版本之间以相同的方式使用
关于底层平台的假设(例如文件分隔符)
垃圾收集/定稿的详细信息
有关类初始化的一些细节
Integer.valueOf(等)是否返回相同的对象
性能,延迟和内存使用情况
Java中存在非常非常少的未定义行为,与C/C++相比,它是一个更加明确的平台.这样做的原因是C/C++编译器旨在为非常不同的平台生成代码,因此被授予相当宽的自由度,以防止过于严格的要求会迫使编译器为给定平台生成次优代码.
Java通过以非常精确的方式定义几乎所有行为并且仅允许很小的自由度来牺牲其中一些.这当然使平台更容易处理.
发生未定义行为的主要区域是多个线程的确切时间和调度(正如Tom Hawtin已经提到的那样).
有几个行为不明显的地方,'但是,它可能看起来未定义,但不是(Oscar Reyes给出的字符串比较示例是一个很好的例子).
并且行为被定义为未定义的一些地方(例如,HashMap中的元素的顺序被定义为依赖于实现并且不需要是常量的).
我认为Java(TM)Puzzlers:陷阱,陷阱和角落案例书非常有用,它解释了java的许多隐藏点和未定义的行为.