You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by "Dirk Steinmetz (JIRA)" <ji...@apache.org> on 2019/04/11 03:10:00 UTC
[jira] [Created] (NETBEANS-2391) NPE when opening Android projects
Dirk Steinmetz created NETBEANS-2391:
----------------------------------------
Summary: NPE when opening Android projects
Key: NETBEANS-2391
URL: https://issues.apache.org/jira/browse/NETBEANS-2391
Project: NetBeans
Issue Type: Bug
Components: projects - Gradle
Affects Versions: 11.0
Environment: Gradle 5.3.1
Netbeans 11.0
com.android.tools.build:gradle:3.2.1
Reporter: Dirk Steinmetz
Opening Android projects causes a NPE (as do some other operations on that project later on).
*STR:*
0. Download and install Android Studio, create any default project.
1. Open that project in netbeans 11.0 (make sure to open the 'real' project, usually called 'app')
*Expected:*
The project opens (albeit maybe some or all Android-specific features are unavailable).
*Actual:*
{noformat}
java.lang.NullPointerException at java.util.AbstractCollection.addAll(AbstractCollection.java:343) at org.netbeans.modules.gradle.api.GradleBaseProjectBuilder.processDependencies(GradleBaseProjectBuilder.java:128) at org.netbeans.modules.gradle.api.GradleBaseProjectBuilder.build(GradleBaseProjectBuilder.java:75) at org.netbeans.modules.gradle.api.GradleBaseProjectBuilder$Extractor.extract(GradleBaseProjectBuilder.java:288) at org.netbeans.modules.gradle.GradleProjectCache.createGradleProject(GradleProjectCache.java:432) at org.netbeans.modules.gradle.GradleProjectCache.loadGradleProject(GradleProjectCache.java:257) at org.netbeans.modules.gradle.GradleProjectCache.access$100(GradleProjectCache.java:85)[catch] at org.netbeans.modules.gradle.GradleProjectCache$ProjectLoaderTask.call(GradleProjectCache.java:348) at org.netbeans.modules.gradle.GradleProjectCache$ProjectLoaderTask.call(GradleProjectCache.java:326) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1418) at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45) at org.openide.util.lookup.Lookups.executeWith(Lookups.java:278) at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2033){noformat}
*Reason / Potential partial fix:*
[GradleBaseProjectBuilder.java:127f|https://github.com/apache/incubator-netbeans/blob/master/groovy/gradle/src/org/netbeans/modules/gradle/api/GradleBaseProjectBuilder.java#L127]:
{code:java}
Set<File> dirs = (Set<File>) info.get("sourceset_" + name + "_output_classes");
sourceSetOutputs.addAll(dirs);
{code}
expects a non-null "_output_classes" set for a source set, while
[NbProjectInfoBuilder.groovy|https://github.com/apache/incubator-netbeans/blob/master/groovy/gradle/netbeans-gradle-tooling/src/main/groovy/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.groovy#L242] has a separate path for Android projects that does not (always?) populate that field.
In my tests just adding a null check works, although generated code and android sources are still unavailable while editing. There is an exception down the road when opening the "Sources" category in the project categories, though:
{noformat}
java.lang.NullPointerException at org.netbeans.modules.gradle.java.customizer.SourceSetPanel.<init>(SourceSetPanel.java:63) at org.netbeans.modules.gradle.java.customizer.SourcesPanel.<init>(SourcesPanel.java:55) at org.netbeans.modules.gradle.java.customizer.SourcesPanel$1.createComponent(SourcesPanel.java:74) at org.netbeans.modules.gradle.spi.customizer.support.FilterPanelProvider.createComponent(FilterPanelProvider.java:58) at org.netbeans.spi.project.ui.support.ProjectCustomizer$DelegateCategoryProvider.create(ProjectCustomizer.java:604) at org.netbeans.modules.project.uiapi.CustomizerPane.setCategory(CustomizerPane.java:234) at org.netbeans.modules.project.uiapi.CustomizerPane.access$200(CustomizerPane.java:47) at org.netbeans.modules.project.uiapi.CustomizerPane$CategoryChangeListener.propertyChange(CustomizerPane.java:320) at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335) at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327) at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263) at org.netbeans.modules.project.uiapi.CategoryModel.firePropertyChange(CategoryModel.java:93) at org.netbeans.modules.project.uiapi.CategoryModel.setCurrentCategory(CategoryModel.java:67) at org.netbeans.modules.project.uiapi.CategoryView.propertyChange(CategoryView.java:158) at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335) at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327) at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263) at org.openide.explorer.ExplorerManager$2.run(ExplorerManager.java:866) at org.netbeans.modules.openide.util.NbMutexEventProvider$Event.doEvent(NbMutexEventProvider.java:95) at org.netbeans.modules.openide.util.NbMutexEventProvider$Event.readAccess(NbMutexEventProvider.java:70) at org.netbeans.modules.openide.util.LazyMutexImplementation.readAccess(LazyMutexImplementation.java:66) at org.openide.util.Mutex.readAccess(Mutex.java:235) at org.openide.explorer.ExplorerManager.fireInAWT(ExplorerManager.java:863) at org.openide.explorer.ExplorerManager$1AtomicSetSelectedNodes.fire(ExplorerManager.java:269) at org.openide.explorer.ExplorerManager.setSelectedNodes(ExplorerManager.java:280) at org.openide.explorer.ExplorerManager$1SetExploredContextAndSelection.run(ExplorerManager.java:368) at org.netbeans.modules.openide.util.DefaultMutexImplementation.readAccess(DefaultMutexImplementation.java:172) at org.netbeans.modules.openide.util.DefaultMutexImplementation$1R.run(DefaultMutexImplementation.java:1016) at org.netbeans.modules.openide.util.DefaultMutexImplementation.doWrapperAccess(DefaultMutexImplementation.java:1033) at org.netbeans.modules.openide.util.DefaultMutexImplementation.readAccess(DefaultMutexImplementation.java:162) at org.openide.util.Mutex.readAccess(Mutex.java:235) at org.openide.explorer.ExplorerManager.setExploredContextAndSelection(ExplorerManager.java:395) at org.openide.explorer.view.BeanTreeView.selectionChanged(BeanTreeView.java:124) at org.openide.explorer.view.TreeView.callSelectionChanged(TreeView.java:808) at org.openide.explorer.view.TreeView$TreePropertyListener.run(TreeView.java:1450) at org.netbeans.modules.openide.util.DefaultMutexImplementation$1Exec.run(DefaultMutexImplementation.java:952) at org.openide.nodes.Children$ProjectManagerDeadlockDetector.execute(Children.java:1913) at org.netbeans.modules.openide.util.DefaultMutexImplementation.postRequest(DefaultMutexImplementation.java:958) at org.netbeans.modules.openide.util.DefaultMutexImplementation.postRequest(DefaultMutexImplementation.java:921) at org.netbeans.modules.openide.util.DefaultMutexImplementation.postReadRequest(DefaultMutexImplementation.java:287) at org.openide.util.Mutex.postReadRequest(Mutex.java:346) at org.openide.explorer.view.TreeView$TreePropertyListener.valueChanged(TreeView.java:1419) at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:635) at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1093) at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:294) at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:188) at javax.swing.JTree.setSelectionPath(JTree.java:1641) at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2392) at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3608) at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressedDND(BasicTreeUI.java:3585) at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3544) at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:280) at java.awt.Component.processMouseEvent(Component.java:6536) at javax.swing.JComponent.processMouseEvent(JComponent.java:3315) at java.awt.Component.processEvent(Component.java:6304) at java.awt.Container.processEvent(Container.java:2239) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2297) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4532) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476) at java.awt.Container.dispatchEventImpl(Container.java:2283) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) 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:74) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) at java.awt.EventQueue$4.run(EventQueue.java:733) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.awt.EventQueue.dispatchEvent(EventQueue.java:730) at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136)[catch] at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:109) at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:190) at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:235) at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:233) at java.security.AccessController.doPrivileged(Native Method) at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:233) at java.awt.Dialog.show(Dialog.java:1084) at org.netbeans.core.windows.services.NbPresenter.superShow(NbPresenter.java:1060) at org.netbeans.core.windows.services.NbPresenter.doShow(NbPresenter.java:1110) at org.netbeans.core.windows.services.NbPresenter.run(NbPresenter.java:1082) at org.netbeans.core.windows.services.NbPresenter.run(NbPresenter.java:105) at org.netbeans.modules.openide.util.NbMutexEventProvider$Event.doEventAccess(NbMutexEventProvider.java:115) at org.netbeans.modules.openide.util.NbMutexEventProvider$Event.readAccess(NbMutexEventProvider.java:75) at org.netbeans.modules.openide.util.LazyMutexImplementation.readAccess(LazyMutexImplementation.java:71) at org.openide.util.Mutex.readAccess(Mutex.java:193) at org.netbeans.core.windows.services.NbPresenter.show(NbPresenter.java:1067) at java.awt.Component.show(Component.java:1671) at java.awt.Component.setVisible(Component.java:1623) at java.awt.Window.setVisible(Window.java:1014) at java.awt.Dialog.setVisible(Dialog.java:1005) at org.netbeans.modules.gradle.customizer.GradleCustomizerProvider$1.run(GradleCustomizerProvider.java:95) at org.netbeans.modules.openide.util.NbMutexEventProvider$Event.doEvent(NbMutexEventProvider.java:95) at org.netbeans.modules.openide.util.NbMutexEventProvider$Event.readAccess(NbMutexEventProvider.java:70) at org.netbeans.modules.openide.util.LazyMutexImplementation.readAccess(LazyMutexImplementation.java:66) at org.openide.util.Mutex.readAccess(Mutex.java:235) at org.netbeans.modules.gradle.customizer.GradleCustomizerProvider.showCustomizer(GradleCustomizerProvider.java:78) at org.netbeans.modules.gradle.customizer.GradleCustomizerProvider.showCustomizer(GradleCustomizerProvider.java:105) at org.netbeans.modules.project.ui.actions.CustomizeProject$1$1.run(CustomizeProject.java:135) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 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:74) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) 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)
{noformat}
If you need a pull request for the one line null check, I can provide that (but it is probably faster if you just do it yourself). It seems to me as if that is sufficient to resolve the major issues for people wanting to build a cross-platform project without switching the IDE.
I tried to fix the android path using other means to stop netbeans from detecting 'missing' android packages, but I did not find an obvious way to get output folders for individual source sets. Maybe somebody with more experience in gradle, groovy and/or the internals of the Android gradle plugin can help here. It is also possible that the source panel issue is unrelated.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists