手把手教你解决ClassCastException类型转换异常

这篇具有很好参考价值的文章主要介绍了手把手教你解决ClassCastException类型转换异常。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

. 前言

最近有很多初学Java的小伙伴,甚至是学习到了JavaWeb及框架阶段的小伙伴,跑来问千锋健哥:该如何解决Java中的ClassCastException类型转换异常?为了给大家解决这个较为普遍的问题,健哥今天就在这里,手把手地教大家分析解决掉这个异常,希望你以后再遇到类似的问题时可以轻松搞定它。

. 异常现象

下面我们先来看看这个既简单,又经常会出的类型转换异常ClassCastException。首先我们得搞出这样的一个异常,下面这段代码运行后就会抛出ClassCastException类型转换异常。

1.Teacher接口代码

 package com.qf.pojo;

/**
 * @author 千锋健哥
 */
public interface Teacher {

    /**
     * 输入学科名字, 返回讲师可以讲哪些科目内容
     * @param subject
     * @return
     */
    public String teach(String subject);
}

2.JavaTeacher实现类代码

package com.qf.pojo;

/**
 * Java学科讲师实现类
 * @author 千锋健哥
 */
public class JavaTeacher implements Teacher {

    @Override
    public String teach(String subject) {
        return subject + "学科讲师, 可以讲业界最流行的分布式微服务架构, 以及企业解决方案";
    }
}

3.H5Teacher实现类代码

package com.qf.pojo;

/**
 * H5讲师实现类
 * @author 千锋健哥
 */
public class H5Teacher implements Teacher{

    @Override
    public String teach(String subject) {
        return subject + "学科讲师, 可以讲html, css, javascript";
    }
}

4.测试代码

package test;

package com.qf.test;

import com.qf.pojo.H5Teacher;
import com.qf.pojo.JavaTeacher;
import com.qf.pojo.Teacher;

/**
 * 测试类型转换异常
 * @author 千锋健哥
 */
public class TestCastException {

    public static void main(String[] args) {
        Teacher teacher1 = new JavaTeacher();
        Teacher teacher2 = new H5Teacher();
        System.out.println("======" + teacher1.teach("JavaEE"));
        System.out.println("======" + teacher2.teach("H5"));

        //向下转型, 正常转型
        JavaTeacher javaTeacher = (JavaTeacher)teacher1;
        //向下转型, ClassCastException异常
        H5Teacher h5Teacher = (H5Teacher)teacher1;

    }
}

5.运行结果

手把手教你解决ClassCastException类型转换异常

上面的代码运行后,就产生了如上图所示的类型转换异常,那么该问题是怎么产生的,又该怎么解决呢?我们继续往下看!

. 异常原因

接下来健哥来给各位小伙伴解释下这个异常产生的原因

  1. 从上面我们设计的例子来看,java.lang.ClassCastException是进行强制类型转换时产生的异常。强制类型转换的前提是父类引用指向的对象类型是子类时才可以进行强制类型转换所以如果父类引用指向的对象类型不是子类时,就会产生java.lang.ClassCastException异常。

  2. 例如 : JavaTeacher javaTeacher = (JavaTeacher)teacher1; 就可以正常转换,因为teacher1的类型就是JavaTeacher 类型。

  3. H5Teacher h5Teacher = (H5Teacher)teacher1; 就会发生异常,因为teacher1是JavaTeacher类型,而不是H5Teacher 类型,类型不匹配,所以就会产生java.lang.ClassCastException异常。

现在你明白为什么会出现ClassCastException异常了吗?那又该如何解决呢?

. 解决办法

既然问题原因我们找到了那么接下来可以很容易解决了

  1. 遇到这样异常的时候,如果你知道要访问对象的具体类型,直接转换成该类型即可;

  2. 例如 : H5Teacher h5Teacher = (H5Teacher)teacher1; 这句代码改为H5Teacher h5Teacher = (H5Teacher)teacher2 就可以了,因为 teacher2的类型就是H5Teacher 类型。

五. 结

所谓的ClassCastException类型转换异常,其实本质上就是被转换的类型不匹配,我们只需要直接将引用对象的类型和被转换的对象类型改成一致的类型,就可以完美解决了。

 文章来源地址https://www.toymoban.com/news/detail-454967.html

