How to reproduce: press refactor button for method which can't be moved like instance and must be converted to static, make it static in first dialog and then press cancel before actual refactoring applying. After that press refactor for this method again and you'll get this error.
Reason: method's signature can be changed during this conversion to static, MetricsReloaded is based on method's signatures and stores old signature of method before it became static. So MetricsReloaded cannot find this calculated metrics.
Solutions:
Make "Cancel" button disabled.
Submit logs only after closing refactorings results window. (the best, I think)
Set special value for non existing metric: -1.
Error:
null java.lang.NullPointerException at org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringFeatures.extractMetricsResultsFor(RefactoringFeatures.java:131) at org.jetbrains.research.groups.ml_methods.refactoring.logging.MoveMethodRefactoringFeatures.<init>(MoveMethodRefactoringFeatures.java:50) at org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringFeatures$1.visit(RefactoringFeatures.java:98) at org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringFeatures$1.visit(RefactoringFeatures.java:95) at org.jetbrains.research.groups.ml_methods.algorithm.refactoring.MoveMethodRefactoring.accept(MoveMethodRefactoring.java:73) at org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringFeatures.extractFeatures(RefactoringFeatures.java:95) at org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringSessionInfo.lambda$new$0(RefactoringSessionInfo.java:39) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) at org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringSessionInfo.<init>(RefactoringSessionInfo.java:40) at org.jetbrains.research.groups.ml_methods.ui.ClassRefactoringPanel.refactorSelected(ClassRefactoringPanel.java:181) at org.jetbrains.research.groups.ml_methods.ui.ClassRefactoringPanel.lambda$createButtonsPanel$5(ClassRefactoringPanel.java:158) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6533) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6298) at java.awt.Container.processEvent(Container.java:2236) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2294) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) at java.awt.Container.dispatchEventImpl(Container.java:2280) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.awt.EventQueue$4.run(EventQueue.java:729) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:827) at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:651) at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:365) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
How to reproduce: press refactor button for method which can't be moved like instance and must be converted to static, make it static in first dialog and then press cancel before actual refactoring applying. After that press refactor for this method again and you'll get this error.
Reason: method's signature can be changed during this conversion to static, MetricsReloaded is based on method's signatures and stores old signature of method before it became static. So MetricsReloaded cannot find this calculated metrics.
Solutions:
Error:
null java.lang.NullPointerException at org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringFeatures.extractMetricsResultsFor(RefactoringFeatures.java:131) at org.jetbrains.research.groups.ml_methods.refactoring.logging.MoveMethodRefactoringFeatures.<init>(MoveMethodRefactoringFeatures.java:50) at org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringFeatures$1.visit(RefactoringFeatures.java:98) at org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringFeatures$1.visit(RefactoringFeatures.java:95) at org.jetbrains.research.groups.ml_methods.algorithm.refactoring.MoveMethodRefactoring.accept(MoveMethodRefactoring.java:73) at org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringFeatures.extractFeatures(RefactoringFeatures.java:95) at org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringSessionInfo.lambda$new$0(RefactoringSessionInfo.java:39) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) at org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringSessionInfo.<init>(RefactoringSessionInfo.java:40) at org.jetbrains.research.groups.ml_methods.ui.ClassRefactoringPanel.refactorSelected(ClassRefactoringPanel.java:181) at org.jetbrains.research.groups.ml_methods.ui.ClassRefactoringPanel.lambda$createButtonsPanel$5(ClassRefactoringPanel.java:158) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6533) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6298) at java.awt.Container.processEvent(Container.java:2236) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2294) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) at java.awt.Container.dispatchEventImpl(Container.java:2280) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.awt.EventQueue$4.run(EventQueue.java:729) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:827) at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:651) at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:365) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)