java中类型转换异常问题 强制类型转换

JavaSE基础复习:基本数据类型转换以及强制类型转换精度缺失原因 目录 数据类型转换规则 强制类型转换 不使用强制类型转化符图例 使用强制类型转化符图例 强制类型转换精度缺失 数据类型转换规则 八种基本数据类型byte short int long float doule char boolean (1)除boolean类型不能转换... 阅读详情

https://blog.youkuaiyun.com/czengze/article/details/52976820

1.背景

      在Java中,之所以需要强制类型转换是为了防止程序员在不知情的情况下把A类型数据错当成B类型的数据。将一种类型的值赋给另一个类型的变量是很常见的,如果这两种是兼容的,那么Java将执行自动转换,例如int和long,将int类型赋值给long类型的变量,总是可行的。但不是所有的类型都兼容。例如,没有将double类型转换为byte型的定义。但是不兼容的类型之间的转换仍然是可能的。达到这个目的,就需要使用强制类型转换。完成两个不兼容类型的强制转换。

2.自动类型转换和强制类型转换

      在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。

      当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了。在Java中我们可以通过继承、向上转型的关系使用父类类型来引用它,这个时候我们是使用功能较弱的类型引用功能较强的对象,这是可行的。但是将功能较弱的类型强制转功能较强的对象时,就不一定可以行了。

[java]  view plain  copy
  1. Father father = new Son();  
  2. Son son = (Son)father;  
  3. //编译出错,ClassCastException  
  4. Father father = new Father();  
  5. Son son = (Son) father;  
      在第一个例子中,father被指向一个子类对象,子类也可以指向子类对象。而第二个例子中,father被传给一个父类对象,子类引用不能指向父类对象。即很重要的概念是:父类引用指向子类对象。将父类转换为子类之前,应该用instanceof检查。
[java]  view plain  copy
  1. static class One {  
  2.     public void foo() {  
  3.         System.out.println("One");  
  4.     }  
  5. }  
  6. static class Two extends One {  
  7.     public void foo() {  
  8.         System.out.println("Two");  
  9.     }  
  10.     public void dosth(){  
  11.         System.out.println("Two again");  
  12.     }  
  13. }  
  14. public static void main(String[] args) throws Exception{  
  15.     One t = new Two(); //向上转型,即父类引用指向子类对象,此时子类对象的类型为父类的类型  
  16.     t.foo();  
  17.     t.dosth();//编译错误  
  18.     t = (Two)t;   
  19.     t.dosth();//编译错误   
  20.     ((Two) t).dosth();//编译成功  
  21. }  

向上转型是安全的,但是会有些子类特性会丢失,向下转型可以成功。

      总结:父类引用可以指向子类对象,子类引用不能指向父类对象。把子类对象直接赋给父类引用叫做向上转型,向上转型不用强制转型,如Father f1=new Son(),把指向子类对象的父类引用赋给子类引用叫做向下转型,要强制转型,如Son s1 = (Son)f1。向上转型会丢失子类特有的方法,但是子类overriding父类的方法,子类方法有效。 

      将一种类型的数据赋给另外一种类型变量时,满足下列两种要求将执行自动类型转换:1.两种类型是兼容的;2.目的类型的范围比来源类型大。   

      数据值类型按照范围从小到大为:byte,short,char,int,long,float,double

      例如int类型比所有byte合法类型大,因此不要求显式强制类型转换。对于数字类型,整型和浮点型都是彼此兼容的,但是数字类型和字符类型和布尔类型是不兼容的,字符类型和布尔类型也不是互相兼容的。

      自动类型转换不能满足所有的转换需求,比如int型变量赋值给byte型变量,这种转换不会自动进行,因为byte型比int型范围小。为了完成两种不兼容类型转换,需要用到强制类型转换。

      目标类型指定了要转换成为的类型。例如果将int型转为byte型,int型取值范围大于byte型,它的值将堆byte型范围进行取模。而把浮点型赋值给整数型,就会出现截断,截取掉小数部分。从其他数值类型转换为char类型时,必须进行强制转换。将char类型转换为其他数值类型时,除了byte、short必须强制转换之外,int、long、float、double都不用强制转换。

[java]  view plain  copy
  1. byte b;  
  2. int i = 257;  
  3. double d = 32.13;  
  4. b = (byte) i;  
  5. System.out.println("i and b = " + i + " " + b);  
  6. i = (int)d;  
  7. System.out.println("d and i = " + d + " " + i);  
  8. b = (byte)d;  
  9. System.out.println("d and b = " + d + " " + b);  
  10. byte e=(byte)130;   
  11. System.out.println(e);  
  12.    
  13.    
  14. /* 
  15. * output 
  16. i and b = 257 1 
  17. d and i = 32.13 32 
  18. d and b = 32.13 32 
  19. -126 
  20. */  
        当257要转换为byte时,byte的范围是256,所以取模的结果是1。浮点值赋给整数型,截断了小数部分。
