A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王红潮 中级黑马   /  2012-9-5 19:35  /  1770 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王红潮 于 2012-9-7 18:35 编辑

/*
需求:产生25个int型随机数,对于每一个随机值,使用if-else语句来将其大于、小于或等于紧随他而随机产生的值。
*/
import java.util.*;
class RandomTest
{
public static void main(String[] args)
{
  Random r = new Random();
  int z;//在此初始化z的话,不会提示错误
  for (int x=0; x<25; x++)
  {
   int y = r.nextInt(100);
   System.out.println(y);
   //前面未对z进行初始化,但在此执行z=y;语句,也不会出现错误
   if (x>=1)
   {
    if ((y-z)>0)//为什么会在此处提示错误:可能尚未初始化变量z?
     System.out.println(y+"大于"+z);
    else if ((y-z)==0)
     System.out.println(y+"等于"+z);
    else
     System.out.println(y+"小于"+z);
   }
   z=y;//在此处执行该语句编译出错
  }
}
}

后面不是把y的值赋值给z了吗,为什么海会提示错误呢?

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
import java.util.*;
class RandomTest {
public static void main(String[] args) {
  Random r = new Random();
  int z = 0;//*****楼主在这里要对变量z进行初始化,int z = 0******
  for (int x = 0; x < 25; x++) {
   int y = r.nextInt(100);
   System.out.println(y);
  
   if (x >= 1) {
    if ((y - z) > 0)
     System.out.println(y + "大于" + z);
    else if ((y - z) == 0)
     System.out.println(y + "等于" + z);
    else
     System.out.println(y + "小于" + z);
   }
   z = y;
  }
}
}


局部变量必须进行初始化,否则会报编译错误

回复 使用道具 举报
楼主要澄清两个变量: 成员变量 和 局部变量

1.成员变量可以不进行初始化(被final修饰且没有static的必须显式赋值),但是局部变量必须进行初始化。

在这里z是局部变量,你没有初始化,所以报错了。
回复 使用道具 举报
杨卫腾 发表于 2012-9-5 20:08
楼主要澄清两个变量: 成员变量 和 局部变量

1.成员变量可以不进行初始化(被final修饰且没有static的必须 ...

但是上面那儿不初始化,在
System.out.println(y);
   //前面未对z进行初始化,但在此执行z=y;语句,也不会出现错误
   if (x>=1)

进行z=y;操作的话,并不报错
回复 使用道具 举报
王红潮 发表于 2012-9-5 20:17
但是上面那儿不初始化,在
System.out.println(y);
   //前面未对z进行初始化,但在此执行z=y;语句,也不 ...
  1. import java.util.*;
  2. class RandomTest
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Random r = new Random();
  7.                 int z;//在此初始化z的话,不会提示错误
  8.                 for (int x=0; x<25; x++)
  9.                 {
  10.                         int y = r.nextInt(100);
  11.                         System.out.println(y);
  12.                         z=y;//在此处执行该语句编译出错
  13.                         //前面未对z进行初始化,但在此执行z=y;语句,也不会出现错误
  14.                         if (x>=1)
  15.                         {
  16.                                 if ((y-z)>0)//为什么会在此处提示错误:可能尚未初始化变量z?
  17.                                 System.out.println(y+"大于"+z);
  18.                                 else if ((y-z)==0)
  19.                                 System.out.println(y+"等于"+z);
  20.                                 else
  21.                                 System.out.println(y+"小于"+z);
  22.                         }                       
  23.                 }
  24.         }
  25. }
复制代码
回复 使用道具 举报
import java.util.*;
class RandomTest
{
public static void main(String[] args)
{
  Random r = new Random();
  int z;      //在此初始化z的话,不会提示错误
  for (int x=0; x<25; x++)
  {
  
   int y = r.nextInt(100);
   System.out.println(y);
          //  z=y前面未对z进;行初始化,但在此执行z=y;语句,也不会出现错误
   if (x>=1)
   {
    if ((y-z)>0)     //为什么会在此处提示错误:可能尚未初始化变量z?
     System.out.println(y+"大于"+z);
    else if ((y-z)==0)
     System.out.println(y+"等于"+z);
    else
     System.out.println(y+"小于"+z);
   }
   z=y;        //在此处执行该语句编译出错
  }
}
}
楼主按照程序运行思想看了,的确程序无论如何都要产生一个随机数 y,并将y赋给局部变量z,但是java是强类型语言,编译时的时候,编译器要由上到下按照顺序检查语法错误,这个时候如果不在if((y-z)>0)这条语句之前对z进行初始化,分配内存空间,这个变量z是不能用的。

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
其实是未对局部变量初始化就使用的错误,变量一定是要先初始化,然后才使用的
成员变量在定义时,会有默认的初始化值
而局部变量就必须自己定义初始化值,才能够对该变量进行操作.
楼主可以看以下代码解释:z=y,其实就是对z进行初始化,初始化在使用z之前,就是正确的,初始化在z使用之后,就是错误的.

import java.util.*;
public class Demo4 {

public static void main(String[] args)
{
  Random r = new Random();
  int z;//在此初始化z的话,不会提示错误

  for (int x=0; x<25; x++)
  {
   int y = r.nextInt(100);
   System.out.println(y);
  
   z=y;//z=y,是将y的值赋给了z,所以这时候其实相当于对z进行初始化(因为y已经获得了一个随机数),所以不会报错   if (x>=1)
   {
    if ((y-z)>0)//在这里执行的z,必须先对其进行初始化     System.out.println(y+"大于"+z);
    else if ((y-z)==0)
     System.out.println(y+"等于"+z);
    else
     System.out.println(y+"小于"+z);
   }
//z=y;如果在这里才将y值赋给z的话,由于上面已经在使用z,相当于先使用局部变量z,再对其进行初始化,故会报错  }
}
}

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
庄星睿 发表于 2012-9-5 20:44
import java.util.*;
class RandomTest
{

明白了,在编译器运行的时候,由上到下所有语句都要检查语法错误,但并不对if(x>=1)进行判读,所以,作为局部变量必须要在用到该变量之前对其进行初始化,谢谢啊!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马