在java中获取ClassCastException

时间:2011-08-26 05:54:29

标签: java exception classcastexception

您好我得到以下异常

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

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

在构建项目之后,我通过java -jar运行项目,因此它不满足if(内容实例的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`  

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

提前致谢...

5 个答案:

答案 0 :(得分:5)

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
}

答案 1 :(得分:1)

您收到异常,因为getContent的返回值是对javax.mail.util.SharedByteArrayInputStream的引用,而该类未实现Multipart。据推测,这不是多部分邮件消息。

正如Part.getContent所述的文档:

  

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

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

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

答案 2 :(得分:1)

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

您可以使用isMimeTypebirryree's suggestion)测试它是否是多部分的实施者:

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
}

答案 3 :(得分:1)

对于未知的mime类型,MimeMessage类返回ShraedByteArrayInputstreamdocumentation表示。

使用instanceof检查返回类型,然后进行投射。

更新

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

示例:

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

UPDATE2:

也许你的jar中使用了旧版本的加载类。请检查您的类路径中是否有已加载的类。

答案 4 :(得分:0)

导出Runnable jar文件时,选择将所需的包打包到生成的JAR中,这样可以解决问题。

这可能是因为无法正确找到某些字符集,因此不会解析返回的多部分对象。