您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java语言中为byte和short类型变量赋值为啥会报错?看完秒懂

时间:2019-12-17 12:43:12  来源:  作者:

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

Java语言中为byte和short类型变量赋值为啥会报错?看完秒懂

 

 

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

 

Java语言中为byte和short类型变量赋值为啥会报错?看完秒懂

 

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

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

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

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

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

Java语言中为byte和short类型变量赋值为啥会报错?看完秒懂

 

 

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

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

Java语言中为byte和short类型变量赋值为啥会报错?看完秒懂

 

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

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

  1. 给byte或short变量进行赋值时,“=”右边如果是一个算术表达式,并且表达式中出现变量,肯定无法通过编译。
  2. 即使用常量给byte或short变量进行赋值,如果在“编译阶段”就能确定所赋的值已经超过了范围,同样会报错。

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

Java语言中为byte和short类型变量赋值为啥会报错?看完秒懂

 

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

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



Tags:Java语言   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
字节码指令---异常处理每个时刻正在执行的当前方法就是虚拟机栈顶的栈帧。方法的执行就对应着栈帧在虚拟机中入栈和出栈的过程。当一个方法执行完,有两种情况,一种是正常执行,...【详细内容】
2021-10-09  Tags: Java语言  点击:(50)  评论:(0)  加入收藏
咱们先来看一段很简单的Java代码 这段代码非常简单,没有任何技术含量。但是,如果我们把这段代码改成下面的样子 大家可以看到,我们只是用一个变量a代替了原来赋值表达式当中...【详细内容】
2019-12-17  Tags: Java语言  点击:(73)  评论:(0)  加入收藏
大家都知道,Java语言运行程序的入口方法叫做main,这个方法有一个参数,这就表示说,我们要运行主方法,就必须给main方法传递一个参数。但是,大家似乎对这个参数向来都是视而不见,从来...【详细内容】
2019-12-16  Tags: Java语言  点击:(80)  评论:(0)  加入收藏
代码优化 ,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之...【详细内容】
2019-08-26  Tags: Java语言  点击:(185)  评论:(0)  加入收藏
概述排序分为内部排序和外部排序,内部排序是待排序的元素全部放在内存,并在内存中调整它们的顺序。外部排序是部分元素放到内存中,在内外存间调整元素的顺序。我们通常说的八大...【详细内容】
2019-06-17  Tags: Java语言  点击:(443)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条