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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 1312564637 中级黑马   /  2015-10-14 12:15  /  11500 人查看  /  57 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
局部变量用的时候必须给他初始值,可为什么有的局部变量只定义不给他初始化也没事,有的就会报错呢

57 个回复

倒序浏览
不知道你具体指的是哪些??
有些可能是有默认值的,譬如int 类型默认为0   等
有些没有初始值  例如 String   或者一些class 类这样的直接使用就会出现空指针异常,所以会需要你给一下初始值

点评

成员变量int的默认初始值为零,局部变量,也就是在方法里的变量是没有初始值的,要用必须给付值,可有的时候不付值也没事,可有时候不付值就会报错   发表于 2015-10-14 12:49
回复 使用道具 举报
徐慧shanghai 发表于 2015-10-14 12:37
不知道你具体指的是哪些??
有些可能是有默认值的,譬如int 类型默认为0   等
有些没有初始值  例如 Strin ...

                int a;
                if(a>100){
                       
                }
               
                int b;
                b=10;

譬如这样的两种写法
第一种会抱错,
因为你这个a 其实没有对他进行赋值,就对他进行判断,那虽然语法上不错,但是却是完全没有意义的,因为a 的值都没有给过就直接要使用,这样java认为不对
                int a;
                a=100;
                if(a>100){
                       
                }
这样写它就认为对了,至少你使用过一次a的值

至于b 这样直接赋值而不是使用b的值,它认为是没有问题的

