【问题标题】:Getting ClassCastException in java在java中获取ClassCastException
【发布时间】:2011-08-26 05:54:28
【问题描述】:

您好,我收到以下异常

线程“main”java.lang.ClassCastException 中的异常:javax.mail.util.SharedByteArrayInputStream 无法转换为 javax.mail.Multipart

我在 Eclipse IDE 中没有遇到任何编译异常,但是当我尝试构建项目时,我遇到了这个异常。

构建项目后,我通过 java -jar 运行项目,因此它不满足 if(content instanceof Multipart) 条件,但是当我从 Eclipse IDE 运行时,它工作正常。任何指针都会对我有很大帮助

从 Eclipse IDE 我得到 megssage.getContent() 作为 javax.mail.internet.MimeMultipart@1dc0e7a 但是当使用 jar 文件运行时,我得到的内容为 javax.mail.util.SharedByteArrayInputStream@2f0d54

请你告诉我它们之间有什么区别。

修改后的代码为:

 InputStream inStream = null;
    if(!message.getContentType().contains("text/plain")){
        Object content = message.getContent();          
        if (message.isMimeType("multipart/*")) {  
            //message.isMimeType("multipart/*")||
            Multipart multipart = (Multipart) content;
            for (int j = 0; j < multipart.getCount(); j++) {
                BodyPart bodyPart = multipart.getBodyPart(j);
                inStream = bodyPart.getInputStream();
                fileName=bodyPart.getFileName();
                } 
        }
        else{
        System.out.println("content not instance of multipart");    
        }`enter code here`  

请任何人帮助我解决这个问题..

提前谢谢...

【问题讨论】:

  • 您确定您提供的是相同的来源吗?
  • 是的,我提供相同的来源......
  • 我在我的项目中看到了类似的东西,我注意到 getContent() 的文档指出“对于 DataHandler 系统未知的内容类型,输入流作为内容返回。”在不同的上下文中执行代码是否有可能创建使用不同 DataHandler 的消息?也许在 OP 的情况下,他的 Eclipse 类路径会找到构建 Message 的邮件类的不同版本,然后他的命令行类路径会找到,它们会实例化不同的 DataHandler。

标签: java exception classcastexception


【解决方案1】:

message.getContent() 在此处返回 javax.mail.util.SharedByteArrayInputStream,但 SharedByteArrayInputStream 不能转换为 Multipart 实例,因为您可能不一定有多部分消息。

您可以检查它的 mimetype 是否是多部分:

if (message.isMimeType("multipart/*") {
    Multipart mp = (Multipart)message.getContent();
    // more stuff
}

或者你可以做...的实例

if (message.getContent() instanceof Multipart) {
    Multipart mp = (Multipart)message.getContent();
    // more
}

【讨论】:

    【解决方案2】:

    您遇到了异常,因为getContent 的返回值是对javax.mail.util.SharedByteArrayInputStream 的引用,并且该类没有实现Multipart。大概这不是多部分邮件。

    正如Part.getContent 的文档所述:

    将内容作为 Java 对象返回。返回对象的类型当然取决于内容本身。例如,为“text/plain”内容返回的对象通常是一个字符串对象。为“multipart”内容返回的对象始终是 Multipart 子类。对于 DataHandler 系统未知的内容类型,输入流作为内容返回

    所以基本上如果你想以特定方式处理多部分消息,你需要使用:

    Object content = message.getContent();
    if (content instanceof Multipart)
    {
        Multipart multipart = (Multipart) content;
        // ...
    }
    else
    {
        // Handle non-multipart content
    }
    

    【讨论】:

    • 嗨,我得到的内容是 javax.mail.internet.MimeMultipart@289d2e,当我从 Eclipse IDE 运行项目时,它工作正常并且 if(content instanceof Multipart) 返回 true。但是当我尝试构建项目并使用 java -jar 运行时,它没有进入 if 循环并且条件不令人满意。构建项目后从 Eclipse IDE 运行和通过命令提示符运行有什么区别..你能帮帮我吗
    【解决方案3】:

    好的,这就是正在发生的事情。看起来您正试图从实现 javax.mail.Part 的对象中获取内容,但格式未知,在这种情况下为 MimeMessage will return an input stream。在这种情况下,它返回一个javax.mail.util.SharedByteArrayInputStream。无论如何,输入流无法转换为Multipart 接口。

    您可以使用isMimeType (birryree's suggestion) 测试它是否是 multipart 的实现者:

    if (message.isMimeType("multipart/*") 
    {
        Multipart multipart = (Multipart) content;
        // what you have above.
    }
    else
    {
        // it is not multi-part
    }
    

    或者您可以测试直接匹配(我最初的建议):

    // other string comparisons will work here too.
    if(message.getContentType().equals("multipart"))
    {
         Multipart multipart = (Multipart) message.getContent();
        // what you have above.
    }
    else
    {
        // it is not multi-part
    }
    

    getContentType 也在Part 接口上。可以在here找到它的文档。
    您可以看到所有可能的内容类型列表here

    或者你可以根据instanceof(Jon Skeet's answer)的结果进行测试:

    Object content = message.getContent();
    if (content instanceof Multipart)
    {
        Multipart multipart = (Multipart) content;
        // what you have above.
    }
    else
    {
        // it is not multi-part
    }
    

    【讨论】:

    • 嗨,我得到的内容是 javax.mail.internet.MimeMultipart@289d2e,当我从 Eclipse IDE 运行项目时,它工作正常并且 if(content instanceof Multipart) 返回 true。但是当我尝试构建项目并使用 java -jar 运行时,它没有进入 if 循环并且条件不令人满意。构建项目后从 Eclipse IDE 运行和通过命令提示符运行有什么区别..你能帮帮我吗
    【解决方案4】:

    对于未知的 mime 类型,MimeMessage 类返回 ShraedByteArrayInputstream,正如 documentation 所说。

    使用instanceof 检查返回类型,然后进行强制转换。

    更新:

    如果您使用的源与在 Eclipse 中使用的源相同,并且 getContent() 方法的响应仍然不同,那么您可以尝试修改 file.encoding 属性。

    例子:

    java -Dfile.encoding=UTF8 -jar something.jar
    

    更新2:

    可能在您的 jar 中使用了旧版本的已加载类。请检查您的类路径以查找已加载的类。

    【讨论】:

    • 仍然 getContent() 方法从 Eclipse 到命令行是不同的
    【解决方案5】:

    导出Runnable jar文件时,选择将需要的库打包到生成的JAR中,即可解决问题。

    这可能是因为某些字符集无法正确找到,所以返回的多部分对象没有被解析。

    【讨论】:

      猜你喜欢
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      相关资源
      最近更新 更多