[java]  view plain  copy
  1. short s = 1;  
  2. s= s + 1;//编译错误  
  3. short s1 = 1;  
  4. s1 += 1;  
      上述陷阱是s = s + 1,s + 1会隐式转换为int型,把int型号赋给short,会造成类型缺失。而s1 += 1相当于s1 = (short)(s1 + 1)会把s1 + 1强制转换为short类型,就不会报错。涉及到写代码的严谨性。

      对于自动装箱和自动拆箱,将一个基本数据类型转换为对应的引用类型时,不必强制转换。将一个基本数据类型的引用类型转换为基本数据类型时,也不必要强制转换。

[java]  view plain  copy
  1. int i1 = 10;  
  2. Integer iObj1 = i1;  
  3. Integer iObj2 = new Integer(10);  
  4. int i2 = iObj2;  
      在三目运算符中,会按照算术类型中的提升原则将两端操作提升至统一类型,如果两端有一个操作数是引用类型,则整个表达式结果用Object型表示。

[java]  view plain  copy
  1. byte b = 10;   
  2. short s = 20;   
  3. int i = (b == 10) ? b : s;   
  4. int i1 = 10;   
  5. String str = "Hello";   
  6. Object obj = (i1 == 10) ? i1 : str;  // 在这里变量i进行了自动装箱操作  
      int和String互相之间的转换,首先是int转String,有两种方法
[java]  view plain  copy
  1. int i = 12345;  
  2. String s = "";  
  3. s = i + "";  
  4. s = String.valueOf(i);  
     第一种方法,s = i + "";会产生两个String对象, s = String.valueOf(i);直接使用String的静态方法。

[java]  view plain  copy
  1. String s = "12345";  
  2. int i ;  
  3. i=Integer.parseInt(s);  
  4. i=Integer.valueOf(s).intValue();  
    第一种方法直接使用静态方法,不会产生多余的对象,但会抛出异常。第二种方法相当于new Integer(Integer.parseInt(s))也会抛出异常,但是会多产生一个对象。

      valueOf返回的是原对象,toString()返回的是字符串。

3.instanceof

      instanceof是Java二元操作符,测试左边对象是否是右边类的实例,返回boolean类型的数据,作用上可以避免强制类型转换失败。

4.JVM级别原理

      对于强制类型转换,且是引用类型,如果是父类向子类转换,这种只牵扯到引用名义类型的转换,具体的内存没有什么变化。

      而基本类型转换不同,数据发生了变化。但是基本数据类型不是对象,如果涉及到自动装箱和拆箱,实际上是调用类似Integer.parseInt()和Integer.valueOf()实现。

      父类向子类强制转换,如果成功不会有任何数据丢失,如果不是子类,那么会报错。基本类型之间的转换,如果是大范围向小范围的转换,有可能发生数据丢失或者精确丢失。


Java 入门之5:Java 运算符、及自动类型转换和强制类型转换 的总结 ++ 和 -- 的注意事项总结(以及举例): ++ 单独使用的时候,无论 ++ 是放在变量前面还是变量后面,都是变量里存的数值加1操作。 -- 单独使用的时候,无论 ++ 是放在变量前面还是变量后面,都是变量里存的数值减1操作。 如果 ++ , -- 参与到运算中去的话,对运算结果会产生影响。它们的规则是看 ++ 、-- 是在后还是在前: 阅读详情

相关推荐

MATLAB PDE工具箱电磁场仿真平行电容板及电偶极子详解

首先打开matlab,在命令行输入pdetool打开PDE工具箱 工具箱的功能我就不赘述了,大概就是以有限元的数值计算方法,计算二阶偏微分方程,因此可以解决电磁场、热力学等问题。 首先点击左上角按钮,画三个矩形 画完一个后可以双击矩形编辑,参数如下: 其中R1表示上极板,R2表示下极板,R3表示整个空间区域。 在上方Set formula为R3-R2-R1,表示求解区域是整个空间区域减去两个极板。下拉框选择Electrostatics表示求解的是静电场问题。 接下来点击上方菜单栏中的这个按钮,表

weixin_42845306的博客 1万+

Java类型强制转换

