[英]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.");
}
latitude
和longitude
局部變量不能被編譯器初始化,因為它們取決於循環中的條件語句: while (m.find()){
和while (m1.find()){
。
如何確保這些條件成立?
實際上,在聲明中將它們賦值為0
或null
不一定能解決您的問題:
Double latitude;
Double longitude;
因為您可能會提供new LatLng(latitude,longitude)
可能不正確的值。
LatLng clickedLocation = new LatLng(latitude,longitude);
應該只有在被執行的可能latitude
和longitude
在循環中發現。
您可能應該鏈接此處理:如果找到緯度和經度值,則可以使用這些參數創建一個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.