簡體   English   中英

為什么不能調用已在循環中初始化並事先聲明的變量?

[英]Why can't you call a variable that has been initialised in a loop and declared beforehand?

即與下面的變量“位置”和經度,確定它們是在while循環中初始化的嗎?

String calledAddress = intent.getStringExtra("address");
Pattern p = Pattern.compile("latitude=(.*?),hasLongitude");
Matcher m = p.matcher(calledAddress);
Double latitude;
Double longitude;
while (m.find()){
    latitude = Double.parseDouble(m.group(1));
}

Pattern p1 = Pattern.compile("longitude=(.*?),phone");
Matcher m1 = p1.matcher(calledAddress);

while (m1.find()){
    longitude = Double.parseDouble(m1.group(1));
}

LatLng clickedLocation = new LatLng(latitude,longitude); // ERROR HERE "latitude/longtitude may not have been initialised" 

這里的問題不是可訪問性。 問題在於局部變量可能在使用前可能未初始化。

在使用所有局部變量之前,必須對其進行初始化,在您的情況下,while循環可能不會進入內部。 因此,它應該具有默認值。

在您的情況下,可以將它們初始化為null或零。

 Double latitude =0;
 Double longitude =0;

因為它們可能未初始化。 兩者都可能返回false。

不,他們不是。 如果m.find()m1.find()返回false,則不會initialised相應的變量。 Java不允許您訪問變量的value除非對其進行了初始化,因此會出現錯誤。

如果您不希望代碼在未initialised繼續執行,則可以分配null值,如果它們仍為null ,則拋出IllegalArgumentException ,例如:

Double latitude;
Double longitude;
while (m.find()){

    latitude = Double.parseDouble(m.group(1));

}

Pattern p1 = Pattern.compile("longitude=(.*?),phone");
Matcher m1 = p1.matcher(calledAddress);

while (m1.find()){

     longitude = Double.parseDouble(m1.group(1));

}
if(null == latitude || null == longitude){
    throw new IllegalArgumentException("Invalid Pattern. Both longitude and latitude must be present.");
}

latitudelongitude局部變量不能被編譯器初始化,因為它們取決於循環中的條件語句: while (m.find()){while (m1.find()){

如何確保這些條件成立?

實際上,在聲明中將它們賦值為0null不一定能解決您的問題:

Double latitude;
Double longitude;

因為您可能會提供new LatLng(latitude,longitude)可能不正確的值。

LatLng clickedLocation = new LatLng(latitude,longitude); 應該只有在被執行的可能latitudelongitude在循環中發現。
您可能應該鏈接此處理:如果找到緯度和經度值,則可以使用這些參數創建一個LatLng實例。
否則,您應該處理這種丟失的數據情況。

例如 :

 Double latitude = null;
 Double longitude = null;

 while (m.find()){    
       latitude = Double.parseDouble(m.group(1));    
 }

 Pattern p1 = Pattern.compile("longitude=(.*?),phone");
 Matcher m1 = p1.matcher(calledAddress);

 while (m1.find()){    
      longitude = Double.parseDouble(m1.group(1));    
 }

 // successful case
 if (latitude != null && longitude != null){
      LatLng clickedLocation = new LatLng(latitude,longitude); 
        ...
 }
 // unsuccessful case
 else{
      ...   
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM