当前位置:   article > 正文

Java访问剪切板API控制台输出莫名异常_exception "java.lang.classnotfoundexception: com/i

exception "java.lang.classnotfoundexception: com/intellij/codeinsight/editor

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

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

  1. 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
  2. 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);

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

  1. public synchronized Transferable getContents(Object requestor) {
  2. return contents;
  3. }

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

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

  1. 1. 从Idea中复制时会报错,从非Idea(比如notepad++)中复制文本便不会报错。
  2. 2. 先在Idea中复制代码,然后关闭Idea,手工编译代码,命令行运行。然而同样会报错。(我这里是想说明与运行Idea的JVM无关)
  3. 3. 在Idea中复制纯数字,报错信息会不同,如下:
  1. 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
  2. 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
  3. 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
  4. 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来避免报错。(未完待续)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/313520
推荐阅读
相关标签
  

闽ICP备14008679号