[英]Why does casting Double.NaN to int not throw an exception in Java?
[英]Why does this Java casting throw an error?
我想知道為什么在obj = w;
之后引用“ w” obj = w;
會拋出一個錯誤。 您不是通過說obj = w來創建另一個指向該w實例的指針嗎? 即為什么與說String s = "hi"; String w = s;
類String s = "hi"; String w = s;
東西有所不同String s = "hi"; String w = s;
String s = "hi"; String w = s;
謝謝!
public class Casting {
public static void main(String[] args) {
// casting doesn't change the object
Object obj;
{
Stopwatch w = new Stopwatch();
obj = w;
}
System.out.println(obj); // this line does work
System.out.println(w); //this line does not work
}
}
沒有什么比早上引用JLS更重要。
JLS 6.3。 宣言的范圍:
塊中的局部變量聲明的范圍(第14.4節)是該聲明在其中出現的其余部分,從其自身的初始化程序開始,並在該局部變量聲明語句的右側包括其他任何聲明符。
和
JLS 14.2 方塊:
塊是括號內的一系列語句,局部類聲明和局部變量聲明語句。
在您的情況下意味着什么? 局部變量w
在塊中聲明
{
Stopwatch w = new Stopwatch();
obj = w;
}
(“自己的初始化程序”是該塊的第一行),因此它的作用域是該塊的其余部分。 對它的引用
System.out.println(w);
在代碼塊之外,因此w
將無法解析為變量。
那么局部變量obj
呢? 它在塊中聲明
public static void main(String[] args) {
Object obj;
{
Stopwatch w = new Stopwatch();
obj = w;
}
System.out.println(obj);
System.out.println(w);
}
在這種情況下是一個方法塊。 通話
System.out.println(obj);
在塊內,因此可以成功引用obj
。
這是范圍的問題。
{
Stopwatch w = new Stopwatch();
obj = w;
}
這里的w范圍在圓括號內,並且該變量在外部不可用。因此這里沒有賦值問題,但該問題與范圍有關,可以通過以下方法輕松解決
public class Casting { public static void main(String[] args) {
// casting doesn't change the object
String w;
Object obj;
{
w = new String();
obj = w;
}
System.out.println(obj); // this line does work
System.out.println(w); //this line now working } }
變量w
在塊內聲明,因此在塊外不存在。 這個問題與鑄造無關。 刪除括號,它將起作用:
public class Casting {
public static void main(String[] args) {
// casting doesn't change the object
Object obj;
Stopwatch w = new Stopwatch();
obj = w;
System.out.println(obj);
System.out.println(w);
}
}
就像在其他答案中提到的那樣,刪除括號即可。 如果要保留小節,也可以執行以下操作。 實際上,在java中,變量具有作用域,可以在聲明該變量的作用域中使用一個變量。 就像在“ if”塊或“ try”塊中聲明一些變量一樣,它只能在該范圍內使用。 這有助於有效的垃圾收集。 總是最好在最小所需范圍內定義變量。但是,如果要在某處創建某個對象,但又想在該部分(塊)之后使用它,則在塊外聲明(不需要創建對象的變量)。
public class Casting {
public static void main(String[] args) {
// casting doesn't change the object
Object obj;
Stopwatch w ;
{
w = new Stopwatch();
obj = w;
}
System.out.println(obj); // this line does work
System.out.println(w); //this line does not work
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.