1.背景       在Java中,之所以需要强制类型转换是为了防止程序员在不知情的情况下把A类型数据错当成B类型的数据。将一种类型的值赋给另一个类型的变量是很常见的,如果这两种是兼容的,那么Java将执行自动转换,例如int和long,将int类型赋值给long类型的变量,总是可行的。但不是所有的类型都兼容。例如,没有将double类型转换为byte型的定义。但是不兼容的类型之间的转换仍然

CZengze的专栏 7万+

【ESP32】1.编译、烧录、创建工程

本文介绍了在VSCode中搭建ESP32开发环境并烧录"Hello World"工程的过程。首先通过串口工具成功下载固件后,解决了OpenOCD报错问题。针对头文件无法识别的问题,修改了c_cpp_properties.json配置文件,调整了编译器路径和IntelliSense模式。文章还详细说明了创建新工程的步骤,包括选择芯片型号和项目模板,并验证了串口打印功能。最后提醒在项目构建时要等待完成,避免文件缺失。整个流程涵盖了环境搭建、代码烧录、调试及新项目创建等关键环节。

梁山1号 1484

Java强制类型转换的所有规则都在这里了

`long`类型内存8个字节, `int`类型内存4个字节。 `long`取值范围大于`int` ;想要赋值成功,只有通过**强制类型转换**,将 `long` 类型强制转换成`int`类型才能赋值。 - **强制转换**:将 **取值范围大的类型 强制转换成 取值范围小的类型**;比较而言,**自动转换是Java自动执行的,而强制转换需要我们自己手动执行。**

緑水長流*z 9905

Argoverse数据集可视化/Argoverse-api

argoverse可视化,argoverse-api配制方法

learning_man的博客 9560

STM32G0——USB虚拟串口

STM32G0用cubeMX配置实现USB虚拟串口

阿昌 2318

ClassCastException(类转换异常)可能原因和解决方法

运算符进行类型检查,避免直接进行不安全的强制类型转换。此外,注意在泛型代码中使用泛型的参数类型,以避免由于类型擦除而导致的问题。在使用反射时,确保进行类型转换的对象与目标类型是兼容的。(类转换异常)通常发生在试图将一个对象强制转换成它不是实际类型的类型时。这个异常表明程序在运行时遇到了类型不兼容的强制转换。时,关键是了解为什么发生了类型不匹配,然后采取相应的措施确保类型转换是安全的。如果有疑虑,可以使用。运算符进行类型检查,并根据需要进行处理。,首先要理解对象的实际类型。

Java开源程序猿 8451

【AI 智能体】Windows 环境 Hermes Agent(爱马仕)安装详细过程

Windows 环境 Hermes Agent(爱马仕)安装详细过程

congge_study的博客 1824

【常见异常积累】不定时更新(新手参考,高手勿进)

java.lang.ClassCastException: 强制类型转换异常,类型转换错误

Khan的博客 105

手把手教你玩转服务器芯片架构​专栏--​​3.5 实战案例:用SystemC搭建一个多核服务器芯片的NoC模型(含流量分配与延迟仿真)​

通过SystemC搭建多核NoC模型,可深入验证流量分配策略与延迟特性。实际工程中需结合FPGA原型验证(如Xilinx Alveo)进行时序收敛分析,并通过参数化设计适配不同服务器芯片需求。

MHD0815的博客 3043

QT里获取UUID当做唯一文件名称

QT里获取UUID当做唯一文件名称

541

java类型转换异常_类型转换异常

StringBufferhql2=newStringBuffer("selectroomIdfromDailyDataColdWaterwhereDateTime>"2017-04-0700:00:00"andTotalUsed!=0groupbyroomId,TotalUsed,LeftQuantityhavingcount(roomId)=3");Lis...

weixin_40000702的博客 978

结构优化软件:OptiStruct_(11).拓扑优化

在OptiStruct中,设计空间可以通过定义设计区域来实现。设计区域是结构中可以进行材料变化的部分。几何区域:通过几何选择工具选择特定的区域。网格区域:通过网格选择工具选择特定的单元。假设我们有一个简单的梁结构模型,网格文件为beam.fem。我们希望在梁的中部进行拓扑优化,以减轻重量并保持刚度。

kkchenjj的博客 1366

JAVA中对null进行强制类型转换

java中将NULL值进行强制类型转换

qq_47288175的博客 3763

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java 数组类型 强转_关于Java中强制类型转换的问题

