On 27 February 2017 at 10:39, Felix Schumacher
<[email protected]> wrote:
>
>
> Am 26. Februar 2017 13:05:20 MEZ schrieb sebb <[email protected]>:
>>On 26 February 2017 at 08:41, Felix Schumacher
>><[email protected]> wrote:
>>> Am 26.02.2017 um 09:06 schrieb Felix Schumacher:
>>>>
>>>>
>>>> Am 25. Februar 2017 23:42:44 MEZ schrieb sebb <[email protected]>:
>>>>>
>>>>> On 25 February 2017 at 14:25, Felix Schumacher
>>>>> <[email protected]> wrote:
>>>>>>
>>>>>> Am 25.02.2017 um 15:01 schrieb Philippe Mouawad:
>>>>>>>
>>>>>>> Hi Graham,
>>>>>>> It could be coming from a Sonar error I fixed in r1783482
>>>>>>>
>>>>>>>       @Override
>>>>>>>       public String getName() {
>>>>>>>           if (nameField != null) {
>>>>>>>               return nameField.getText();
>>>>>>>           }
>>>>>>>           return ""; // $NON-NLS-1$
>>>>>>>       }
>>>>>>>
>>>>>>> Could you try it ?
>>>>>>
>>>>>> I reverted the fix and added a sonar hint, to not nag us about
>>this.
>>>>>
>>>>> I doubt that this is the full solution.
>>>>> If the nameField can be null here then it can perhaps be null in
>>>>> setName.
>>>>>
>>>>> The underlying cause of the issue needs to be found.
>>>>>
>>>>> One problem I notice is that the NamePanel ctor calls setName()
>>which
>>>>> can be overridden - that can cause issues because the object won't
>>be
>>>>> fully constructed until the ctor completes.
>>>>> This is why init() is private.
>>>>> The setName() code either needs to be duplicated in init(), or it
>>>>> could be put into a private method called by the ctor and the
>>public
>>>>> setName.
>>>>
>>>> Your analysis is correct, that setName should not be used in the
>>ctor as
>>>> it could be modified in subclasses.
>>>>
>>>> I tried a variant first, where I inlined the functionality of
>>setName into
>>>> the ctor.
>>>>
>>>> That didn't help.
>>
>>Yeah, I realise now that will only help sub-classes of NamePanel.
>>But it still needs to be fixed.
>>
>>I had not considered that the JVM would have the same fault.
>>
>>>>
>>>> We could add a safe guard into setName just in case and for
>>symmetry.
>>
>>Not necessary unless setName() is called by the JPanel ctor directly
>>or indirectly.
>>
>>> Btw, the stacktrace is:
>>>
>>> java.lang.NullPointerException: null
>>>     at org.apache.jmeter.gui.NamePanel.getName(NamePanel.java:78)
>>> ~[ApacheJMeter_core.jar:3.2-SNAPSHOT.20170226]
>>>     at
>>com.sun.java.swing.plaf.gtk.GTKStyle.getInsets(GTKStyle.java:316)
>>> ~[?:1.8.0_121]
>>>     at
>>>
>>javax.swing.plaf.synth.SynthStyle.installDefaults(SynthStyle.java:913)
>>> ~[?:1.8.0_121]
>>>     at
>>>
>>javax.swing.plaf.synth.SynthLookAndFeel.updateStyle(SynthLookAndFeel.java:265)
>>> ~[?:1.8.0_121]
>>>     at
>>>
>>javax.swing.plaf.synth.SynthPanelUI.updateStyle(SynthPanelUI.java:117)
>>> ~[?:1.8.0_121]
>>>     at
>>>
>>javax.swing.plaf.synth.SynthPanelUI.installDefaults(SynthPanelUI.java:100)
>>> ~[?:1.8.0_121]
>>>     at
>>javax.swing.plaf.basic.BasicPanelUI.installUI(BasicPanelUI.java:56)
>>> ~[?:1.8.0_121]
>>>     at
>>javax.swing.plaf.synth.SynthPanelUI.installUI(SynthPanelUI.java:62)
>>> ~[?:1.8.0_121]
>>>     at javax.swing.JComponent.setUI(JComponent.java:666)
>>~[?:1.8.0_121]
>>>     at javax.swing.JPanel.setUI(JPanel.java:153) ~[?:1.8.0_121]
>>>     at javax.swing.JPanel.updateUI(JPanel.java:126) ~[?:1.8.0_121]
>>>     at javax.swing.JPanel.<init>(JPanel.java:86) ~[?:1.8.0_121]
>>>     at javax.swing.JPanel.<init>(JPanel.java:109) ~[?:1.8.0_121]
>>>     at javax.swing.JPanel.<init>(JPanel.java:117) ~[?:1.8.0_121]
>>>     at org.apache.jmeter.gui.NamePanel.<init>(NamePanel.java:44)
>>> ~[ApacheJMeter_core.jar:3.2-SNAPSHOT.20170226]
>>>     at
>>>
>>org.apache.jmeter.gui.AbstractJMeterGuiComponent.<init>(AbstractJMeterGuiComponent.java:78)
>>> ~[ApacheJMeter_core.jar:3.2-SNAPSHOT.20170226]
>>>     at
>>org.apache.jmeter.control.gui.TestPlanGui.<init>(TestPlanGui.java:68)
>>> ~[ApacheJMeter_core.jar:3.2-SNAPSHOT.20170226]
>>>     at
>>>
>>org.apache.jmeter.gui.tree.JMeterTreeModel.<init>(JMeterTreeModel.java:49)
>>> ~[ApacheJMeter_core.jar:3.2-SNAPSHOT.20170226]
>>>     at org.apache.jmeter.JMeter.startGui(JMeter.java:366)
>>> ~[ApacheJMeter_core.jar:3.2-SNAPSHOT.20170226]
>>>     at org.apache.jmeter.JMeter.start(JMeter.java:519)
>>> [ApacheJMeter_core.jar:3.2-SNAPSHOT.20170226]
>>>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> ~[?:1.8.0_121]
>>>     at
>>>
>>sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>>> ~[?:1.8.0_121]
>>>     at
>>>
>>sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>> ~[?:1.8.0_121]
>>>     at java.lang.reflect.Method.invoke(Method.java:498)
>>~[?:1.8.0_121]
>>>     at org.apache.jmeter.NewDriver.main(NewDriver.java:256)
>>> [ApacheJMeter.jar:3.2-SNAPSHOT.20170226]
>>>
>>> So, if I understand it correctly. The superclass will get initialized
>>before
>>> ourselves and that ctor will call into the laf system, which calls
>>the
>>> getName method (which we have overridden). At that time (init of ctor
>>of
>>> super) our fields will not have initialized, which leads to the NPE.
>>
>>That seems to be the case here.
>>
>>However I'm not sure that there any guarantees of the order of
>>initialisation.
>>What is guaranteed is that initialisation will be completed when the
>>ctor exits.
>>Whilst the ctor is still being executed there's not telling what state
>>classes will be in.
>>
>>> So, I think the problem lies in the gtk+ implementation of laf, which
>>is
>>> calling an overridable method in the ctor.
>>
>>It does look as though the GTK+ ctor calls an overrideable method.
>>So it is broken; the problem needs to be reported and fixed as it
>>won't only affect JMeter.
>
> I have submitted a bug report. It can be found at 
> http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8175888

