idea插件报错如下 如何解决java.lang.Throwable: Read access is allowed from inside read-action (or EDT) only (see com.intellij.openapi.application.Application.runReadAction()) at com.intellij.openapi.diagnostic.Logger.error(Logger.java:202) at com.intellij.openapi.application.impl.ApplicationImpl.assertReadAccessAllowed(ApplicationImpl.java:1056) at com.intellij.openapi.editor.impl.CaretImpl.validateContext(CaretImpl.java:1319) at com.intellij.openapi.editor.impl.CaretImpl.getOffset(CaretImpl.java:659) at com.ts.rubikstudioforas.listener.MyCompletionContributor.fillCompletionVariants$lambda$0(MyCompletionContributor.kt:47) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833)
时间: 2023-08-05 10:06:32 浏览: 437
这个错误通常是因为在非 EDT(Event Dispatch Thread)线程中尝试访问 Swing 组件。你可以使用 `ApplicationManager.getApplication().invokeLater()` 方法来确保代码在 EDT 线程中执行。例如,你可以这样修改代码:
```
ApplicationManager.getApplication().invokeLater {
// 在此处放置你的代码
}
```
这将确保代码在 EDT 线程中执行,并且不会触发读取操作的异常。
相关问题
idea插件 报错 java.lang.Throwable: Read access is allowed from inside read-action (or EDT) only (see com.intellij.openapi.application.Application.runReadAction())
这个错误表示你正在从非UI线程尝试读取IDEA的数据模型。IDEA要求你只能在UI线程中读取它的数据模型,以确保线程安全。解决这个问题的方法是,在访问数据模型之前,你需要在IDEA的读取操作(runReadAction)中执行代码块,以确保代码块在UI线程中运行。以下是一个示例代码:
```
ApplicationManager.getApplication().invokeLater(() -> {
ApplicationManager.getApplication().runReadAction(() -> {
// 在这里执行读取操作
});
});
```
你可以将你的读取操作放在runReadAction()方法内部,以确保它在UI线程中运行。
idea插件报错 java.lang.Throwable: Read access is allowed from inside read-action (or EDT) only (see com.intellij.openapi.application.Application.runReadAction())问题如何解决 详细代码
这个错误通常是因为插件在非UI线程中访问了UI组件。解决方法是在访问UI组件之前,使用`ApplicationManager.getApplication().invokeAndWait()`或`ApplicationManager.getApplication().invokeLater()`方法将访问UI组件的代码包装在UI线程中执行。这样就可以避免这个错误。
下面是一个简单的例子,展示如何在插件中正确访问UI组件:
```java
public void actionPerformed(AnActionEvent e) {
Project project = e.getProject();
if (project != null) {
ApplicationManager.getApplication().invokeLater(() -> {
// 访问UI组件
Messages.showMessageDialog(project, "Hello World!", "Greeting", Messages.getInformationIcon());
});
}
}
```
在这个例子中,我们在`invokeLater()`方法中包装了访问UI组件的代码。这样就可以避免`Read access is allowed from inside read-action (or EDT) only`的错误。注意,`invokeLater()`方法是异步执行的,如果您希望在访问UI组件后执行其他操作,可以考虑使用`invokeAndWait()`方法代替。
希望这个例子可以帮助您解决问题。如果您需要更详细的帮助,请提供更多上下文信息和代码示例。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)