JavaSE中容易忽視的坑
阿新 • • 發佈:2018-10-31
基本數據 val war for 都是 java end 數據 int 1、想循環三次,這樣有啥問題?
`
因為在一個方法內部定義的變量都是存儲在 棧 中的,當這個函數結束後,其對應的棧就會被收回,此時在其方法體重定義的變量將不存在。所以 return 在返回時不是直接返回變量的值,而是復制一份,然後返回。因此,對於基本數據類型來說,在 finally 塊中改變 return 的值對返回值沒有影響,而引用類型的數據會有影響。
`
private static final int END = Integer.MAX_VALUE;
private static final int START = END - 2;
int count = 0;
for (int i = START; i <= END; i++)
count++;
System.err.println(count);`
``
開始我以為存在的問題會是 i 達到 int 的最大值後再加 1 會溢出,但是後來發現沒有拋出異常,並不是這個原因。經分析發現 : i = Integer.MAX_VALUE + 1 的時候,i = Integer.MIN_VALUE。 所以每次達到最大值再加一之後,又會從最小值開始循環,所以這個存在的問題是 死循環。
2、這個方法返回的是啥?
@SuppressWarnings("finally")
public static boolean find() {
try {
System.err.println("try:---");
return true;
} catch (Exception e) {
System.err.println("catch:---");
return true;
} finally {
System.err.println("finally:---");
return false;
}
}
這個方法最後返回的是:false。 當 finally 裏面有返回值時,會覆蓋 try 和 catch 裏面的返回值。 finally 裏面的非return 語句會在 try 和 catch 的 return 語句執行之前執行。
JavaSE中容易忽視的坑