Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;但是编译器没有';我不知道这一点什么';这是什么意思?_Java_Java 9 - Fatal编程技术网

Java &引用;但是编译器没有';我不知道这一点什么';这是什么意思?

Java &引用;但是编译器没有';我不知道这一点什么';这是什么意思?,java,java-9,Java,Java 9,我在java.util.ImmutableCollections类中遇到过这样的代码和注释: static final class List0<E> extends AbstractImmutableList<E> { ... @Override public E get(int index) { Objects.checkIndex(index, 0); // always throws IndexOutOfBoundsExcep

我在
java.util.ImmutableCollections
类中遇到过这样的代码和注释:

static final class List0<E> extends AbstractImmutableList<E> {
    ...
    @Override
    public E get(int index) {
        Objects.checkIndex(index, 0); // always throws IndexOutOfBoundsException
        return null;                  // but the compiler doesn't know this
    } 
    ...
}
静态最终类列表0扩展了AbstractImmutableList{
...
@凌驾
公共E-get(int索引){
Objects.checkIndex(index,0);//始终引发IndexOutOfBoundsException
返回null;//但编译器不知道这一点
} 
...
}

为什么不抛出新的IndexOutOfBoundsException(…)?原因是什么?

也许,这只是为了避免代码重复,否则它会像:

new IndexOutOfBoundsException(outOfBoundsMessage(..., ...)) 

但是
outOfBounds*
方法是
private
,因此通过设计,应该调用像
这样的包装器来返回前提条件。checkIndex(index,length,null)
除非我在这里遗漏了一些明显的东西,否则这要简单得多。这与:

// this will not compile, *even* if test throws the Exception always
public String s() {
    test(); 
}

private void test() {
    throw new RuntimeException("just because");
}
编译器无法判断
test
是否总是抛出
RuntimeException
,因此它需要
s()
中的
return
语句。枚举的
switch
语句中也会发生同样的情况,您必须提供一个
throw
;即使您已经处理了该枚举的所有案例



顺便说一句,此代码用于
List0
,在这里调用
get(x)
没有意义,因为列表中没有确定的元素。

这里的实现似乎更面向设计,而不仅仅是功能

原因可能主要是
先决条件.checkIndex
被标记为
@hospotintrisccandidate
,这意味着在内部使用此方法时,会寻求代码性能改进

另外,您可以注意到,使用的工厂方法创建的包含0(空)、1、2或N个元素的所有不可变列表都使用了,它最终依赖于上面的方法调用来进行一些内部优化


从库中简要介绍Hotspotintrisccandidate:-

@hospotintrinsicandidate
注释特定于 热点虚拟机。它表示带注释的方法可能(但不保证)由HotSpot VM内部化

如果HotSpot VM替换带注释的 具有手写程序集和/或手写编译器的方法 --编译器的内在特性--提高性能

@hospotintrinsicandidate
注释是Java的内部注释 图书馆,因此不应该与 应用程序代码


@我不是真的。。。您始终可以编写
公共字符串s(){throw new RuntimeException(“aaa”);}
什么是100%有效和可编译的代码如果您提到
@hospotintrisccandidate
您可以提到
对象的
@ForceInline
。另外,这是有趣的,因为CPU究竟是如何优化这个内在调用的;我不知道btw@Eugene
ForceInline
似乎专注于忽略带注释方法的度量,因此避免将其纳入讨论。我自己也还没有深入研究过Hotspotintrisccandidate的实现。在实现过程中没有太多可看的东西……)这只是一个注释,您必须挖掘jvm源文件,并查看该方法的具体操作……是的,避免代码重复。我们正在努力集中所有这些索引检查和异常消息构造。这不仅会影响集合实现和
数组
实用程序方法,还会影响NIO缓冲区、
CharSequence
实现等等。很多地方,很多代码重复。请注意,这是一个允许应用程序参与此中央处理的过程。尽管如此,我还是会使用
抛出新的AssertionError()
而不是
返回null这里…哦,霍尔格大师,我感谢您对我的回答和您的补充评论的赞赏。在这个问题上也非常需要你的权威意见: