This is utterly ridiculous. As I was writing this I knew I was going about it wrong but I wanted to finish it before I thought of a different method or looked at any other solutions.
int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
int area1 = (D  B)*(C  A);
int area2 = (H  F)*(G  E);
int area3;
if (area1 == 0) {
return area2;
}
if (area2 == 0) {
return area1;
}
if ((A == D) && (B == F) && (C == G) && (D == H)) {
return area1;
}
if ((E >= C)  (G <= A)  (H <= B)  (D <= F)) { //not overlapping
return (area1 + area2);
}
if (((G  E) <= (C  A)) && ((H  F) <= (D  B)) && (E >= A) && (F >= B) && (G <= C) && (D >= H)) { //rect2 is inside rect1
return area1;
}
if (((C  A) <= (G  E)) && ((D  B) <= (H  F)) && (E <= A) && (B >= F) && (G >= C) && (H >= D)) { //rect1 is inside rect2
return area2;
}
if ((F >= B) && (E >= A) && (G >= C) && (H >= D)) { //overlapping upper right corner
area3 = (C  E)*(D  F);
}
else if ((F >= B) && (E <= A) && (G <= C) && (H >= D)) { //overlapping upper left corner
area3 = (G  A)*(D  F);
}
else if ((F <= B) && (E <= A) && (G <= C) && (H <= D)) { //overlapping bottom left corner
area3 = (G  A)*(H  B);
}
else if ((F <= B) && (E >= A) && (G >= C) && (H <= D)) { //overlapping bottom right corner
area3 = (H  B)*(C  E);
}
else if (((C  A) <= (G  E)) && (H <= D) && (G >= C) && (E <= A) && (F <= B)) { //overlapping bottom side
area3 = (C  A)*(H  B);
}
else if (((C  A) <= (G  E)) && (H >= D) && (G >= C) && (E <= A) && (F >= B)) { //overlapping top side
area3 = (C  A)*(D  F);
}
else if (((D  B) <= (H  F)) && (E <= A) && (F <= B) && (H >= D) && (G <= C)) { //overlapping left side
area3 = (G  A)*(D  B);
}
else if (((D  B) <= (H  F)) && (E >= A) && (F <= B) && (H >= D) && (G >= C)) { //overlapping right side
area3 = (C  E)*(D  B);
}
else if (((C  A) >= (G  E)) && (E >= A) && (F >= B) && (C >= G) && (D <= H)) { //overlapping part of top side
area3 = (G  E)*(D  F);
}
else if (((C  A) >= (G  E)) && (A <= E) && (B >= F) && (G <= C) && (D >= H)) { //overlapping part of bottom side
area3 = (G  E)*(H  B);
}
else if (((D  B) >= (H  F)) && (E <= A) && (F >= B) && (G <= C) && (H <= D)) { //overlapping part of left side
area3 = (G  A)*(H  F);
}
else if (((D  B) >= (H  F)) && (E >= A) && (F >= B) && (G >= C) && (H <= D)) { //overlapping part of right side
area3 = (C  E)*(H  F);
}
else if (((G  E) <= (C  A)) && (E >= A) && (F <= B) && (G <= C) && (H >= D)) { //overlapping top and bottom
area3 = (G  E)*(D  B);
}
else if (((H  F) <= (D  B)) && (E <= A) && (F >= B) && (C <= G) && (D >= H)) { //overlapping left and right
area3 = (C  A)*(H  F);
}
return (area1 + area2  area3);
}
If you want to laugh, look at my solution


HAHAH
You should only consider this problem in one dimension, and multiply them.
int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) { int area1 = (CA)*(DB), area2 = (GE)*(HF); int coverX = C < E ? 0 : C < G ? A < E ? CE : CA : A > G ? 0 : A < E ? GE : GA; int coverY = D < F ? 0 : D < H ? B < F ? DF : DB : B > H ? 0 : B < F ? HF : HB; return area1 + area2  coverX * coverY; }