Thanks!

I found the following references:

https://www.securecoding.cert.org/confluence/display/java/MET05-J.+Ensure+that+constructors+do+not+call+overridable+methods

https://dev.eclipse.org/sonar/coding_rules#rule_key=squid%3AS1699|s=createdAt|asc=false

Might be an idea to add those to the bug report.

> Regards,
> Felix
>
>>
>>It's not possible for subclasses of JPanel to reliably fix the problem
>>since there's no knowing what parts of the class have been initialised
>>and which have not.
>>
>>The best subclasses can do is add protection against some failures,
>>such as the NPE here.
>>
>>But that is a hack, and should not be released unless absolutely
>>necessary.
>>And in that case the code must be carefully documented to explain why
>>the code does what it does and when the work-round can be removed.
>>
>>Also, the fact that the ctor calls getName presumably means it needs
>>to obtain the value in order to complete its own init.
>>How does the subclass return the correct value?
>>
>>> Regards,
>>>  Felix
>>>
>>>
>>>>
>>>> Felix
>>>>
>>>>>> Felix
>>>>>>
>>>>>>
>>>>>>> Thanks
>>>>>>>
>>>>>>> On Sat, Feb 25, 2017 at 2:42 PM, Graham Russell
>><[email protected]>
>>>>>
>>>>> wrote:
>>>>>>>>
>>>>>>>> Hi all
>>>>>>>>
>>>>>>>> I just tried to run `ant run_gui` on the latest (github) trunk
>>but
>>>>>>>> this results in an NPE - specifically when trying to create the
>>>>>>>> JMeterTreeModel.
>>>>>>>>
>>>>>>>> Any ideas?
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>>
>>>>>>>> Graham
>>>>>>>>
>>>>>>>> The JMeter log is:
>>>>>>>>
>>>>>>>> 2017-02-25 13:26:50,223 INFO o.a.j.u.JMeterUtils: Setting Locale
>>to
>>>>>
>>>>> en_GB
>>>>>>>>
>>>>>>>> 2017-02-25 13:26:50,246 INFO o.a.j.JMeter: Loading user
>>properties
>>>>>>>> from: /home/coding/jmeter/bin/user.properties
>>>>>>>> 2017-02-25 13:26:50,247 INFO o.a.j.JMeter: Loading system
>>>>>
>>>>> properties
>>>>>>>>
>>>>>>>> from: /home/coding/jmeter/bin/system.properties
>>>>>>>> 2017-02-25 13:26:50,317 INFO o.a.j.JMeter: Copyright (c)
>>1998-2017
>>>>>
>>>>> The
>>>>>>>>
>>>>>>>> Apache Software Foundation
>>>>>>>> 2017-02-25 13:26:50,318 INFO o.a.j.JMeter: Version
>>>>>
>>>>> 3.2-SNAPSHOT.20170225
>>>>>>>>
>>>>>>>> 2017-02-25 13:26:50,318 INFO o.a.j.JMeter:
>>java.version=1.8.0_121
>>>>>>>> 2017-02-25 13:26:50,318 INFO o.a.j.JMeter: java.vm.name=Java
>>>>>>>> HotSpot(TM) 64-Bit Server VM
>>>>>>>> 2017-02-25 13:26:50,318 INFO o.a.j.JMeter: os.name=Linux
>>>>>>>> 2017-02-25 13:26:50,318 INFO o.a.j.JMeter: os.arch=amd64
>>>>>>>> 2017-02-25 13:26:50,318 INFO o.a.j.JMeter:
>>>>>
>>>>> os.version=4.4.0-59-generic
>>>>>>>>
>>>>>>>> 2017-02-25 13:26:50,318 INFO o.a.j.JMeter: file.encoding=UTF-8
>>>>>>>> 2017-02-25 13:26:50,318 INFO o.a.j.JMeter: Max memory
>>>>>
>>>>> =1342177280
>>>>>>>>
>>>>>>>> 2017-02-25 13:26:50,318 INFO o.a.j.JMeter: Available Processors
>>=4
>>>>>>>> 2017-02-25 13:26:50,323 INFO o.a.j.JMeter: Default
>>Locale=English
>>>>>>>> (United Kingdom)
>>>>>>>> 2017-02-25 13:26:50,323 INFO o.a.j.JMeter: JMeter
>>Locale=English
>>>>>>>> (United Kingdom)
>>>>>>>> 2017-02-25 13:26:50,323 INFO o.a.j.JMeter:
>>>>>
>>>>> JMeterHome=/home/coding/jmeter
>>>>>>>>
>>>>>>>> 2017-02-25 13:26:50,323 INFO o.a.j.JMeter: user.dir
>>>>>
>>>>> =/home/coding/jmeter
>>>>>>>>
>>>>>>>> 2017-02-25 13:26:50,323 INFO o.a.j.JMeter: PWD
>>>>>
>>>>> =/home/coding/jmeter
>>>>>>>>
>>>>>>>> 2017-02-25 13:26:50,324 INFO o.a.j.JMeter: IP: 127.0.1.1 Name:
>>>>>>>> EliteBook FullName: EliteBook
>>>>>>>> 2017-02-25 13:26:50,607 INFO o.a.j.g.a.LookAndFeelCommand: Using
>>>>>
>>>>> look
>>>>>>>>
>>>>>>>> and feel: com.sun.java.swing.plaf.gtk.GTKLookAndFeel [GTK+,
>>System]
>>>>>>>> 2017-02-25 13:26:50,805 INFO o.a.j.JMeter: Loaded icon
>>properties
>>>>>
>>>>> from
>>>>>>>>
>>>>>>>> org/apache/jmeter/images/icon.properties
>>>>>>>> 2017-02-25 13:26:50,842 ERROR o.a.j.JMeter: An error occurred:
>>>>>>>> java.lang.NullPointerException: null
>>>>>>>>           at
>>>>>
>>>>> org.apache.jmeter.gui.NamePanel.getName(NamePanel.java:75)
>>>>>>>>
>>>>>>>> ~[ApacheJMeter_core.jar:3.2-SNAPSHOT.20170225]
>>>>>>>>           at
>>>>>
>>>>> com.sun.java.swing.plaf.gtk.GTKStyle.getInsets(GTKStyle.
>>>>>>>>
>>>>>>>> java:316)
>>>>>>>> ~[?:1.8.0_121]
>>>>>>>>           at javax.swing.plaf.synth.SynthStyle.installDefaults(
>>>>>>>> SynthStyle.java:913)
>>>>>>>> ~[?:1.8.0_121]
>>>>>>>>           at
>>javax.swing.plaf.synth.SynthLookAndFeel.updateStyle(
>>>>>>>> SynthLookAndFeel.java:265)
>>>>>>>> ~[?:1.8.0_121]
>>>>>>>>           at javax.swing.plaf.synth.SynthPanelUI.updateStyle(
>>>>>>>> SynthPanelUI.java:117)
>>>>>>>> ~[?:1.8.0_121]
>>>>>>>>           at
>>javax.swing.plaf.synth.SynthPanelUI.installDefaults(
>>>>>>>> SynthPanelUI.java:100)
>>>>>>>> ~[?:1.8.0_121]
>>>>>>>>           at javax.swing.plaf.basic.BasicPanelUI.installUI(
>>>>>>>> BasicPanelUI.java:56)
>>>>>>>> ~[?:1.8.0_121]
>>>>>>>>           at javax.swing.plaf.synth.SynthPanelUI.installUI(
>>>>>>>> SynthPanelUI.java:62)
>>>>>>>> ~[?:1.8.0_121]
>>>>>>>>           at javax.swing.JComponent.setUI(JComponent.java:666)
>>>>>>>> ~[?:1.8.0_121]
>>>>>>>>           at javax.swing.JPanel.setUI(JPanel.java:153)
>>>>>
>>>>> ~[?:1.8.0_121]
>>>>>>>>
>>>>>>>>           at javax.swing.JPanel.updateUI(JPanel.java:126)
>>>>>
>>>>> ~[?:1.8.0_121]
>>>>>>>>
>>>>>>>>           at javax.swing.JPanel.<init>(JPanel.java:86)
>>>>>
>>>>> ~[?:1.8.0_121]
>>>>>>>>
>>>>>>>>           at javax.swing.JPanel.<init>(JPanel.java:109)
>>>>>
>>>>> ~[?:1.8.0_121]
>>>>>>>>
>>>>>>>>           at javax.swing.JPanel.<init>(JPanel.java:117)
>>>>>
>>>>> ~[?:1.8.0_121]
>>>>>>>>
>>>>>>>>           at
>>>>>
>>>>> org.apache.jmeter.gui.NamePanel.<init>(NamePanel.java:44)
>>>>>>>>
>>>>>>>> ~[ApacheJMeter_core.jar:3.2-SNAPSHOT.20170225]
>>>>>>>>           at
>>>>>
>>>>> org.apache.jmeter.gui.AbstractJMeterGuiComponent.<init>(
>>>>>>>>
>>>>>>>> AbstractJMeterGuiComponent.java:78)
>>>>>>>> ~[ApacheJMeter_core.jar:3.2-SNAPSHOT.20170225]
>>>>>>>>           at org.apache.jmeter.control.gui.TestPlanGui.<init>(
>>>>>>>> TestPlanGui.java:68)
>>>>>>>> ~[ApacheJMeter_core.jar:3.2-SNAPSHOT.20170225]
>>>>>>>>           at org.apache.jmeter.gui.tree.JMeterTreeModel.<init>(
>>>>>>>> JMeterTreeModel.java:49)
>>>>>>>> ~[ApacheJMeter_core.jar:3.2-SNAPSHOT.20170225]
>>>>>>>>           at org.apache.jmeter.JMeter.startGui(JMeter.java:366)
>>>>>>>> ~[ApacheJMeter_core.jar:3.2-SNAPSHOT.20170225]
>>>>>>>>           at org.apache.jmeter.JMeter.start(JMeter.java:519)
>>>>>>>> [ApacheJMeter_core.jar:3.2-SNAPSHOT.20170225]
>>>>>>>>           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
>>>>>
>>>>> Method)
>>>>>>>>
>>>>>>>> ~[?:1.8.0_121]
>>>>>>>>           at sun.reflect.NativeMethodAccessorImpl.invoke(
>>>>>>>> NativeMethodAccessorImpl.java:62)
>>>>>>>> ~[?:1.8.0_121]
>>>>>>>>           at sun.reflect.DelegatingMethodAccessorImpl.invoke(
>>>>>>>> DelegatingMethodAccessorImpl.java:43)
>>>>>>>> ~[?:1.8.0_121]
>>>>>>>>           at java.lang.reflect.Method.invoke(Method.java:498)
>>>>>>>> ~[?:1.8.0_121]
>>>>>>>>           at
>>org.apache.jmeter.NewDriver.main(NewDriver.java:256)
>>>>>>>> [ApacheJMeter.jar:3.2-SNAPSHOT.20170225]
>>>>>>>>
>>>>>>>
>>>

Reply via email to