为什么不能调用已在循环中初始化并事先声明的变量?

时间:2017-04-17 09:42:17

标签: java loops variables initialization

即。使用变量" location"和下面的经度,当然它们是在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" 

4 个答案:

答案 0 :(得分:2)

这里的问题不是可访问性。问题在于局部变量在使用之前可能无法初始化的可能性。

所有局部变量在使用之前必须初始化,在你的情况下,while循环可能不会进入。因此它应该有一个默认值。

在您的情况下,您可以使用null或零初始化它们。

 Double latitude =0;
 Double longitude =0;

答案 1 :(得分:2)

因为它们可能未初始化。两个发现都可能返回false。

答案 2 :(得分:1)

不,他们不是。如果m.find()m1.find()中的任何一个返回false,则相应的变量不会为initialised。并且Java不允许您访问变量value,除非它已初始化,因此错误。

如果您不希望代码继续进行initialised,那么您可以分配null值,如果它们仍然是IllegalArgumentExceptionnull 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."); } 例如:

$this->db->select('*');
        $this->db->group_by('column_name');
        $this->db->from('tbl_name');
        $query = $this->db->get();
        return $query->result();

答案 3 :(得分:1)

latitudelongitude局部变量不能被编译器初始化,因为它们依赖于循环中的条件语句:while (m.find()){while (m1.find()){

如何确保这些条件成立?

事实上,在声明中将它们分配给0null并不一定能解决您的问题:

Double latitude;
Double longitude;

因为您可能会向new LatLng(latitude,longitude)提供可能不正确的值。

只有在循环中找到LatLng clickedLocation = new LatLng(latitude,longitude);latitude时才应执行{p> 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{
      ...   
 }