当前位置:  开发笔记 > 编程语言 > 正文

我如何解决java2d中的ClassCastException(Bug-ID 7172749)

如何解决《我如何解决java2d中的ClassCastException(Bug-ID7172749)》经验,为你挑选了1个好方法。

我有幸遭遇java8中的一个错误,对于其他任何人来说这似乎都不是一个大问题,因此Oracle不会在java9之前修复它.
该缺陷有错误-ID 7172749(还要注意相关的和重复的错误),它只是碰巧所有的时间有一定的Linux机器上.
我在使用jdk1.8.0_u66的Ubuntu 14.04.3 LTS上遇到了问题.
但是,在Ubuntu 12.04.3 LTS和相同 JDK版本的另一个盒子上,我根本无法重现这个问题.

让我感到困惑的是,对于其他任何人来说,这似乎并不是一个显而易见的事情,所以我想也许我正在犯一个特别的转储错误.我正在运行Oracle-JDK(而不是OpenJDK),因为我们的客户使用相同的版本(尽管在Windows上)并且想法是接近他们的环境.

所以,我的问题是,如何解决这个问题(例如,安装X11-library xy,使用魔法-XXjava2dfailsafe参数启动我的java程序或沿着这些行开始)
并加入一群可以舒服地等待实际的人问题由oracle修复?

最好的问候Tobi

顺便说一句,我的stackstrace看起来像这样:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sun.awt.image.BufImgSurfaceData cannot be cast to sun.java2d.xr.XRSurfaceData
    at sun.java2d.xr.XRPMBlitLoops.cacheToTmpSurface(XRPMBlitLoops.java:145)
    at sun.java2d.xr.XrSwToPMBlit.Blit(XRPMBlitLoops.java:353)
    at sun.java2d.SurfaceDataProxy.updateSurfaceData(SurfaceDataProxy.java:498)
    at sun.java2d.SurfaceDataProxy.replaceData(SurfaceDataProxy.java:455)
    at sun.java2d.SurfaceData.getSourceSurfaceData(SurfaceData.java:233)
    at sun.java2d.pipe.DrawImage.renderImageCopy(DrawImage.java:566)
    at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:67)
    at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1014)
    at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3318)
    at sun.awt.image.ImageRepresentation.drawToBufImage(ImageRepresentation.java:813)
    at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1021)
[...]

adangel.. 14

我找到了问题的解决方法.

简而言之:使用参数启动JVM -Dsun.java2d.xrender=false.

有了这个选项,我再也没有看到问题了.

背景资料

该错误JDK-7172749现在最近被固定jdk9建立124和bug修复已经通过被移植JDK-8158068到jdk8更新112您也可以下载jdk8u112从这里建立预览:JDK8早期访问发布.

但是,运行此版本并没有解决我的问题.

我的情况,我遇到了这个错误:我正在运行jEdit,在从Linux挂起恢复Linux后,我看到了这些ClassCastException.它是相同的堆栈跟踪:

10:04:10 [AWT-EventQueue-0] [error] AWT-EventQueue-0: java.lang.ClassCastException: sun.awt.image.BufImgSurfaceData cannot be cast to sun.java2d.xr.XRSurfaceData
10:04:10 [AWT-EventQueue-0] [error] AWT-EventQueue-0:  at sun.java2d.xr.XRPMBlitLoops.cacheToTmpSurface(XRPMBlitLoops.java:145)

此异常的效果是,jEdit或部件的整个窗口未绘制并保持白色.

查看后向错误修正的补丁,它实际上修复了一个不同类的ClassCastException,即in sun.java2d.xr.XRRenderer.

所以,这不能解决我的问题并不令人惊讶.

另一个谷歌搜索显示错误JDK-6975408让我意识到系统属性sun.java2d.xrender.

更多搜索:

Java 2D技术的系统属性中描述了此选项

引用:

XRENDER

预期用途:为现代基于X11的桌面启用基于XRender的Java 2D渲染管道,提供改进的图形性能.

介绍: Java SE 7

默认值: false

使用方法:默认情况下禁用管道,但可以通过设置命令行属性来启用管道-Dsun.java2d.xrender=true.较旧的X11配置可能无法支持XRender.详细形式,-Dsun.java2d.xrender=True可用于启用stdout消息,指示管道是否实际启用.

是的,这是一个功能,已经添加了Java7:Xrender管道现在在JDK7 master中

另请参阅Java SE 7中的增强功能

使用Java8,它现在默认启用:Java8:默认情况下启用Xrender Java2D管道

根据这篇博客的评论,XRender管道仅与Java2D,AWT和Swing相关 - 其​​他GUI框架(JavaFX,SWT,...)不受影响:

基于Swing/AWT的应用程序应该受益,SWT/JavaFX/lwjgl/jogl使用与Java2D无关的其他代码路径.

我没有在发行说明中找到任何内容,但在源代码中,显而易见的是,XRender管道默认启用:sun/awt/X11GraphicsEnvironment.java改变了这一点 的提交,已在2011年完成,根据在售票它总是与第一jdk8释放.我想,我之前没有遇到过这个bug的原因是,我可能使用java7作为运行时间很长而且eclipse不受影响.

