BasLeijdekkers/MetricsReloaded

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

sudhanmoghe opened this issue · 3 comments

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)

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)

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)

Same in IU-211.2924.