本文介紹了如何解決java2D中的ClassCastException(錯誤ID 7172749)的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我很倒霉,因為我在java8中遇到了一個錯誤,
對于其他任何人來說,這似乎都不是什么大問題,因此Oracle不會在java9之前修復它。
錯誤具有Bug-ID 7172749(還請注意相關和重復的錯誤)
在某個Linux機器上,它總是經常發生。
我在帶有jdk1.8.0_u66的Ubuntu 14.04.3 LTS上遇到了這個問題。
但是,在另一個安裝了Ubuntu12.04.3LTS和相同的JDK版本的機器上,我根本無法重現這個問題。
讓我迷惑不解的是,這似乎并沒有給其他任何人帶來驚喜,所以我猜我可能犯了一個特別嚴重的錯誤。
我運行的是Oracle-JDK(與OpenJDK相反),因為我們的客戶使用相同的版本(盡管是在Windows上),并且我們的想法是接近他們的環境。
所以,我的問題是,如何繞過這個問題(例如,安裝X11庫XY,使用Magic-XXjava2dailsafe參數啟動我的java程序,或者類似的東西)
并加入到可以放心地等待甲骨文解決實際問題的人群中嗎?
致以最誠摯的問候
TOBI
順便說一下,我的堆棧如下所示:
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)
[...]
推薦答案
我想出了解決此問題的方法。
簡而言之:使用參數-Dsun.java2d.xrender=false
啟動JVM。
使用該選項,我不再看到問題。
背景信息
Bug JDK-7172749最近已使用jdk9內部版本124進行了修復,該錯誤修復已通過JDK-8158068回傳到jdk8更新112。您可以從以下位置下載jdk8u112構建預覽:JDK8 Early Access Releases。
但是,運行此生成沒有為我解決問題。
我的情況,我遇到了錯誤:我正在運行jEdit,在從掛起到RAM恢復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或部分的整個窗口不會繪制并且保持白色。
查看patch for the backported bugfix,它實際上修復了不同類(即sun.java2d.xr.XRRenderer
)中的ClassCastException。
所以,這沒有解決我的問題也就不足為奇了。
另一次Google搜索顯示bug JDK-6975408,這使我意識到系統屬性sun.java2d.xrender
。
更多搜索:
此選項在System Properties for Java 2D Technology
中介紹
報價:
xender
目標用途:為基于X11的現代臺式機啟用基于XRender的Java 2D呈現管道,提供更高的圖形性能。
介紹:Java SE 7
默認值:false
使用方法:管道默認禁用,但可以通過設置命令行屬性
-Dsun.java2d.xrender=true
啟用。較早的X11配置可能無法支持XRender。詳細形式-Dsun.java2d.xrender=True
可用于將消息啟用到標準輸出,指示管道是否已實際啟用。
是的,這是Java7中添加的功能:Xrender pipeline now in JDK7 master
另請參閱Enhancements in Java SE 7
在Java8中,現在默認啟用:Java8: Xrender Java2D pipeline enabled by default
根據本博客的評論,XRender管道僅與Java2D、AWT和Swing相關-其他GUI框架(JavaFX、SWT等)不受影響:
基于Swing/AWT的應用程序應該會受益,swt/JavaFX/lwjgl/jogl使用其他與Java2D無關的代碼路徑。
我在發行說明中沒有發現什么,但是在源代碼中,很明顯,XRender管道在默認情況下是啟用的:sun/awt/X11GraphicsEnvironment.java
改變了這一點的已經在2011年完成了,根據第一個jdk8版本的說法,它一直都是啟用的。([3-11]>在2011年已經完成了,根據ticket的說法,它總是在第一個jdk8版本中啟用。
我想,我之前沒有經歷過這個錯誤的原因是,我可能將java7作為運行時使用了相當長的時間,并且Eclipse沒有受到影響。
/li>
再次仔細查看重復的錯誤報告,已經有一個與堆棧跟蹤匹配:
bug 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錯誤票證
現在有一個新的Java錯誤票證:JDK-8160328
更新3-已使用jdk-9-ea-b131修復
錯誤票證JDK-8160328已作為JDK-8147542的副本關閉-此錯誤票證已使用latest EA build for java 9(內部版本131及更高版本)修復。
我可以確認,使用xrandr切換顯示器時不再出現ClassCastException。
這篇關于如何解決java2D中的ClassCastException(錯誤ID 7172749)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,