在java中获取ClassCastException

在java中获取ClassCastException,java,exception,classcastexception,Java,Exception,Classcastexception,嗨,我得到以下异常 线程“main”java.lang.ClassCastException中的异常:javax.mail.util.SharedByteArrayInputStream无法转换为javax.mail.Multipart 我在EclipseIDE中没有得到任何编译异常,但是当我尝试构建项目时,我得到了这个异常 在构建项目之后,我通过java-jar运行项目,因此它不满足if(content instanceof Multipart)条件,但当我从EclipseIDE运行时,它工作

嗨,我得到以下异常

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

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

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

从EclipseIDE中,我得到了javax.mail.internet形式的megsage.getContent()。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`  
InputStream-inStream=null;
如果(!message.getContentType()包含(“文本/普通”)){
对象内容=message.getContent();
如果(message.isMimeType(“multipart/*”){
//message.isMimeType(“multipart/*”)||
多部分多部分=(多部分)内容;
对于(int j=0;j
请任何人帮我解决这个问题


提前感谢…

您得到了一个异常,因为
getContent
的返回值是对
javax.mail.util.SharedByteArrayInputStream的引用,而该类没有实现
Multipart
。可能这不是一个多部分邮件消息

正如
Part.getContent
的文档所述:

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

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

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

好的,下面是发生的情况。看起来您试图从实现javax.mail.Part的对象获取内容,但格式未知,在这种情况下是mimessage。在这种情况下,它返回一个
javax.mail.util.SharedByteArrayInputStream
。无论如何,输入流不能转换为
多部分界面

您可以使用()测试它是否是multipart的实现者:

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

getContentType也位于
部分
界面上。可以找到它的文档。
您可以看到所有可能的内容类型的列表

或者您可以基于instanceof()的结果进行测试:


对于未知的mime类型,MimeMessage类返回
ShraedByteArrayInputstream
,如图所示

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

更新:

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

例如:

java -Dfile.encoding=UTF8 -jar something.jar
更新2:

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

message.getContent()
在此处返回
javax.mail.util.SharedByteArrayInputStream
,但是
SharedByteArrayInputStream
不能强制转换为
多部分
实例,因为您可能不必具有多部分消息

您可以检查其mimetype是否为多部分:

if (message.isMimeType("multipart/*") {
    Multipart mp = (Multipart)message.getContent();
    // more stuff
}
或者你可以做一个

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

导出可运行jar文件时,选择将所需库打包到生成的jar中,这就解决了问题


这可能是因为找不到正确的字符集,因此返回的多部分对象未被解析。

Hi,我得到的内容是javax.mail.internet。MimeMultipart@289d2e,当我从EclipseIDE运行项目时,它的工作状态良好,如果(多部分的内容实例)返回true。但是当我尝试构建项目并使用java-jar运行时,它没有进入if循环,条件也不令人满意。在构建项目后从eclipse IDE运行和通过命令提示符运行有什么区别..你能帮助我吗?我得到的内容是javax.mail.internet.MimeMultipart@289d2e,当我从EclipseIDE运行项目时,它的工作状态良好,如果(多部分的内容实例)返回true。但是当我尝试构建项目并使用java-jar运行时,它没有进入if循环,条件也不令人满意。在构建项目后从eclipse IDE运行和通过命令提示符运行之间的区别是什么..你能帮我确定你提供了相同的源代码吗?是的,我提供了相同的源代码……我在我的项目中看到了类似的东西,我注意到getContent()的文档状态“对于DataHandler系统未知的内容类型,输入流作为内容返回。”是否可能在不同的上下文中执行代码会创建一个使用不同数据处理程序的消息?可能在OPs的情况下,他的eclipse类路径找到了构造消息的邮件类的不同版本,然后他的命令行类路径找到了,并且它们实例化了不同的数据处理程序。仍然是getC
java -Dfile.encoding=UTF8 -jar something.jar
if (message.isMimeType("multipart/*") {
    Multipart mp = (Multipart)message.getContent();
    // more stuff
}
if (message.getContent() instanceof Multipart) {
    Multipart mp = (Multipart)message.getContent();
    // more
}