Java访问剪切板API控制台输出莫名异常

先说结论:在Idea等intellij的一众IDE里,Ctrl + C 默认是富文本复制,即会将格式一并放入剪切板中,而报错是因为Java剪切板API从剪切板拿到数据后会做解析,而又不认识intellij定义的类型,从而报错。如果仅是获取文本数据并不会报错。

====================以下为追踪过程:

Exception "java.lang.ClassNotFoundException: com/intellij/codeInsight/editorActions/FoldingData"while constructing DataFlavor for: application/x-java-jvm-local-objectref; class=com.intellij.codeInsight.editorActions.FoldingData
Exception "java.lang.ClassNotFoundException: com/intellij/codeInsight/editorActions/FoldingData"while constructing DataFlavor for: application/x-java-jvm-local-objectref; class=com.intellij.codeInsight.editorActions.FoldingData

访问awt剪切板代码时控制台输出以上错误,具体输出的代码为:

        clipTf = sysClip.getContents(null);

然而这个方法的实现非常简单:

public synchronized Transferable getContents(Object requestor) {
    return contents;
}

网上不少帖子说是因为Matlab和Idea(或者是Pycharm等intellij系的软件)同时运行着,Java虚拟机层面的错误。(同时说明,本人用的是Idea,所以以下以Idea来说明)

但在我看来并不是,首先我没有运行Matlab。同时我注意到

1. 从Idea中复制时会报错,从非Idea(比如notepad++)中复制文本便不会报错。
2. 先在Idea中复制代码,然后关闭Idea,手工编译代码,命令行运行。然而同样会报错。(我这里是想说明与运行Idea的JVM无关)
3. 在Idea中复制纯数字,报错信息会不同,如下:
Exception "java.lang.ClassNotFoundException: com/intellij/openapi/editor/RawText"while constructing DataFlavor for: application/x-java-jvm-local-objectref; class=com.intellij.openapi.editor.RawText
Exception "java.lang.ClassNotFoundException: com/intellij/openapi/editor/RawText"while constructing DataFlavor for: application/x-java-jvm-local-objectref; class=com.intellij.openapi.editor.RawText
Exception "java.lang.ClassNotFoundException: com/intellij/codeInsight/editorActions/FoldingData"while constructing DataFlavor for: application/x-java-jvm-local-objectref; class=com.intellij.codeInsight.editorActions.FoldingData
Exception "java.lang.ClassNotFoundException: com/intellij/codeInsight/editorActions/FoldingData"while constructing DataFlavor for: application/x-java-jvm-local-objectref; class=com.intellij.codeInsight.editorActions.FoldingData

于是猜测是Idea在我们复制时做了手脚,在剪切板放了字符串之外的信息,比如类型信息,字体等。而这些在Java解析时做了不正确的解析,导致报错。如果选择只是复制文本,即“Copy as Plain Text”,则不会报错。

或许可以通过使用Java提供的其他API来避免报错。(未完待续)

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

horo99

求个赞啦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值