为了更好的理解我们先看下面的例子:package com.yonyou.test;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/*** 测试类* @author 小浩* @创建日期 2015-3-2*/public class Test{public static void main(Stri...

weixin_29531177的博客 1011

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

java强制类型转换和隐式类型有哪些

在大多数情况下,你应该尽量在编译时避免这种类型不匹配的情况,通过确保你的代码逻辑和类型使用是正确的。如果你发现自己经常需要捕获ClassCastException,这可能意味着你的代码设计存在问题,你可能需要重新考虑你的类结构和类型使用方式,以减少或消除这种类型不匹配的情况。隐式类型转换也称为自动类型转换,是指在不需要程序员干预的情况下,编译器自动把一个较小的数据类型的值转换为较大的数据类型。如果一个操作数比另一个操作数的类型大,那么较小的操作数将被转换为较大的操作数的类型。

codedadi的博客 558

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JAVA强制类型转换常见错误

这篇文章主要讲解:JAVA强制类型转换经常遇到的问题,主要分为2种情况。 1、当两个类没有继承关系时: package Test; public class Test { public static void main(String []args) { C c = new C(); B b = (B) c; } } class B extends A { public voi

郭嘉梁的博客 8987

day101_异常

day101_异常 常见的运行时异常: 空指针异常 计算有问题异常 数组越界异常 错误的类型转换 1.空指针异常 public class B{ public static void main(String args[]){ A a = null; System.out.println(a.i);//java.lang.NullPointerException } } class A { int i; } 2.计算有问题异常 int i=0; System.out.println(3

weixin_44848852的博客 178

Java 相同类型强制转换异常

Java 相同类型强制转换异常

Littleree的博客 650

【小白日记】Java 多态中的两种类型转换

文章目录为什么需要类型转换两种类型转换向上转型向下转型 为什么需要类型转换 接之前代码示例说 当我们创建一种动物时 这种动物不可能只会吃东西一种方法。他们都会有自己的特定的属性及方法 例如狗会玩游戏 猫会抓老鼠 而这些方法因为是该宠物独有的 所以我们需要把这些方法编写到子类当中 但是一经这样编写 当我们尝试在构造成多态的主方法当中直接调用时会发生如下结果 package com.sky.study...

WeiHaoLee 243

Java强制类型转换异常

1 问题如果你的项目中出现如下情况:说明你的java类文件中你运用了强制转换。2 方法(1) 先分析报错内容,报错时,一定要看主要问题,因为我遇到的主要问题是如下:(2) 说明我文件夹modle里面的Question类,不能转换成com.core.entity文件里面的question类。(3) 方法有很多种,这里用到的方法是子类继承父类的方法,在model文件夹的Question类中改写成这样,...

算法与编程之美 2495

java强制类型转换注意事项

1.强制类型转换一般不推荐使用,因为有可能发生精度损失,数据溢出等情况! 数据溢出; int num3 = (int)6000000000L; System.out.println(num3); 运行情况; 为什会这样? 这张图明白了吗? 老话可以说撒了 呵呵。 精度损失; int num4 = (int)3.5; System.out.println(num4); 运行情况; 怎么回事? 难道是四舍五入?那不应该4才对啊。 所以强制转换类型会有一系列隐患,慎用。 2.byte/short

weixin_50212958的博客 1916

Java泛型类型擦除导致的类型转换问题

初步结论:泛型类型转换不靠谱; 源码: package com.srie.testjava; public class TestClassDefine4<T> { public static void main(String[] args) { TestClassDefine4<String> t4 = new TestClas...

weixin_34198762的博客 291

引用数据类型之间的转换 [Java]

引用数据类型之间的转换 1.引用数据类型转换和基本数据类型转换一样也是分为两种: 第一种:自动类型转换 第二种:强制类型转换 自动类型转换:自动类型转换主要是指从小范围到大范围的转换 强制类型转换:主要是指从大范围到小范围的转换(也就是父类到子类的转换) 如果是小转大则不能使用强制类型转换,使用了就会编译出错 2.引用类型的转换必须要是发生在自己和自己或者父子类之间(也可以是爷孙关系,也就是必须要有继承关系,如果没有继承关系的话就会报错) 3.强制类型转换当中如果转换到的类型时引用指向的子类类型,但不是

m0_57001006的博客 2391

Java类型转换背后的奥妙

一、引用数据类型的强制转换 概述: 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是由于子类拥有比父类更多的属性功能,所以父类转换为子类需要强制。 定理 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。主要原因为:子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。 问题一:是不是只要强制转换都可以把父类转换为子类? 答案是否定的,当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定,也就说它的本质是不

qq_21488437的博客 569
上一篇: java中的instanceof用法
下一篇: Java 中父类怎么调用子类的方法? 和在子类调用父类的方法super
周末去看海
博客等级 码龄9年 50粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值