先说结论:在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来避免报错。(未完待续)