Java中的JIT错误

Java中的JIT错误,java,websphere,jit,Java,Websphere,Jit,以下Java代码: private void a(Object paramObject) throws IOException { if ((paramObject instanceof Socket)) { this.o = ((Socket)paramObject).getOutputStream(); this.i = ((Socket)paramObject).getInputStream(); } else { this.

以下Java代码:

private void a(Object paramObject) throws IOException {
    if ((paramObject instanceof Socket)) {
        this.o = ((Socket)paramObject).getOutputStream();
        this.i = ((Socket)paramObject).getInputStream();
    } else {
        this.o = new FileOutputStream(((RandomAccessFile)paramObject).getFD());
        this.i = new BufferedInputStream(
            new FileInputStream(((RandomAccessFile)paramObject).getFD()), 65536);
    }
}
偶尔会产生以下异常,但仅当在WebSphere中的IBM Java VM中运行时:

java.lang.ClassCastException: java.net.Socket incompatible with java.io.RandomAccessFile
没有其他Java虚拟机存在此问题。我认为这一定是由于IBMJavaVM中的JIT错误造成的。参数只能是
java.net.Socket
java.io.RandomAccessFile
。对象是在同一类中创建的。这也不可能是类加载器的问题


我应该如何修改我的代码来避免这个问题?

如果这确实是一个JIT错误(坦率地说,我在这里没有看到这个异常的任何其他原因),那么很难确切地告诉您什么样的更改可能会阻止这个问题

一个小小的改变(交换if块并否定检查)可能会有所帮助,但同样可以做到的是,这里几乎没有什么可以做的


最安全的方法可能是完全禁用此方法的JIT编译。不幸的是,这样做的过程因JVM而异(有些JVM可能根本不支持!)。

我同意Joachim Sauer的观点,代码看起来不错

您可以将代码重构为两种方法,一种用于
套接字
,另一种用于
随机访问文件
。这可能会有所帮助,因为在内部,参数变量可能会附加类型信息

你可以做的另一件事是:

if (paramObject instanceof Socket) {
  handleSocket((Socket) paramObject);
} else if (paramObject instanceof RandomAccessFile) {
  handleRandomAccessFile((RandomAccessFile) paramObject);
} else {
  throw new IllegalStateException(paramObject.getClass() + paramObject.getClass().getClassLoader());
  // plus more information that you might need.
}

您正在导入的IBMJVM中可能有多个不同的套接字类可用吗?顺便说一下:向IBM报告此影响,并提交一个bug。他们可能只是修复了它。@Bringer128:我也想到了这一点,但对于
java.*
类来说,这是非常不可能的(你必须跳出一些严重的障碍来重新定义它)。@Bringer128套接字的实例是在同一个类中创建的,带有new。我不知道同一类的两个方法如何与同名的两个不同类一起工作。@Joachim Sauer有一个bug报告。但IBM目前无法复制它。否则,如果它是可指责的,它可能需要很长时间来修复。