BasLeijdekkers / MetricsReloaded

Automated source code metrics plugin for IntelliJ IDEA
http://plugins.intellij.net/plugin/?id=93
165 stars 31 forks source link

Metrics UI loading error - Zero length string passed to TextLayout constructor #66

Closed sudhanmoghe closed 3 years ago

sudhanmoghe commented 4 years ago

IntelliJ IDEA 2020.2.1 (Ultimate Edition) Build #IU-202.6948.69, built on August 24, 2020

Runtime version: 11.0.8+10-b944.31 x86_64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. macOS 10.15.6

Registry: debugger.watches.in.variables=false Non-Bundled Plugins: PojoToJson, SequenceDiagram, org.zalando.intellij.swagger, MavenRunHelper, MetricsReloaded, izhangzhihao.rainbow.brackets

java.lang.IllegalArgumentException: Zero length string passed to TextLayout constructor. at java.desktop/java.awt.font.TextLayout.(TextLayout.java:382) at java.desktop/java.awt.Font.getStringBounds(Font.java:2617) at java.desktop/java.awt.Font.getStringBounds(Font.java:2522) at java.desktop/java.awt.FontMetrics.getStringBounds(FontMetrics.java:532) at com.sixrr.metrics.ui.metricdisplay.MetricsDisplay.setColumnWidths(MetricsDisplay.java:242) at com.sixrr.metrics.ui.metricdisplay.MetricsDisplay.setMetricsResults(MetricsDisplay.java:125) at com.sixrr.metrics.ui.metricdisplay.MetricsToolWindowImpl.show(MetricsToolWindowImpl.java:85) at com.sixrr.metrics.plugin.ProjectMetricsAction$1.onFinish(ProjectMetricsAction.java:65) at com.sixrr.metrics.metricModel.MetricsExecutionContextImpl$1.onSuccess(MetricsExecutionContextImpl.java:67) at com.intellij.openapi.progress.impl.CoreProgressManager.finishTask(CoreProgressManager.java:549) at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcessWithProgressAsync$6(CoreProgressManager.java:470) at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:201) at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:802) at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:322) at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:84) at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:132) at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:47) at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:188) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746) at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:971) at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:841) at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:452) at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:744) at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:451) at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:802) at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:499) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

bbecker-te commented 3 years ago

I also got this exception. I am using version 1.9 of metric reloaded. It failed when trying to calculate metrics on the whole project, but not smaller parts of it. I'm using java 8 and Intellij 2020.2.

java.lang.IllegalArgumentException: Zero length string passed to TextLayout constructor. at java.desktop/java.awt.font.TextLayout.<init>(TextLayout.java:382) at java.desktop/java.awt.Font.getStringBounds(Font.java:2617) at java.desktop/java.awt.Font.getStringBounds(Font.java:2522) at java.desktop/java.awt.FontMetrics.getStringBounds(FontMetrics.java:532) at com.sixrr.metrics.ui.metricdisplay.MetricsDisplay.setColumnWidths(MetricsDisplay.java:242) at com.sixrr.metrics.ui.metricdisplay.MetricsDisplay.setMetricsResults(MetricsDisplay.java:125) at com.sixrr.metrics.ui.metricdisplay.MetricsToolWindowImpl.show(MetricsToolWindowImpl.java:85) at com.sixrr.metrics.plugin.ProjectMetricsAction$1.onFinish(ProjectMetricsAction.java:65) at com.sixrr.metrics.metricModel.MetricsExecutionContextImpl$1.onSuccess(MetricsExecutionContextImpl.java:67) at com.intellij.openapi.progress.impl.CoreProgressManager.finishTask(CoreProgressManager.java:549) at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcessWithProgressAsync$6(CoreProgressManager.java:470) at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:201) at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:802) at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:322) at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:84) at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:132) at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:47) at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:188) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746) at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:967) at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:839) at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:450) at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:744) at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:449) at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:802) at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:497) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

bbecker-te commented 3 years ago

I had a look at the code and I have a strong suspicion that this bug can be easily fixed by just not passing an empty string So instead of just checking for name != null in the following, also check that name.length > 0.

           if (name != null) {
                final Rectangle2D stringBounds = fontMetrics.getStringBounds(name, graphics);
                final double stringWidth = stringBounds.getWidth();
                if (stringWidth > maxFirstColumnWidth) {
                    maxFirstColumnWidth = (int) stringWidth;
                }
            }

From com.sixrr.metrics.ui.metricdisplay.MetricsDisplay.setColumnWidths(MetricsDisplay.java:242) where it calls java.desktop/java.awt.FontMetrics.getStringBounds(FontMetrics.java:532)

artspb commented 3 years ago

Same in IU-211.2924.