it turned out that I'm not the only one stubborn here :D. I did it for the same exact reason as you did:
This is utterly ridiculous. As I was writing this I knew I was going about it wrong but I wanted to finish it before I thought of a different method or looked at any other solutions.
public class Solution { public boolean insideAnotherRect(int a, int b, int c, int d, int x, int y) { if (x >= a && x <= c && y >= b && y <= d) { return true; } return false; } public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) { int intersection = 0; int rect1Area = Math.abs(GE)*Math.abs(HF); int npairsR1 = 0; int[][] pairsRect1 = new int[4][2]; int rect2Area = Math.abs(CA)*Math.abs(DB); int npairsR2 = 0; int[][] pairsRect2 = new int[4][2]; if (this.insideAnotherRect(A, B, C, D, E, F)) { pairsRect1[npairsR1][0] = E; pairsRect1[npairsR1++][1] = F; } if (this.insideAnotherRect(A, B, C, D, E, H)) { pairsRect1[npairsR1][0] = E; pairsRect1[npairsR1++][1] = H; } if (this.insideAnotherRect(A, B, C, D, G, F)) { pairsRect1[npairsR1][0] = G; pairsRect1[npairsR1++][1] = F; } if (this.insideAnotherRect(A, B, C, D, G, H)) { pairsRect1[npairsR1][0] = G; pairsRect1[npairsR1++][1] = H; } if (this.insideAnotherRect(E, F, G, H, A, B)) { pairsRect2[npairsR2][0] = A; pairsRect2[npairsR2++][1] = B; } if (this.insideAnotherRect(E, F, G, H, A, D)) { pairsRect2[npairsR2][0] = A; pairsRect2[npairsR2++][1] = D; } if (this.insideAnotherRect(E, F, G, H, C, B)) { pairsRect2[npairsR2][0] = C; pairsRect2[npairsR2++][1] = B; } if (this.insideAnotherRect(E, F, G, H, C, D)) { pairsRect2[npairsR2][0] = C; pairsRect2[npairsR2++][1] = D; } if (npairsR1 == 4) { intersection = rect1Area; } else if (npairsR2 == 4) { intersection = rect2Area; } else if (npairsR1 == 2) { if (pairsRect1[0][0] == pairsRect1[1][0]) { if (pairsRect1[0][0] == E) { intersection = Math.abs(CE)*Math.abs(HF); } else { intersection = Math.abs(AG)*Math.abs(HF); } } else if (pairsRect1[0][1] == pairsRect1[1][1]) { if (pairsRect1[0][1] == H) { intersection = Math.abs(GE)*Math.abs(HB); } else { intersection = Math.abs(GE)*Math.abs(DF); } } } else if (npairsR2 == 2) { if (pairsRect2[0][0] == pairsRect2[1][0]) { if (pairsRect2[0][0] == A) { intersection = Math.abs(GA)*Math.abs(DB); } else { intersection = Math.abs(EC)*Math.abs(DB); } } else if (pairsRect2[0][1] == pairsRect2[1][1]) { if (pairsRect2[0][1] == D) { intersection = Math.abs(CA)*Math.abs(DF); } else { intersection = Math.abs(CA)*Math.abs(HB); } } } else if (npairsR1 == 1 && npairsR2 == 1) { intersection = Math.abs(pairsRect1[0][0]pairsRect2[0][0])*Math.abs(pairsRect1[0][1]pairsRect2[0][1]); } else if (npairsR1 == 0 && npairsR2 == 0) { if (this.insideAnotherRect(E, F, G, H, E, B) && this.insideAnotherRect(E, F, G, H, G, D) && this.insideAnotherRect(A, B, C, D, E, B) && this.insideAnotherRect(A, B, C, D, G, D)) { intersection = Math.abs(EG)*Math.abs(DB); } else if (this.insideAnotherRect(E, F, G, H, A, F) && this.insideAnotherRect(E, F, G, H, C, H) && this.insideAnotherRect(A, B, C, D, A, F) && this.insideAnotherRect(A, B, C, D, C, H)) { intersection = Math.abs(AC)*Math.abs(FH); } } return rect2Area + rect1Area  intersection; } }