首页 > 编程语言 >Java千问05:Java语言中为byte和short类型变量赋值为啥会报错?

Java千问05:Java语言中为byte和short类型变量赋值为啥会报错?

时间:2022-12-28 10:05:09浏览次数:66  
标签:short Java 变量 编译器 报错 byte 表达式 赋值

咱们先来看一段很简单的Java代码

Java千问05:Java语言中为byte和short类型变量赋值为啥会报错?_赋值

这段代码非常简单,没有任何技术含量。但是,如果我们把这段代码改成下面的样子

Java千问05:Java语言中为byte和short类型变量赋值为啥会报错?_算术表达式_02

大家可以看到,我们只是用一个变量a代替了原来赋值表达式当中的常量1,就会出现语法错误,这是为什么呢?今天我们就用一篇短文来聊聊这个话题。

我们知道,Java语言中有4种整数类型,分别是byte、short、int和long。其中,Java编译器对byte和short类型的变量在赋值的时候,做了一点点“特殊检查”。那么编译器如何“特殊检查”这两种类型的变量呢?当编译器看到为这两种类型的变量进行赋值的时候,要进行“超范围检查”,也就是说,会检查一下给变量所赋的值会不会有可能超过范围。如果编译器认为所赋的值有可能超过这个变量所能存储的最大值或最小值,那么就会报语法错误。但是很多人都会问,程序中给变量s所赋的值并没有超过范围,为什么会报错呢?

这就要说说编译器的检查机制。当编译器看到程序中并不是用一个简单的数值对变量s进行赋值,而是把一个算术表达式赋值给了s,并且算术表达式中还出现了变量。这时候编译器就会认为这次赋值操作有可能会把一个超范围的值赋值给s,所以就报错。

可能有读者会问:第1段代码当中,也是用算术表达式给变量s赋值,为什么会就没有出现语法错呢?问题就在于:第2段程序中,给变量s赋值的算术表达式里出现了变量。编译器认为,既然是“变量”,就有可能发生改变,是一种不确定因素。编译器并不去管变量当前的值到底是多少,它认为只要是变量参与了运算,变量值有可能变化,从而可能导致赋值超范围,因此报出了语法错误。

如果我们把第2段程序中的变量a前面加上一个final关键字会如何呢?请看下面的代码

Java千问05:Java语言中为byte和short类型变量赋值为啥会报错?_编译器_03

当a前面加上了final关键字,a的值不能再发生变化,它变成了一个常量。编译器就会认定这次赋值是安全的,因为a的值永远都是1,赋值肯定不会超过范围。

那么,是不是给s赋值的算术表的时候中不出现变量,赋值操作就一定不会报错呢?其实并不是这样,请看下面的例子

Java千问05:Java语言中为byte和short类型变量赋值为啥会报错?_编译器_04

这次赋值操作,“=”右边的算术表达式中并没有出现变量,但是仍然会报语法错误,原因就是,编译器会提前把算术表达式的值算出来,如果发现算出来的值已经超过了byte或short的数据范围,也会报错。因此第4段程序也不能通过编译。

到这里,大家可以记住两个结论:

1.给byte或short变量进行赋值时,“=”右边如果是一个算术表达式,并且表达式中出现变量,肯定无法通过编译。

2.即使用常量给byte或short变量进行赋值,如果在“编译阶段”就能确定所赋的值已经超过了范围,同样会报错。

另外还要提醒大家,对int和long类型的变量进行赋值的时候,编译器并不采用这样的特殊检查措施。

Java千问05:Java语言中为byte和short类型变量赋值为啥会报错?_赋值_05

大家可以看到,在上面的程序中,我们给int类型变量i1赋值时,“=”右边也是一个算术表达式,并且表达式中也有变量,但不会出现语法错误。而给i2进行赋值时,“=”右边的值已经超过了int类型的范围,也不会有问题。

通过这篇短文,相信小伙伴一定能弄明白为什么给byte和short变量赋值的时候会出错的原因。

如果想系统学习Java编程可以点击这里观看我在本站的视频课程。



标签:short,Java,变量,编译器,报错,byte,表达式,赋值
From: https://blog.51cto.com/mugexuetang/5973813

相关文章

  • Java 提供给第三方使用接口方法
    前言相信有很多小伙伴,在日常的开发中都有遇到过需要调用第三方接口的需求吧,但是自己有没有写过接口提供给第三方使用呢,常规的都是我们调用别人的接口,但是自己需要开发接口提......
  • Java千问06:Java语言中最大的整数再加1等于多少?看完秒懂!
    ​已知Java语言中int类型所能表示的最大整数为2147483647,请问以下代码执行结果是什么?一部分人都会认为这段程序压根就无法通过编译,也有人认为,这段程序能够通过编译,但在运行......
  • Java HashMap原理
    HashMap是Java中用于实现映射关系的一种数据结构。它允许将一个对象(称为键)映射到另一个对象(称为值)。当需要访问值时,可以使用键来查找值。HashMap的实现原理是使用散列函数......
  • Java千问07:你真的会用Java的int型变量吗?有些坑你真的不知道!
    ​我们在进行Java编程的时候,使用最频繁的数据类型基本上就是int型了。平时在使用这种数据类型的过程中,我们似乎也并没有感觉到有什么太多需要注意的地方,其实int类型的变量在......
  • Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!
    ​我们知道,在Java以及很多高级编程语言当中,都有一种运算符叫做复合赋值运算符。复合赋值运算符由两个符号组成,它所能完成的运算操作也分为两步:第一步是运算,第二步是赋值。比......
  • JAVA代码审计_若依管理系统
    若依管理系统代码审计该项目使用Mybatis作为数据库持久化框架。全局搜索${、关注xxxmapper.xml文件寻找SQL注入。1)后台角色管理处SQL注入漏洞点“SysRoleMapper.x......
  • windows配置java17
    最近重置系统了,所有东西都得重装一遍。但是为了能继续撸树盖房子,java又是必不可少的,先把java搞回来再说。jdk下载地址https://www.oracle.com/java/technologies/javase......
  • tomcat7运行springboot war包项目启动报错
    报错的log如下:2022-12-2801:11:22.701WARN39756---[localhost-startStop-1]ConfigServletWebServerApplicationContext:Exceptionencounteredduringcontext......
  • Loki Promtail 使用 multiline 对Java 堆栈日志进行多行处理的示例
    promtail使用multiline处理java多行日志文本的示例Environment:promtail_version:v2.7.1originJavalogcontent:logfilecontentstdout-a.log:2022-Dec-270......
  • JavaWeb
    JavaWeb1、基本概念1.1前言静态webhtmlcss动态web技术栈:Servlet/JSP、ASP、php动态web资源开发技术统称为JavaWeb1.2web应用程序:可以提供浏览......