java基础变量常见错.docx
- 文档编号:25297254
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:14
- 大小:21.62KB
java基础变量常见错.docx
《java基础变量常见错.docx》由会员分享,可在线阅读,更多相关《java基础变量常见错.docx(14页珍藏版)》请在冰豆网上搜索。
java基础变量常见错
1变量使用常用错误汇总
1.1问题
在我们使用变量的过程中,会遇到一些问题,在此将这些问题进行汇总,在今后使用的过程中,避免出错。
即使出现错误也可以很快的找到问题所在。
1.2方案
变量在使用的过程中,常见问题总结为如下几点:
1)使用未经声明的变量。
2)使用不符合Java标识符命名规则的变量。
3)使用未经初始化的变量。
4)变量的赋值与变量的类型不匹配
1.3步骤
实现此案例需要按照如下步骤进行。
步骤一:
使用未经声明的变量
Java语言语法规定,变量使用之前必须声明,否则会有编译错误。
大多数时候我们都记得这个规范,但是还是会出现变量未声明就使用的情况,请看如下代码:
1.publicstaticvoidmain(String[]args){
2.a=1;//编译错误,变量没有声明
3.intscore=0;
4.scord=100;//编译错误
5.System.out.println(score);
6.}
编译上述代码,会发现在代码“a=1;”处和代码“scord=100;”处出现编译错误。
出现编译错误的原因是变量a和变量scord没有被声明。
变量的声明包含两点:
变量的类型和变量的名称。
a变量没有被声明的原因是没有变量的类型。
scord变量没有被声明的原因也是因为没有变量类型,但是查看代码scord=100;的上下行的代码会发现声明了score变量,分析这三行代码,scord=100行出现编译错误的原因是变量没有被声明,没有声明的原因是变量score拼写成了scord。
步骤二:
使用不符合Java标识符命名规则的变量
Java中的变量的命名必须符合Java标识符的规则:
1)可以以字母、数字、“_”和“$”符组成;
2)首字符不能以数字开头;
3)中文可以作为变量名,但不提倡使用;
4)Java大小写敏感,命名变量时需要注意;
5)不能使用Java保留字(一些Java语言规定好的,有特殊含义的字符),如:
int、if、for、break等。
下面的代码体现了Java变量的命名规则:
1.int123go=100;//编译错误,不能以数字开头。
2.int成绩=60;//编译没错,但不建议使用。
3.intbreak=200;//编译错误,break是Java保留字。
4.intscore=80;
5.System.out.println(Score);
6.//编译错误,Java大小写敏感,Score变量没有声明。
上述代码中,分别有如下错误:
1)变量“123go”不符合Java的命名规范,原因是变量名不能以数字开头;
2)变量“成绩“编译时是正确的,但是这种使用汉字进行命名的方式不建议使用;
3)变量”break“处会出现编译错误,原因是break是Java的保留字,不能作为变量名;
4)在输出变量”Score“处会出现编译错误,原因是变量名是大小写敏感的。
intscore=80;处声明的变量和下一行代码中输出的Score是两个变量,所以变量Score没有声明。
Java语言语法规定,变量使用之前必须声明,否则会有编译错误。
另外,Java变量名的定义应“见名知意”;同时,Java编程规范要求:
变量的命名需采用“驼峰命名法”,即如果变量的名字由多个单词组成,除第一个单词外,其他单词的首字母大写,其余的字母小写,例如:
salary、empNostudentName等。
步骤三:
使用未经初始化的变量
Java语言规定变量在使用之前必须初始化,即必须给该变量赋予特定的值。
请看下列代码:
1.publicstaticvoidmain(String[]args){
2.inta,b=10;
3.intc=a+b;//编译错误,变量a没有初始化
4.System.out.println(c);
5.}
在上述代码中,代码行intc=a+b;处会出现编译错误,因为此行代码使用到了变量a,但是该变量却没有被初始化。
另外,有些语句结构(如if、for等)需要条件满足时才会执行;Java编译器不认为在这些语句块中的赋值语句可以实现初始化操作。
查看如下代码:
1.intsum;
2.inta=20;
3.intb=10;
4.if(a>0){
5.sum=0;//当a大于0的时候,该语句才会执行。
6.sum=a+b;
7.}
8.System.out.println(sum);//编译错误,编译器认为sum没有初始化。
上述代码中,语句System.out.println(sum);处会出现编译错误,Java编译器不认为放在if语句块中的sum=0;可以实现初始化操作。
步骤四:
变量的赋值与变量的类型不匹配
变量在声明时指定了类型,Java编译器会检测对该变量的操作是否与其类型匹配,如果对变量的赋值或者操作与其类型不匹配,会产生编译错误。
1.publicstaticvoidmain(String[]args){
2.intsalary;
3.salary=15000.50;//编译错误,整型变量不可以赋予浮点值(小数)。
4.}
上述代码中,变量salary声明时的类型为int,后续赋值为15000.50,而15000.50是浮点类型,因此导致编译错误。
整数类型变量不可以赋予浮点类型的值。
1.4完整代码
本案例是总结性的知识,没有完整的代码。
2整数类型(int、long)使用常见问题汇总
2.1问题
在我们使用整数类型的过程中,会遇到一些问题,在此将这些问题进行汇总,在今后使用的过程中,避免出错。
即使出现错误也可以很快的找到问题所在。
2.2方案
整数类型在使用的过程中,常见的问题有以下几点:
1)整数直接量超出了整数的范围。
2)关于整数的除法:
两个整数相除,会舍弃小数的部分,结果也是整数。
3)整数运算的溢出:
两个整数进行运算时,其结果可能会超过整数的范围而溢出。
4)表示long直接量,需要以L或l结尾。
2.3步骤
实现此案例需要按照如下步骤进行。
步骤一:
整数直接量超出了整数的范围
int是最常用的整数类型。
一个int类型的变量占用4个字节(32位),最大表示范围为:
-2^31~2^31-1,即-2147483648~2147483647。
整数直接量(literal),即直接写出的整数。
整数的直接量的类型默认为int类型,如果直接写出的整数超过了int的表达范围,将会出现编译错误。
请看如下代码:
1.intd=10000000000;
以上代码中,10000000000不属于int类型的直接量,因为Java认为所有直接写出的整数都是int类型,而这个数值超过了int的表达范围。
步骤二:
关于整数的除法
在Java中,两个整数相除,会舍弃小数的部分,结果也是整数。
请看如下代码:
1.intc=5/3;
2.System.out.println(c);//c的值为1
在上述代码中,运行后,c的值为1。
说明两个整数相除,舍弃了小数部分,只保留了整数部分。
步骤三:
整数运算的溢出
两个整数进行运算时,其结果可能会超过整数的范围而溢出,请看如下代码:
1.inta=2147483647;
2.intb=-2147483648;
3.a=a+1;
4.b=b-1;
5.System.out.println("a="+a);
6.System.out.println("b="+b);
上述代码运行后的输出结果为:
1.a=-2147483648
2.b=2147483647
变量a最初的值为2147483647,是int类型的最大值,加1以后出现了溢出现象,a的值变成了int类型的最小值。
而b变量最初赋的值为-2147483648,是int类型的最小值,减1以后出现了溢出现象,b的值变成了int类型的最大值。
这显然不符合加法和减法的规则,所以,在今后使用的时候要注意类似的问题。
步骤四:
表示long直接量,需要以L或l结尾
在表示整数时,如果int类型的范围不够,可以使用long型,一个long型的变量占用8个字节(64位),最大表示范围为:
-2^63~2^63-1,即-9223372036854775808~9223372036854775807。
当一个直接量超过int类型的最大值时,那要用long类型来表示,如果要表示long直接量,需要以L或l结尾。
请看下列代码:
1.longa=10000000000;//会有编译错误
2.longb=10000000000L;
上述代码中,10000000000超过了int类型的最大值,把它直接赋值给long类型会出现编译错误。
需要像变量b那样在10000000000后边加L。
2.4完整代码
本案例是总结性的知识,没有完整的代码。
3浮点类型(float、double)使用常见问题汇总
3.1问题
在我们使用浮点类型的过程中,会遇到一些问题,在此将这些问题进行汇总,在今后使用的过程中,避免出错。
即使出现错误也可以很快的找到问题所在。
3.2方案
浮点类型在使用的过程中,常见的问题有以下几点:
1)浮点数的直接量为double类型。
2)浮点数存在舍入误差问题。
3.3步骤
实现此案例需要按照如下步骤进行。
步骤一:
浮点数的直接量为double类型
浮点数,就是小数,包括:
float和double。
默认的浮点直接量为double型,如果需要表示float类型的直接量,需要加“f”或“F”后缀。
请看如下代码:
1.floatf1=3.14;
以上代码,会出现编译错误。
3.14是double类型的直接量,如果表示float类型的直接量应该写成3.14f。
步骤二:
浮点数存在舍入误差问题
由于浮点数内部用二进制的方式来表示十进制,会存在舍入误差。
二进制系统中无法精确的表示1/10,就好像十进制系统中无法精确的表示1/3一样。
对于一些要求精确运算的场合会导致代码的缺陷。
请看如下代码:
1.doublemoney=3.0;
2.doubleprice=2.9;
3.System.out.println(money-price);
上述代码的输出结果为:
1.0.10000000000000009
查看上述结果,并没有如我们想象的为0.1。
如果需要精确的运算可以考虑放弃使用double或float而采用BigDecimal类来实现。
关于这一点,将在后续的章节中介绍。
3.4完整代码
本案例是总结性的知识,没有完整的代码。
4对char类型变量的各种赋值方式汇总
4.1问题
在我们使用char类型的过程中,会遇到一些问题,在此将这些问题进行汇总,使今后使用的过程中,不出错。
即使出现错误也可以很快的找到问题所在。
4.2方案
char类型在使用的过程中,常见的问题有以下几点:
1)字符类型存储中文。
2)char类型的值可以作为整数类型直接使用。
4.3步骤
实现此案例需要按照如下步骤进行。
步骤一:
字符类型存储中文
char类型是否可以存储中文?
答案是肯定的。
字符类型事实上是一个16位无符号整数,这个值是对应字符的编码,Java字符类型采用Unicode字符集编码。
Unicode是世界通用的定长字符集,所有的字符都是16位字符直接量。
对于中文,可以采用诸如:
‘中’的形式,也可以采用其对应的16进制的表示形式,例如:
‘\u4e2d’。
步骤二:
整数类型和char类型的关系
char类型的值可以直接作为整数类型的值来使用,字符类型事实上是一个16位无符号整数,即全部是正数,表示范围是0~65535。
请看如下代码:
1. charzhong='疯';
2. intzhongValue=zhong;
3. System.out.println(zhongValue);
上述代码的输出结果为:
1.30127
上述输出结果为0~65535范围的。
另外,如果把0~65535范围内的一个int整数赋给char类型变量,系统会自动把这个int类型整数当成char类型来处理。
请看如下代码:
1.charc=97;
2.System.out.println(c);
上述代码的输出结果为a。
这说明系统自动把整数类型97当成char类型来处理,处理的结果为a,即,97为字母a的unicode码。
4.4完整代码
本案例是总结性的知识,没有完整的代码。
5类型转换常见问题汇总
5.1问题
在我们数据类型转换的过程中,会遇到一些问题,在此将这些问题进行汇总,使今后使用的过程中,不出错。
即使出现错误也可以很快的找到问题所在。
5.2方案
数据类型转换在使用的过程中,常见的问题有以下几点:
1)强制转换时的精度丧失和溢出。
2)数值运算时的自动转换。
3)byte、char、short转换为int的问题。
5.3步骤
实现此案例需要按照如下步骤进行。
步骤一:
强制转换时的精度丧失和溢出
基本类型之间的相互转换,需要注意的是,强制转换时可能会造成精度的丧失和溢出,请看如下代码:
1.longl=1024L*1024*1024*4;
2.intj=(int)l;//会产生溢出
3.System.out.println(j);//结果为:
0
上述代码输出的结果为0,是因为在将long类型变量l转换为int类型变量j的时候产生了溢出。
另外,请看如下精度丧失的例子:
1.doublepi=3.141592653589793;
2.floatf=(float)pi;//会造出精度的损失
3.System.out.println(f);//结果为:
3.1415927
上述代码的输出结果为3.1415927,值保留了7位小数,这是因为将double类型的变量pi转换为float类型的变量f时造成了精度的损失。
步骤二:
数值运算时的自动转换
多种基本类型参与的表达式运算中,运算结果会自动的向较大的类型进行转化。
请看如下示例:
1.longdistance=10000*365*24*60*60*299792458L;
上述代码中,有int类型数据和long类型数据,由于有long型的直接量299792458L参与,整个表达式的结果为long。
1.doublechange=800-599.0;
上述代码中,由于有double型的直接量599.0参与,整个表达式的结果为double。
1.doublepersent1=80/100;
上述代码中,结果为0.0。
右边都是int型数据,语法运算后的结果也为int类型,结果为0,再赋值给double型,将0转化为0.0。
请对比下面的代码:
1.doublepersent2=80.0/100;
上述代码中,结果为0.8,右边表达式有double型直接量参与,运算结果为double型。
步骤三:
byte、char、short转换为int的问题
byte、char、short三种类型实际存储的数据都是整数,在实际使用中遵循如下规则:
1)int直接量可以直接赋值给byte、char和short,只要不超过其表示范围。
2)byte、char、short三种类型参与运算时,先一律转换成int类型再进行运算。
请看如下示例代码:
1. byteb1=28;
2. byteb2=20;
3. byteb3=b1+b2;
上述代码在第三行会出现编译错误,原因是b1+b2的结果为int类型。
改变上述代码如下:
1. byteb1=28;
2. byteb2=20;
3. intb3=b1+b2;
查看上述代码,会发现不会再出现编译错误。
char类型、short类型和byte类型是相似的。
5.4完整代码
本案例是总结性的知识,没有完整的代码。
6年龄判断程序
6.1问题
本案例需要使用交互的方式判断年龄的范围:
用户从控制台输入一个年龄,由程序判断该年龄是否在18~50之间。
程序交互过程如图-1所示:
图-1
6.2步骤
实现此案例需要按照如下步骤进行。
步骤一:
定义类及main方法
首先定义一个名为Age的类,并在类中添加Java应用程序的主方法main,代码如下所示:
1.publicclassAge{
2. publicstaticvoidmain(String[]args){
3.
4. }
5.}
步骤二:
读取控制台输入
在main方法中,实例化Scanner类,并调用Scanner类的nextInt()方法接收用户从控制台输入的年龄,使用完毕后将scanner对象关闭,以释放资源。
代码如下所示:
1.importjava.util.Scanner;
2.
3.publicclassAge{
4. publicstaticvoidmain(String[]args){
5. Scannerscanner=newScanner(System.in);
6. System.out.println("请输入年龄:
");
7. intage=scanner.nextInt();
8. scanner.close();
9. }
10.}
在此需要注意导入Scanner类所在的包。
步骤三:
判断年龄所在的范围
接收到年龄后,判断年龄是否在18~50之间。
如果输出结果为true,则说明年龄在18~50之间,否则,年龄不在18~50之间,代码如下所示:
1.importjava.util.Scanner;
2.
3.publicclassAge{
4. publicstaticvoidmain(String[]args){
5. Scannerscanner=newScanner(System.in);
6. System.out.println("请输入年龄:
");
7. intage=scanner.nextInt();
8. System.out.println(age>=18&&age<=50);
9. }
10.}
在上述代码中,使用了“&&”逻辑运算符来连接两个条件。
年龄在18~50之间,即,年龄大于等于18且年龄小于等于50,因此需要使用“&&”运算符。
6.3完整代码
本案例的完整代码如下所示:
1.importjava.util.Scanner;
2.
3.publicclassAge{
4. publicstaticvoidmain(String[]args){
5. Scannerscanner=newScanner(System.in);
6. System.out.println("请输入年龄:
");
7. intage=scanner.nextInt();
8. scanner.close();
9. System.out.println(age>=18&&age<=50);
10. }
11.}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 基础 变量 常见