觉得好难解释
回复 使用道具 举报
public static void main(String[] args) {
                //isZhi(13);
                isZhi(96);
        }
        //此函数可判断传入的数是否为质数
    public static void isZhi(int a){
            Boolean flg=true;
           
            for(int i=2;i<a-1;i++){
                    if((a%i)==0){
                            flg=false;
                            break;
                    }                       
            }
这段代码如果你光给flg定义不赋值,就出错
回复 使用道具 举报
public static void main(String[] args) throws IOException {
       FileInputStream fi=new FileInputStream("E:\\exam");
       ByteOutputStream b=new ByteOutputStream();
       int len;
      
       while((len=fi.read())!=-1){
               b.write(len);
       }
       System.out.println(b);
        }
而这段代码的len 你给他赋值还是不赋值都不会出错, 只有是局部变量,我一般都会给他赋值,肯定不会出错
回复 使用道具 举报
上面的代码可能输出的结果不正确,因为传的是字节,中间需写的时候需转换一下

        private static void io() throws FileNotFoundException, IOException {
                FileInputStream fi=new FileInputStream("a.txt");
                   int b=8;
                   while((b=fi.read())!=-1){
                           System.out.println((char)b);
                   }
                                  
                   fi.close();
        }给你这段代码,其中的b,你付任何值,结果都不会变,因为后面又重新给他赋值了,而且你不赋值也没事
回复 使用道具 举报
1312564637 发表于 2015-10-14 14:50
上面的代码可能输出的结果不正确,因为传的是字节,中间需写的时候需转换一下

        private static void io()  ...

你说的这些情况不是说没有赋值,你可以去看看,8种基本数据类型其实它都是有默认值的,而报错的那些变量,都是非基本数据类型的,像你上面提到的Boolean类型,是8种基本类型的boolean类型的对象类型,如果你把那个变量换成boolean的话,就不会报错了,这种情况报的错都是空指针异常,你可以用下面的代码查看到8种基本数据类型的默认值
int  num;
System.out.println(num);
打印他的值,你会看到他们都是有默认值的
Boolean bool;
System.out.println(bool);
打印这个对象它是会输出NULL
当你在操作一个空对象的时候,他是会报异常的。
回复 使用道具 举报
上面没赋值,可底下不是又给他符了值了吗,管他呢,反正局部变量给他赋上值肯定没错
回复 使用道具 举报
1312564637 发表于 2015-10-14 15:28
上面没赋值,可底下不是又给他符了值了吗,管他呢,反正局部变量给他赋上值肯定没错 ...

public static void main(String[] args) {
                //isZhi(13);
                isZhi(96);
        }
        //此函数可判断传入的数是否为质数
    public static void isZhi(int a){
            Boolean flg=true;
           
            for(int i=2;i<a-1;i++){
                    if((a%i)==0){
                            flg=false;
                            break;
                    }                       
            }
这段代码如果你光给flg定义不赋值,就出错

这个地方,刚开始没赋值,下面运行的代码也必须是a%i==0的时候才会给他赋值,如果一但没有进入这个条件,其实flg还是没赋值的,没赋值flg=null,操作null的时候就会异常

点评

对对,没想到  发表于 2015-10-14 15:52
对对,没想  发表于 2015-10-14 15:50
回复 使用道具 举报
public static void isZhi(int a){
            Boolean flg=true;
           
            for(int i=2;i<a-1;i++){
                    if((a%i)==0){
                            flg=false;
                            break;
                    }                       
            }
            if(flg)
                    System.out.println("您输入的是质数");
            else
                    System.out.println("您输入的不是质数");
    }
}
代码没有粘贴权,, flg是判读他是否是质数的一个标识符
回复 使用道具 举报
FTD 中级黑马 2015-10-14 21:47:31
11#
因为在内存中,你可能会分配到没有垃圾值得区域,但是当你分配到其他程序或者你自己的遗留下来的垃圾值得时候,就会用那个啦.当时初始化的时候九不会有这些不必要的麻烦啦.(就好像你去一个宿舍住宿,原来的人可能会留下一些垃圾在你宿舍,也有可能是一处没有被住过的~~)
回复 使用道具 举报
本帖最后由 VV烽火 于 2015-10-14 22:55 编辑
1312564637 发表于 2015-10-14 14:28
public static void main(String[] args) {
                //isZhi(13);
                isZhi(96);


这个位置你不给flg赋值肯定出错啊,不过如果你if下面还有else语句flg=true;上面就可以不给flg设置初始值,因为在编译的时候java虚拟机会检查赋值,if有判断条件没给它赋值,最终else会给他赋值,所以能编译过。
public static void isZhi(int a){
            Boolean flg;
            
            for(int i=2;i<a-1;i++){
                    if((a%i)==0){
                            flg=false;
                            break;
                    }      
                  else{
                   flg = true;
}
            }
回复 使用道具 举报
田策 中级黑马 2015-10-14 23:13:35
13#
如果不给初始值的话就要私有化前面要加Pirvate,如果还是报错的话你就扑捉一下异常用try      catc方法应该可以解决
回复 使用道具 举报
田策 中级黑马 2015-10-14 23:18:18
14#

如果不给初始值的话就要私有化前面要加Pirvate,如果还是报错的话你就扑捉一下异常用try      catc方法应该可以解决
回复 使用道具 举报
Ei_Ki_ 中级黑马 2015-10-15 00:11:04
15#
对于这样的题,你要了解它的作用域即可。
回复 使用道具 举报
局部变量是指,方法内,也就是局部代码块内声明的变量,你说的没事的是不是成员变量啊
回复 使用道具 举报
定义在方法里或域里就叫做局部变量,所谓域就是{}里面,比如
public class Test {
private String name;//成员变量,也是全局变量
public void changeName() {
String n = "tomoya";//n就是局部变量
name = n;
}
}
回复 使用道具 举报
雨来 高级黑马 2015-10-15 20:51:25
18#
作用域是在方法中还是在类中你首先要明白 的
回复 使用道具 举报
引用类型 都会自动赋初始值的,一般用new 来创建对象的 都是会自动赋值的 比如 int[] arr = new int[5],,如果是在成员函数里面 比如你定义一个 int a;没有赋值 但不使用a 是不会报错的,一使用就会提示没有赋初始值
回复 使用道具 举报
总结以上作用域的同时, 要清楚成员变量和局部变量的定义,存储的方式不同,作用范围也不用, 多数的局部类型数据不会报错,但是个别还是会报错的,例如之前有人说到null .
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马