到了这里,关于手把手教你解决ClassCastException类型转换异常的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你解决微软Visual Studio 2022的scanf()返回值被忽略问题(图文详解)

    大家好,我是荔园微风,作为一名在IT界整整25年的老兵,听闻广大初学者在学习Visual Studio 2022时,刚上手用其写C/C++程序时,总是会被一个问题困惑,这个问题叫: scanf()返回值被忽略。我们一起来看一下。 比如写了一个计算圆周的程序,结果还没运行, scanf()下方就出现绿

    2024年02月07日
    浏览(24)
  • 【electron】手把手教你在 electron 环境下使用 vue-devtools,附详细报错解决办法

    描述 对于某些electron项目,启动的时候,控制台会打印 Failed to fetch extension, trying 4 more times 这样的日志。 作为重度强迫症患者,必须解决掉。 环境 版本号 描述 文章日期 2023-10-12 操作系统 Windows electron 22.3.27 最后一个支持win7的大版本 node 16.16.0 vue-devtools 6.5.1 Vue Devtools 是一款

    2024年02月07日
    浏览(30)
  • 手把手教你SHA-256

    SHA-256是SHA-2协议簇的一部分,也是当前最流行的协议算法之一。在本篇文章中,我们会了解这个密码学算法的每一个步骤,并且通过实例演示。SHA-2因它的安全性(比SHA-1强很多)和速度为人所知。在没有键(keys)生成的情况下,例如挖掘比特币,像SHA-2这样的快速哈希算法很

    2024年02月13日
    浏览(30)
  • 手把手教你暴力破解

    暴力破解是一种攻击手段,使用大量的认证信息在认证接口尝试登录,直到得到正确的结果。 2.1标题基于表单的暴力破解 2.1.1 第一步:打开burpsuite拦截 2.1.2 第二步:将拦截到的包右击发送到intruder模块 (其中简单介绍一下intruder模块) Target主要是设置暴力破解访问的host地址

    2024年02月07日
    浏览(28)
  • 手把手教你做主成分分析

    主成分分析是一种降维处理的统计方法,实践中有三个应用场景: 信息浓缩:将多个分析项浓缩成几个关键概括性指标; 权重计算:利用方差解释率值计算各概括性指标的权重; 综合评价:基于主成分得分构造综合得分数据,用于综合评价。 接下来,以一个具体案例来学习

    2024年02月01日
    浏览(31)
  • 手把手教你落地DDD

    一、前言 常见的DDD实现架构有很多种,如经典四层架构、六边形(适配器端口)架构、整洁架构(Clean Architecture)、CQRS架构等。架构无优劣高下之分,只要熟练掌握就都是合适的架构。本文不会逐个去讲解这些架构,感兴趣的读者可以自行去了解。 本文将带领大家从日常的

    2024年02月16日
    浏览(22)
  • 手把手教你实战TDD

    领域驱动设计,测试驱动开发。 我们在《手把手教你落地DDD》一文中介绍了领域驱动设计(DDD)的落地实战,本文将对测试驱动开发(TDD)进行探讨,主要内容有:TDD基本理解、TDD常见误区、TDD技术选型,以及案例实战。希望通过本文,读者能够理解掌握TDD并将其应用于实际

    2024年02月08日
    浏览(20)
  • 保姆级,手把手教你解决微软Visual Studio 2022的scanf()返回值被忽略问题(每个步骤都配图且标记)

        关于这个问题也是对于小白的我困惑的很是难受,也是收集了一些这方面的信息,基本上都是干货就,若是有不足和疏忽错误的地方还望见谅~ 这是因为由于编译器Visual Studio 的原因Microsoft公司觉得scanf 不安全 因此自定义的scanf_s,在 ANISC中只有scanf(),没有scanf() ,因此会

    2024年02月05日
    浏览(26)
  • 手把手教你用代码画架构图

    作者:京东物流 覃玉杰 本文将给大家介绍一种简洁明了软件架构可视化模型——C4模型,并手把手教大家如何使用 代码 绘制出精美的C4架构图。 阅读本文之后,读者画的架构图将会是这样的: 注:该图例仅作绘图示例使用,不确保其完整性、可行性。 C4是软件架构可视化

    2024年02月04日
    浏览(29)
  • 手把手教你彻底卸载MySQL

    ❤写在前面 ❤博客主页: 努力的小鳴人 ❤系列专栏: MySQL8.0基础学习 ❤欢迎小伙伴们, 点赞👍关注🔎收藏🍔 一起学习! ❤如有错误的地方,还请小伙伴们指正!🌹 ​ 目录 步骤1:停止MySQL服务 步骤2:软件的卸载 步骤3:残余文件的清理 步骤4:清理注册表 步骤5:删除

    2024年02月05日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包