Assume currently the date is the 28th of May. If I call the following commands in order the output becomes

cal.add(Calendar.DATE, 1);  // Day = 29
cal.add(Calendar.DATE, 1);  // Day = 30
cal.add(Calendar.DATE, 1);  // Day = 31
cal.add(Calendar.DATE, 1);  // Day = 31
cal.add(Calendar.DATE, -1); // Day = 29

Why is this not jumping into the next month? And why is it stuck at the 31st (but when you minus one it jumps to 29)?

Edit
Report