Critique of Pascal's Triangle Class
There are 2½ things wrong with your code, otherwise it's fine.


Use exception handling with try/catch for exceptional circumstances, not for trivial bounds checking which you can do! The snippet

try {
      upperLeft = triangle[i - 1][j - 1];
} catch (ArrayIndexOutOfBoundsException e) {
     upperLeft = 0; //upperLeft is 0 if not found
}


throws an error if j == 0 – you already handled the i == 0 case. You can avoid this by starting the loop one index later, and just putting a 1 in the first field. The same considerations hold for the last array entry.

When we initialize the bounds outside of the loops, we get something like:

// init first row
triangle[0] = new long[]{ 1 };

for (int i = 1; i &lt; depth; i++) {
    triangle[i] = new long[i + 1];

    // init first and last element        
    triangle[i][0] = 1;
    triangle[i][i] = 1;

    for (int j = 1; j &lt; i; j++) {
        long left  = triangle[i - 1][j - 1];
        long right = triangle[i - 1][j    ];
        triangle[i][j] = left + right;
    }
}


By handling these edge cases seperately, I can radically shorten the code, and can omit exception handling.
In- and Output should happen in the main method, not in helpers. You have written a printTriangle method, which hardcodes the System.out stream. It would be better to assemble a string representation in a toString() method, and then print out the result from that:

public String toString() {
  Formatter formatter = new Formatter(new StringBuilder(), null);
  for (long[] row : triangle) {
    for (long i : row) {
      formatter.format("%d ", i);
    }
    formatter.format("\n");
  }
  return formatter.toString();
}


Then in main: System.out.print(triangle.toString()).


What I haven't addressed until now is your usage of variables. You should declare your variables as close to their point of usage as possible, and in the tightest possible scope. Your upperLeft etc. is only relevant inside the else branch of your original code – if you look at my version, you see I declared the corresponding variable inside the loop as well.

Oh, and your names for the loop variables in printTriangle() are weird. The letters i and j usually denote integers in loops, a convention taken from mathematics into programming. It is better to use names that are actually connected to the problem you are solving. If you look at my snippet, you'll see that I iterate over each row in the triangle, and then over each long integer i in that row.