# Fisica's FGearJoint

**URL:** https://discourse.processing.org/t/fisicas-fgearjoint/18037
**Category:** Libraries
**Created:** [February 23, 2020, 6:19am UTC](https://discourse.processing.org/t/fisicas-fgearjoint/18037 "2020-02-23T06:19:07Z")
**Posts on this page:** 1
**Showing post:** 2

<div class="post-metadata">

### Author: ![GoToLoop](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/gotoloop/32/86_2.png) [@GoToLoop](https://discourse.processing.org/u/GoToLoop)
#### Post date: [February 23, 2020, 8:28am UTC](https://discourse.processing.org/t/fisicas-fgearjoint/18037/2 "2020-02-23T08:28:09Z")

</div>

I’ve taken a quick look at Fisica’s source code and found out the reason for the NPE is that invoking method **getBox2dJoint()** on both FRevoluteJoint objects return `null`:

```auto
println(revJointA.getBox2dJoint()); // null
println(revJointB.getBox2dJoint()); // null

```

But mysteriously after the 1st **draw()** iteration, those same statements don’t log `null` anymore.

So I’ve used **registerMethod()** in order to setup a **post()** callback which would be run once only and then got **unregisterMethod()**:  
[Processing.GitHub.io/processing-javadocs/core/processing/core/PApplet.html#registerMethod-java.lang.String-java.lang.Object-](http://Processing.GitHub.io/processing-javadocs/core/processing/core/PApplet.html#registerMethod-java.lang.String-java.lang.Object-)

Into that **post()** callback I’ve moved the code block which creates the FGearJoint.

This time it works b/c method **getBox2dJoint()** doesn’t return `null` anymore.

However, the next call to method **step()** somehow triggers an AssertionError.

As a workaround I’ve forced 1 single call to method **step()** within a `try {} / catch () {}` block.

From that on, **step()** doesn’t trigger any more errors.

This is your code w/ those workaround changes. Good luck: 🍀

```auto
// https://Discourse.Processing.org/t/fisicas-fgearjoint/18037/2
// 2020-Feb-23

import fisica.*;

FWorld world;
FBox wheelA, wheelB;
FCircle hubA, hubB;
FRevoluteJoint revJointA, revJointB;
FGearJoint gearJoint;

void setup() {
  size(400, 400);

  Fisica.init(this);
  world = new FWorld();

  // Wheel A /////////////////////////////////////
  wheelA = new FBox(80, 80);
  wheelA.setPosition(100, 200);
  world.add(wheelA);

  hubA = new FCircle(10);
  hubA.setPosition(100, 200);
  hubA.setStatic(true);
  world.add(hubA);

  revJointA = new FRevoluteJoint(wheelA, hubA);
  world.add(revJointA);
  ////////////////////////////////////////////////

  // Wheel B /////////////////////////////////////
  wheelB = new FBox(100, 100);
  wheelB.setPosition(300, 200);
  world.add(wheelB);

  hubB = new FCircle(10);
  hubB.setPosition(300, 200);
  hubB.setStatic(true);
  world.add(hubB);

  revJointB = new FRevoluteJoint(wheelB, hubB);
  world.add(revJointB);
  ////////////////////////////////////////////////

  registerMethod("post", this);

  println(revJointA.getBox2dJoint());
  println(revJointB.getBox2dJoint());
}

void draw() {
  background(-1);
  world.step();
  world.draw();
}

void post() {
  unregisterMethod("post", this);

  println(revJointA.getBox2dJoint());
  println(revJointB.getBox2dJoint());

  // Connecting the two Joints ... //////////////////////////////////////
  FGearJoint gearJoint = new FGearJoint(revJointA, revJointB);
  gearJoint.setRatio(2);
  world.add(gearJoint);
  ////////////////////////////////////////////////////////////////////////

  try {
    world.step();
  }

  catch (final AssertionError err) {
    System.err.println(err);
  }
}

```

---

_[View the full topic](https://discourse.processing.org/t/fisicas-fgearjoint/18037)._
