-
2021-04-13 00:20:46
java中局部变量没有初始值,运行时会直接报错:java: 可能尚未初始化变量a,就算打印了也无济于事,还会报错。要解决的方法是:
给a赋初始值。注意:java中的局部变量一定要赋初始值。编译运行后就会在控制台会出现。
package edu.xcdq.demo03;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
/**
-
*/
public class test {
public static void main(String[] args) {
Demo03 demo03 =new Demo03();
System.out.println(demo03.age); // 局部变量 int a; //局部变量没有初始值,作用在当前函数中 //System.out.println(a); Demo03.name="小冰"; System.out.println(Demo03.name); }
}
学无止境,我永远都是学习者 ,我还是一个新手 ,经验有限 ,世界这么忙 ,我刚好有空写下了自己的心得 ,希望对大家有所帮助 ,缘分让我们一起,你们的赞赏,支持,关注就是对我莫大的支持,哪里写的不好的,也欢迎大家评论留言交流,希望大家多多指点,我将不胜感激,也希望我们共同进步。
只有自己深深痛过,才能体会别人的痛,于是难得自我们反省。学习也是如此,只有我们自我反省思考才会进步,正所谓吾日三省吾身就是这样的道理。我们一定要努力学好java语言。
攀登顶峰,这种奋斗的本身就足以充实人的心。人们必须相信,垒山不止就是幸福。向前攀登,才是年轻人应该有的姿态。
更多相关内容 -
-
详解C语言未初始化的局部变量是多少
2020-12-17 09:51:34C语言中,未初始化的局部变量到底是多少? 答案往往是: 与编译器有关。 可能但不保证初始化为0。 未确定。 总之,全部都是些一本正经的形而上答案,这很令人讨厌。 但凡一些人给你滔滔不绝地扯编译器,C库,... -
JAVA成员变量初始化和局部变量初始化
2021-03-06 05:16:34如果在定义变量后没有给它们赋初始值,那么java会给于一个默认的初始化值,但只有类的成员变量才被初始化,而局部变量不会被初始化。如果没有被初始化的变量被操作,java在编译器就会给予错误警告,如果没有被赋予...在java中变量是具有默认初始化值的。
但这这么说也不怎么准确,因为java中的变量(我觉得称为字段更合适),分为属于类的成员变量和属于函数或者局部代码块的局部变量。如果在定义变量后没有给它们赋初始值,那么java会给于一个默认的初始化值,但只有类的成员变量才被初始化,而局部变量不会被初始化。如果没有被初始化的变量被操作,java在编译器就会给予错误警告,如果没有被赋予初值的局部变量,一直没被操作,则编译通过,java不会给予错误警告。
除了变量的初始化外,新创建的类的引用也是一样,如果没有用new关键字给它分配对象的话,如果这个引用是属于类的成员字段则被默认初始化为null,如果在函数或者局部代码块内部,不会被初始化;
java基本数据类型默认初始化表
基本类型
默认值
char
'\u0000'(null)
byte
0(byte 1字节)
short
0(short 2字节)
int
0(4字节)
long
0L
float
0.0f
double
o.od
boolean
false
另外添加一个:类引用会被初始化为null
下面,用一段代码测试一下:
运行结果:
这个结果就说明了,类测成员变量会被给予一个默认初始化值,类引用也会被初始化位nullvcD4KPHA+z8LD5rXEveG5+8rHyKW19MnPzsS0+sLr1tDK5LP2uq/K/bPJ1LGx5MG/JiMyMDU0MDu1xNPvvuSjrMbky/zDu9PQ1/a4xLavPC9wPgo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20131218/20131218093053283.jpg" alt="">
从上面的报错信息我们不难看出,包含在函数中的成员变量或者类引用,都不会被默认给予初始化值。
思考:
java的这种机制避免了没有被初始化的数据成员在进行其它操作时引起的严重性错误,尽量从语法上避免程序员犯错。与之相反,C和C++,无论你对变量时候进行初始化,都可以对变量进行操作,这时变量中存储的是一串随机的数字(可能是上一个程序使用该内存空间后遗留的值,计算机中的数据不会被物理意义上的“擦除”,你对一块内存的写数据只是覆盖了这块内存的旧值而已。)。java编译器会将未初始化变量视为错误,而C/C++编译器则将其视为警告
喜欢 (0)or分享 (0)
-
为什么Java中全局变量不一定初始化,局部变量必须初始化?
2021-03-13 07:06:40前几天,有个大佬考了我一个问题:为什么类的成员变量不需要指定值就可以自动赋予初始值,而方法内的局部变量就必须指定初始值呢?说实话,这个问题确实难倒我了,之后我在网上一顿操作,终于把这个问题弄得稍微明白...【套装4本】java编程思想4第4版+
402.5元
包邮
(需用券)
去购买 >
前几天,有个大佬考了我一个问题:为什么类的成员变量不需要指定值就可以自动赋予初始值,而方法内的局部变量就必须指定初始值呢?
说实话,这个问题确实难倒我了,之后我在网上一顿操作,终于把这个问题弄得稍微明白一点了。
首先我给出一个具体的场景来说明这个事情:
定义一个Cat类,里面有各种属性,包括8大基本数据类型和String类型,我们把String类视为复杂数据类型。Cat类里面有一个setAge方法。我们在main方法里面给tom这个Cat赋值年龄,结果发现,如果给定的年龄没有赋初始值,编译器会报错:
那我们来看下未给Cat里面的各种属性初始化,各项属性的初始值究竟是怎样的:
重写一下toString方法:
然后输出结果为:
我们能够看到,对于8大基本类型的初始化已经实现了,分别是如图所示的值。对于复杂的类,会赋予null作为默认值。(这里char的默认值为'/u0000'也就是null)
那么问题来了,为什么Java会有这样的操作呢,为什么不能将方法内的局部变量也自动赋值一个默认值呢?
首先,我在网上找到了这样的一个答案如下,如果不想看原文,可以直接跳过至引用答案的结尾处直接看我的总结:
这位作者在读《深入理解Java虚拟机》的时候记录了一个相关知识点。
类的成员变量有默认初始值,而方法内的局部变量却没有初始值。这个问题涉及到JVM类加载和字节码执行两个阶段,这两个阶段是依次执行的。
JVM类加载是JVM利用类加载器将class文件加载到JVM的过程,涉及“加载”、“验证”、“”准备“、“”解析“和”初始化“。
一、类的成员变量初始化 ---在JVM类加载阶段完成
类的成员变量又分为静态成员变量和非静态成员变量。
静态成员变量
静态成员变量会被初始化两次,第一次在“准备”阶段,先进行一次初始化,系统附上默认值;第二次在“初始化”阶段,根据代码中的赋值情况再进行一次初始化。
例如:
public static int i =3 ;
第一次初始化后i的值为0,第二次初始化后,值才为3.
数据最终存放在方法区中。
非静态成员变量
仅“初始化”阶段赋值。根据代码中的赋值情况,代码不赋值直接赋默认值,有赋值则等于代码中的赋值。对象实例化后,该变量随java对象分配到java堆中。
二、方法区的局部变量没有初始化
而方法中的局部变量没有初始化步骤,如下图:
需要在代码中进行初始化。
————————————————
原因就是类方法中的代码,实在字节码执行的时候,才会被运行到,此时局部变量是存储在虚拟机栈-栈帧中的局部变量表中。局部变量定义了但是没有赋值是不能使用的。
版权声明:本文为CSDN博主「一步一台阶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liufang...
这篇帖子主要是说明了两种变量在JVM编译代码的时候把他们放在了哪里。
JVM加载类的时候,不管是静态类还是非静态类,都会给每个类分配内存,存在堆里面,都有初始化的这一步操作。
对于方法内的局部变量,由于方法要放到堆栈中(堆栈这个词,其实意义就是栈,习惯称为堆栈,其实和堆没关系),只有字节码执行的时候才会被运行到,所以没有赋值是不能使用的。
………………??? 这是什么意思?也就是说,两种变量的存储位置不一样,会对是否初始化有影响,但是没有说明为什么成员变量在堆里就有初始化,方法内局部变量为啥放在堆栈里面,只有执行方法的时候才会被运行到就不能初始化呢?
然后我就找到另一篇文章如下:
为什么 Java 中全局变量不一定初始化,局部变量必须初始化?
作者:Intopass
链接:https://www.zhihu.com/questio...
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
首先 Java 语言就是这么规定的。
然后为什么 Java 语言要这么规定呢?有什么内部机理吗?
可能的原因如下,当我们新建一个对象时,Java会在Heap中申请一块内存区域用以存放类的数据。而成员变量就是类的数据,也是放在这块内存区域中的。只需要JVM在申请内存的时候顺便把整块区域都置为零即可完成初始化,方便快捷。
而对于方法的局部变量,是在线程的Stack中,当然Stack他也可以帮我们初始化,不过有一个问题。对于有些局部变量,在方法的一开始是没有的,有些在循环中的局部变量是要反复的声明多次的。有些局部变量作用域结束后,另一个局部变量又会占用这个局部变量的位置。
那么初始化要放在何时呢?当然JVM可以帮我们初始化多次,不过那样或许会带来性能问题。
for (int i = 0; i < 10; i++) {
int n;
if (i % 2 == 0) {
n = 10;
} else {
n = 20;
}
}
像是这个n,我们完全不用JVM帮我们初始化,如果每次循环他都帮我们初始化一次,那么是没有必要的。综上所述,对于局部变量,可能不帮我们初始化是一个不错的选择。(而且JVM实现起来也更容易!!!)
通过看这位作者的讲解,我们就能够理解得更清楚一些了。为什么堆内的成员变量可以初始化?因为容易,申请内存的时候顺便就实现了初始化。为什么栈内的局部变量不能初始化?因为麻烦,而且没有必要。
最后,我又看到了一个内容,同知乎页面另一个匿名作者的回答:
套用《Thinking in Java》作者Bruce Eckel的话
编译器当然可以为局部变量附一个默认值,但是未初始化的局部变量更有可能是程序员的疏忽,所以采用默认值范围会掩盖这种失误。因此强制程序员提供一个初始值,往往能够帮助找出程序里的缺陷。
其实我觉得这句话应该是对于为什么局部变量不能够初始化的最合理的解释了吧。
总结一下,为什么局部变量需要手动初始化?从技术上来讲,局部变量一般来说总量大,生命周期短,JVM进行初始话开销较大;从业务上讲,局部变量一般用于实际问题下的运算,很少会用到默认值,赋值意义不大;从编程思想上讲,局部变量不初始化,而是报错提醒,更有助于程序员减少开发过程中出现缺陷的可能。一举三得,何乐而不为?
回到开头,所以说大佬就是大佬,随随便便问一个问题,看似是一个小问题,但是深究下去竟然牵扯到这么多深层次的知识点,甚至有点哲学的意义在里面,佩服佩服!
java 11官方入门(第8版)教材
79.84元
包邮
(需用券)
去购买 >
-
全局变量和局部变量初始化问题
2019-08-23 16:08:42这里需要分清一个事实,是变量系统都会默认给初始化,只不过全局变量默认初始化为0,而局部变量被初始化为随机数,这个随机数用不了,后面会验证。现在,我们要讨论的是程序猿或者程序媛需不需要给全局变量和局部...总结
这里需要分清一个事实,是变量系统都会默认给初始化,只不过全局变量默认初始化为0,而局部变量被初始化为随机数,这个随机数用不了,后面会验证。 现在,我们要讨论的是程序猿或者程序媛需不需要给全局变量和局部变量赋初值的问题。因为全局变量的初始值是系统默认的且是可使用的,因此,全局变量一般不需要自己去赋初值,不过为了养成良好的代码习惯,最好还是赋初值,定义的全局变量在代码中未被使用,编译器也不会报错。局部变量被定义,没有赋初值,系统会抛出警告“xxx未使用的局部变量”,同时未赋初值的局部变量,是不能在其它地方作为右值使用的,系统会抛出错误“使用了未初始化的局部变量”。因此,局部变量如果被定义,就必须要赋初值,下面通过一段代码来验证。
#include <iostream> #include <string> #include <vector> int a; bool b; char c; double d; std::string str; std::vector<int> vec; int main() { int a2; bool b2; char c2; double d2; std::string str2; std::vector<int> vec2; //Microsoft C++ 异常: std::out_of_range //vec.at(0) = 1; //vec2.push_back(1); /* std::cout << "a:"<<a << std::endl; std::cout << "b:"<<b << std::endl; std::cout << "c:"<<c << std::endl; std::cout << "d:"<<d << std::endl; std::cout << "a2:"<< a2 << std::endl; std::cout << "b2:"<< b2 << std::endl; std::cout << "c2:"<< c2 << std::endl; std::cout << "d2:"<< d2 << std::endl; */ system("pause"); return 0; }
全局变量
我把所有的全局变量都添加到监视中,调试后可以发现,普通数据类型变量的值系统会默认初始化为0。int类型初始化为0,bool类型初始化为false,char类型初始化为‘\0’,double类型初始化为0.00000000000000000。
局部变量
在局部变量窗口中可以看到,局部变量的初始化值都是随机的。普通数据类型中,int类型初始化为-858993460,bool类型初始化为true (204),char类型初始化为-52 '?',double类型初始化为-9.2559631349317831e+61。
编译时,会给出警告信息:
通过两个窗口数据可以看到,string类型和vector类型的变量初始化是一样的,string的size为0,capacity为15;vector的size为0,capacity也为0。
把主函数里面这段代码的注释取消,发现int、bool、double的打印值都为0,char的打印值为空,也就是‘\0’。
std::cout << "a:"<<a << std::endl; std::cout << "b:"<<b << std::endl; std::cout << "c:"<<c << std::endl; std::cout << "d:"<<d << std::endl;
把主函数里面这段代码注释取消,直接Game over,系统报错。
std::cout << "a2:" << a2 << std::endl; std::cout << "b2:" << b2 << std::endl; std::cout << "c2:" << c2 << std::endl; std::cout << "d2:" << d2 << std::endl;
这里多说两句关于vector容器初始化的:
size是当前vector容器真实占用的大小,也就是容器当前拥有多少个容器。
capacity是指在发生realloc前能允许的最大元素数,即预分配的内存空间。
这两个属性分别对应两个方法:resize()和reserve()。
使用resize(),容器内的对象内存空间是真正存在的。
使用reserve()仅仅只是修改了capacity的值,容器内的对象并没有真实的内存空间(空间是"野"的)。
1、如果对容器直接赋值,会报out_of_range,也就是越界。
vec.at(0) = 1;
2、如果没有对容器赋初值,打印其中一个,也会报out_of_range,因为vector的size为0,capacity也为0。
std::cout << "vec:" << vec.at(0) << std::endl;
如果要打印第一个值,需要先resize一下,不能用reserve,此时的值为0,但还是不能赋值
vec.resize(1); //vec.reserve(1); std::cout << "vec:" << vec.at(0) << std::endl;
3、如果要赋值,需要先往vector里面push_back值,这个不需要resize都可以
vec.push_back(1); std::cout << "vec:" << vec.at(0) << std::endl; vec.at(0) = 2; std::cout << "vec:" << vec.at(0) << std::endl;
-
c语言中全局变量和局部变量未初始化时的初始值
2020-03-24 13:43:56如上图所示, 1、全局int变量(包括有static前缀的)未初始化,默认值是0。 2、局部int变量未初始化,默认值未知。...解释:局部变量是存在栈中,数据量大,且生命周期短,若为局部变量进行初始化,开销很大。 ... -
关于成员变量和局部变量的初始化
2022-01-26 14:34:38成员变量为什么可以不用初始化,而局部变量就必须要初始化? -
Java 类变量有默认值,可以不初始化;但局部变量必须要初始化
2019-03-15 11:47:17局部变量定义后,必须初始化,即赋值,才能使用(它没有默认值)。 而类变量定义后可以不初始化,因为它有默认值。 类变量(实例变量):定义在类中,方法体之外。成员变量前面加 static 修饰符。 局部变量:定义在... -
为什么 Java 中全局变量不一定初始化,局部变量必须初始化?
2021-02-07 15:47:26一、类的成员变量初始化 ---在JVM类加载阶段完成 类的成员变量又分为静态成员变量和非静态成员变量。 静态成员变量 静态成员变量会被初始化两次,第一次在“准备”阶段,先进行一次初始化,系统附上默认值;第二... -
为什么全局变量无须初始化,局部变量必须初始化
2021-05-23 06:42:32全局变量有时也需要初始化,而局部变量其实大部分时间都没有初始化。不要把赋初值与初始化混淆了:初始化是由编译器做的,形成可执行文件后,那些变量的值就在软件文件中放着,执行程序时直接使用了;而赋初值是由C/... -
Java 局部变量未初始化会报错,局部变量没有初始值,成员变量有初始值
2018-09-07 18:02:00Java 成员变量有初始值,而局部变量没有初始值。 如下所示,代码不能编译通过 publicstaticvoidmain(String[] args){ String s; System.out.println("s="+s); } 转载于:... -
Java中局部变量必须初始化
2020-12-24 22:37:30Java中有两种变量,局部变量和成员变量。 成员变量可以不进行初始化,虚拟机也会确保它有一个默认的值。 局部变量不能这样做,我们必须对它进行赋值,才能使用它。 -
关于局部变量的初始化
2018-10-26 15:22:35我们经常被告知:在Java语言规定,局部变量必须要先初始化,然后才能使用。为什么呢? 首先 Java 语言就是这么规定的。其实无论成员变量还是局部变量都要初始化。只是JVM帮我们初始化了成员变量。 第一种解释: ... -
C++未被初始化的局部变量
2017-02-16 09:23:12而没有初始化保存变量(或初始化为0的静态变量、全局变量)其默认值为0,没必要将这些值均为0的变量存储在data段中,而采用bss段只是给未初始化的全局变量和局部静态变量预留位置,bss段并没有内容。但是在程序执行... -
C语言未初始化的局部变量是多少?
2020-07-17 17:41:15C语言中,未初始化的局部变量到底是多少? 答案往往是: 与编译器有关。 可能但不保证初始化为0。 未确定。 总之,全部都是些一本正经的形而上答案,这很令人讨厌。 但凡一些人给你滔滔不绝地扯编译器,C库,... -
C++局部变量和全局变量的初始化
2020-03-02 23:17:18当局部变量被定义时,系统不会对其初始化,此时局部变量的初始值未定义,必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值: -
静态局部变量初始化
2019-03-07 11:17:06原以为会每次调子函数时,都会初始化静态局部变量。实际并非如此 #include void key(void) { //static unsigned char key_up =1; unsigned char key_up =1; printf("key_up = %d \n", key_up); key_up = ... -
成员变量自动初始化,局部变量必须手动初始化
2017-10-20 11:44:11不管程序有没有显示的初始化,Java 虚拟机都会先自动给它初始化为默认值public class Copy { static String s; public static void main(String[] args){ System.out.println("s="+s); } } s=null2.局部变量必须... -
C/C++中全局变量,静态局部变量,局部变量的初始化问题
2017-07-20 11:36:48什么时候初始化 根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法...答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量的初始化可以划分为以下两 -
java:局部变量的初始化
2018-07-15 00:51:42类变量有两次赋初始值的过程,一次在准备阶段,赋予系统初始值(如果被final修饰,初始值可能不是0或者null,false),另外一次在初始化阶段,赋予程序员定义的初始值,但是局部变量不一样,系统不会赋予初始值,除非... -
Java 局部变量初始化问题
2018-06-08 09:05:49但是 j 是方法中的局部变量,没有初始化直接使用会出现编译错误。当然如果没有使用 j 而只是声明了却未初始化,那么只会有警告,因为编译器希望你接下来能对 j 进行初始化。 注意:boolean 类型默认值是 false.... -
在C语言中使用未初始化的局部变量
2021-05-20 04:17:14所以我一直在这一点,我有点难倒我得到“未初始化的局部变量加仑使用”。在我的take_Input函数转换(加仑);在C语言中使用未初始化的局部变量我知道这意味着加仑的价值不被认可。为什么加仑升功能没有为加仑设置一个值... -
C语言中变量未初始化的处理
2022-02-11 10:44:46实例测试1--DEV-C++环境 : #include <stdio.h> //全局整形变量 int int_var1; static int stc_int_var1;... //局部整形变量 int int_var2; static int stc_int_var2; short int sht_int_var2 -
如何初始化局部变量c语言_最容易忽略的C语言知识点细节,编程大牛进阶之路!...
2020-11-22 06:06:22当你选择了一种语言,意味着你还选择了一组技术、一个社区。——Joshua Bloch一条长语句需要换行写,可以在行的末尾加入反斜杠 表示;...变量有全局变量、局部变量,全局变量系统默认初始化,局部变量不会自... -
为什么全局变量无须初始化 系统自动给默认值,局部变量必须初始化?
2018-04-10 01:20:35基本数据类型数值6类 (long/int/short/byte)(double/float) 非数值2类(char,boolean)下面是默认值:0/0/0/0/0.0/0.0/ /false首先 Java 语言就是这么规定的。然后为什么 Java 语言要这么规定...而成员变量就是类的数... -
变量未初始化,为什么得到的值全局变量是0,局部变量函数内部变量有的是随机值?
2019-12-20 11:06:16要解释为什么全局变量未初始化为什么是0,而动态局部变量是一个随机数,就要先弄清楚静态,动态是什么,局部,全局又是什么.然后再思考为什么静态是0,就要思考它们的存储方式,因此自然就要了解内存的内部结构,然后了解... -
C++全局变量、局部变量、成员变量初始化
2020-04-05 11:56:161、实践是检验真理的唯一标准,废话不多说,上代码。 #include <QCoreApplication> #include <...// 定义变量类 class Variable { public: Variable(const string& type) :_type(typ... -
Java中局部变量必须初始化【Java基础】
2017-04-10 19:02:06Java中有两种变量,局部变量和成员变量。 成员变量可以不进行初始化,虚拟机也会确保它有一个默认的值。 局部变量不能这样做,我们必须对它进行赋值,才能使用它。 int i;//为初始化 System.out.println(i);//... -
C语言全局变量和静态全局变量和局部变量和静态局部变量在初始化和未初始化时生存期和作用域的具体情况怎么...
2019-09-15 07:46:25这里讲静态局部变量在编译赋初值,没有初值自动赋初植 0(对数值型交量)或空字符'\0'(对字符变量)。应该是在编译就分配了空间 在对生存期和作用域解释时又有这样的例子,如图 ![图片说明]...