Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8092813

When a Bidirectional binding fails, old value restoration may cause an exception hiding the real cause

      I just had a nice "gotcha" experience debugging a wierd problem where a Binding, that can never be null in any circumstances, gets restored to null because somewhere along the chain of changes a Bidirectional binding failed.

      From a user standpoint I basically see:

      1) I set some value to X
      2) Some ChangeListener acts on the value X
      3) Without further intervention, the value gets set to null (the previous value) ---> BIG surprise, I never ever set it to null...
      4) The same ChangeListener acts on the value null (which is illegal), throws NPE.

      Step 5, which is never reached, turns out to be:

      5) throw new RuntimeException("Bidirectional binding failed, setting to the previous value", e);

      Which would explain the problem... however, because the code that restores the value triggers another exception, this gets lost.

      The problem turns out to be in this piece of code in BidirectionalBinding.TypedGenericBidirectionalBinding:

                          try {
                              updating = true;
                              if (property1 == sourceProperty) {
                                  property2.setValue(newValue);
                              } else {
                                  property1.setValue(newValue);
                              }
                          } catch (RuntimeException e) {
                              if (property1 == sourceProperty) {
                                  property1.setValue(oldValue);
                              } else {
                                  property2.setValue(oldValue); // <<<<<< Triggers NPE further down the line!
                              }
                              throw new RuntimeException(
                                      "Bidirectional binding failed, setting to the previous value", e);
                          } finally {
                              updating = false;
                          }


      I marked the line which triggers the eventual NPE. IMHO, this piece of error handling must be further wrapped in a try-catch block so that the real cause ("Bidirectional binding failed") can be properly reported to the user.

          Loading...
          Uploaded image for project: 'JDK'
          1. JDK
          2. JDK-8092813

          When a Bidirectional binding fails, old value restoration may cause an exception hiding the real cause

              I just had a nice "gotcha" experience debugging a wierd problem where a Binding, that can never be null in any circumstances, gets restored to null because somewhere along the chain of changes a Bidirectional binding failed.

              From a user standpoint I basically see:

              1) I set some value to X
              2) Some ChangeListener acts on the value X
              3) Without further intervention, the value gets set to null (the previous value) ---> BIG surprise, I never ever set it to null...
              4) The same ChangeListener acts on the value null (which is illegal), throws NPE.

              Step 5, which is never reached, turns out to be:

              5) throw new RuntimeException("Bidirectional binding failed, setting to the previous value", e);

              Which would explain the problem... however, because the code that restores the value triggers another exception, this gets lost.

              The problem turns out to be in this piece of code in BidirectionalBinding.TypedGenericBidirectionalBinding:

                                  try {
                                      updating = true;
                                      if (property1 == sourceProperty) {
                                          property2.setValue(newValue);
                                      } else {
                                          property1.setValue(newValue);
                                      }
                                  } catch (RuntimeException e) {
                                      if (property1 == sourceProperty) {
                                          property1.setValue(oldValue);
                                      } else {
                                          property2.setValue(oldValue); // <<<<<< Triggers NPE further down the line!
                                      }
                                      throw new RuntimeException(
                                              "Bidirectional binding failed, setting to the previous value", e);
                                  } finally {
                                      updating = false;
                                  }


              I marked the line which triggers the eventual NPE. IMHO, this piece of error handling must be further wrapped in a try-catch block so that the real cause ("Bidirectional binding failed") can be properly reported to the user.

                    msladecek Martin Sládeček
                    jhendrikx John Hendrikx
                    Votes:
                    0 Vote for this issue
                    Watchers:
                    3 Start watching this issue

                      Created:
                      Updated:
                      Resolved:
                      Imported:

                        msladecek Martin Sládeček
                        jhendrikx John Hendrikx
                        Votes:
                        0 Vote for this issue
                        Watchers:
                        3 Start watching this issue

                          Created:
                          Updated:
                          Resolved:
                          Imported: