1.为什么方法里只要有while循环就可以不用返回值,而且必须是while,for循环就不行private String abc(){
while(true){
}
}
2.jdk1.5开始增加了范型,为什么数组不支持范型,数组的范型检查警告该如何消除(请别说用@SuppressWarnings("unchecked"))
List[] listArray = new List[]{new ArrayList<String>(), new ArrayList<String>()};
listArray[0].add("0");
listArray[1].add("1");
while(true){
}
}
2.jdk1.5开始增加了范型,为什么数组不支持范型,数组的范型检查警告该如何消除(请别说用@SuppressWarnings("unchecked"))
List[] listArray = new List[]{new ArrayList<String>(), new ArrayList<String>()};
listArray[0].add("0");
listArray[1].add("1");
public static String abc(){
for(;true;){
}
}
2、baidu了一下,IBM网站有篇文章,建议楼主去看看。
大概的意思是:
“在这里可以看到一种模式 —— 与泛型有关的很多问题或者折衷并非来自泛型本身,而是保持和已有代码兼容的要求带来的副作用。”
如3,4楼所说,1可能是由于死循环引起的至于2
LZ试下这段代码List<String>[] listArray = (ArrayList<String>[])new List[2];
listArray[0].add("0");
listArray[1].add("1");
除非改成List<String>[] listArray = (List<String>[])new List[2];但是范型检查警告又出来了
http://www.ibm.com/developerworks/cn/java/j-jtp01255.html
boolean b = true;
while(b){ }
}
虽然很明显,但是编译器可能只会认保留字true这个吧
要是把while中的条件不直接用(true)而用变量表示,他就会提示错误。
哈哈!
if (val > 0) {
return "valid";
} else {
throw new RuntimeException();
}
}
使用了变量,虽然很明显上面是true,也是需要程序运行时才可能确定,编译时它只是个boolean类型的变量,什么也不代表java的异常机制分为已检查异常和未检查异常,这个RuntimeException是未检查异常,所以编译器是不会强制要求必须捕获的,
同时它也知道如果抛出了这个异常,要么整个程序终止,要么由调用它的方法来捕获,这个方法是不可能再继续执行下去了,所以不需要返回值的。
eclipse其实也是靠编译器提示出来的。
如果加上return的话就是Unreachable code,其实不管下面加什么,结果都是一样的。
final boolean b = true;
while(b){ }
}虽然都是使用了b,但是编译器判断出不加final的b有可能被改变,所以是否形成死循环是不确定的,
而加了final的b已经确定会造成死循环。将代码再做些修改 private static final boolean B = true;
public static String abc(){
final boolean b = B; while(b){ }
}同样证明了刚才的说法,将B的final去掉,或不进行初始化,B就会具有不确定性,无法造成死循环,因此出错将代码再做些修改 public static String abc(){
final boolean b = getB(); while(b){ }
} private static boolean getB(){
return true;
}b由方法getB取得,getB是私有的,显然具有唯一性,返回的也是确定的true,那么按理b也应该是确定的,
但遗憾的是编译器告诉我们abc需要返回值,也就是他判断的结果是b是不确定的,不知道是true还是false.我们再做些改变 public static String abc() {
final boolean b = ClassB.BB; while (b) { }
} private class ClassB {
private static final boolean BB = true;
}这回b的值由ClassB的常量BB提供,编译通过了,将BB的final去掉或是不进行初始化都无法通过。
看来编译器只能判断到常量字段,到了方法这一级别它就会认为具有不确定性。
你可以尝试 while(false) 看看ide会不会报错-- 这个不是java语法的问题
怎么能说“这个不是Java语法的问题”呢?
看来这个问题连编写jdk的sun的技术者也无法解决,只能先这么摆着了。另外感谢angues1980石头心提供的资料,很实用的!并且期待你对虚拟机的研究成果。
_____________________________[size=30px]o(∩_∩)o 哈哈[/size]
深有同感
所以,这个问题不是“可以不返回值”,而是“不能返回”,也就是说,在死循环后面加上返回是错的,因为这里的返回语句是永远执行不到的。语句永远不被执行的情况有几种:出现在明确的死循环之后,出现在明确的return语句之后,出现在明确的异常抛出语句之后。
这里的“明确的”意思是编译器可以确定的,基于这个规则,下面的代码都不能编译:int f() {
return 0;
System.out.println("never reach here!"); // won't compile!
}int g() {
while(true); // or equally, for(;;) ;
return 0; // won't compile!
}int h() {
throw new RuntimeException();
return 0; // won't compile!
}但是,编译器毕竟不是完全智能的,很多可以“明确”的情况下,它也可能置之不理。如if(true)后面的return语句和throw语句,有变量参与的死循环等等。编译器的职责是检查语法错误,而不是语义错误,JAVA编译器管得比较宽,但依赖编译器来检查语义错误总是不可取的。
((ArrayList<String>)listArray[0]).add("0");
((ArrayList<String>)listArray[1]).add("1");
但如果我把写法改一下你又该如何转型呢?ArrayList[] listArray = new ArrayList[]{new ArrayList<String>(), new ArrayList<String>()};
数组的类型是需要在编译时确定的,所以,创建“泛型数组”就意味着要编译器把这个泛型对象留给JVM去解释,违背了“类型消除”的原则。所以,“泛型数组”是不存在的。
自己再继承arraylist再转呗........
final boolean b = getB(); while(b){ }
} private static boolean getB(){
return true;
}此段代码无法造成次循环 b还是不能确定的 为什么呢?