仔细查看重复的错误报告,已经有一个与堆栈跟踪匹配:

这是错误JDK-8133723:sun.awt.image.BufImgSurfaceData无法转换为sun.java2d.xr.XRSurfaceData - 它实际上并不重复......但是,重现此错误可能很困难.它只在暂停到RAM周期后出现.

更新1 - 触发器

通过使用xrandr更改输出显示来触发错误,例如

xrandr --output eDP1 --auto --output DVI-1-0 --off

将立即导致ClassCastException.当我在暂停之前插上我的显示器时,我认为,这是暂停 - 恢复造成这种情况,但这是错误的.

更新2 - 新的Java Bug票证

现在有一个新的java bug票证:JDK-8160328

更新3 - 使用jdk-9-ea-b131修复

错误票据JDK-8160328已作为JDK-8147542的副本关闭- 并且已使用针对java 9(build 131及更高版本)的最新EA构建修复了此错误.

我可以确认,在使用xrandr切换监视器时,我不再获得ClassCastException.



1> adangel..:

我找到了问题的解决方法.

简而言之:使用参数启动JVM -Dsun.java2d.xrender=false.

有了这个选项,我再也没有看到问题了.

背景资料

该错误JDK-7172749现在最近被固定jdk9建立124和bug修复已经通过被移植JDK-8158068到jdk8更新112您也可以下载jdk8u112从这里建立预览:JDK8早期访问发布.

但是,运行此版本并没有解决我的问题.

我的情况,我遇到了这个错误:我正在运行jEdit,在从Linux挂起恢复Linux后,我看到了这些ClassCastException.它是相同的堆栈跟踪:

10:04:10 [AWT-EventQueue-0] [error] AWT-EventQueue-0: java.lang.ClassCastException: sun.awt.image.BufImgSurfaceData cannot be cast to sun.java2d.xr.XRSurfaceData
10:04:10 [AWT-EventQueue-0] [error] AWT-EventQueue-0:  at sun.java2d.xr.XRPMBlitLoops.cacheToTmpSurface(XRPMBlitLoops.java:145)

此异常的效果是,jEdit或部件的整个窗口未绘制并保持白色.

查看后向错误修正的补丁,它实际上修复了一个不同类的ClassCastException,即in sun.java2d.xr.XRRenderer.

所以,这不能解决我的问题并不令人惊讶.

另一个谷歌搜索显示错误JDK-6975408让我意识到系统属性sun.java2d.xrender.

更多搜索:

Java 2D技术的系统属性中描述了此选项

引用:

XRENDER

预期用途:为现代基于X11的桌面启用基于XRender的Java 2D渲染管道,提供改进的图形性能.

介绍: Java SE 7

默认值: false

使用方法:默认情况下禁用管道,但可以通过设置命令行属性来启用管道-Dsun.java2d.xrender=true.较旧的X11配置可能无法支持XRender.详细形式,-Dsun.java2d.xrender=True可用于启用stdout消息,指示管道是否实际启用.

是的,这是一个功能,已经添加了Java7:Xrender管道现在在JDK7 master中

另请参阅Java SE 7中的增强功能

使用Java8,它现在默认启用:Java8:默认情况下启用Xrender Java2D管道

根据这篇博客的评论,XRender管道仅与Java2D,AWT和Swing相关 - 其​​他GUI框架(JavaFX,SWT,...)不受影响:

基于Swing/AWT的应用程序应该受益,SWT/JavaFX/lwjgl/jogl使用与Java2D无关的其他代码路径.

我没有在发行说明中找到任何内容,但在源代码中,显而易见的是,XRender管道默认启用:sun/awt/X11GraphicsEnvironment.java改变了这一点 的提交,已在2011年完成,根据在售票它总是与第一jdk8释放.我想,我之前没有遇到过这个bug的原因是,我可能使用java7作为运行时间很长而且eclipse不受影响.

仔细查看重复的错误报告,已经有一个与堆栈跟踪匹配:

这是错误JDK-8133723:sun.awt.image.BufImgSurfaceData无法转换为sun.java2d.xr.XRSurfaceData - 它实际上并不重复......但是,重现此错误可能很困难.它只在暂停到RAM周期后出现.

更新1 - 触发器

通过使用xrandr更改输出显示来触发错误,例如

xrandr --output eDP1 --auto --output DVI-1-0 --off

将立即导致ClassCastException.当我在暂停之前插上我的显示器时,我认为,这是暂停 - 恢复造成这种情况,但这是错误的.

更新2 - 新的Java Bug票证

现在有一个新的java bug票证:JDK-8160328

更新3 - 使用jdk-9-ea-b131修复

错误票据JDK-8160328已作为JDK-8147542的副本关闭- 并且已使用针对java 9(build 131及更高版本)的最新EA构建修复了此错误.

我可以确认,在使用xrandr切换监视器时,我不再获得ClassCastException.


@tokam我不这么认为.该错误非常特定于linux/solaris实现(例如[xrender库]的使用(https://en.wikipedia.org/wiki/X_Rendering_Extension))
推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有