Your checkNotNegative method doesn't just check. It asserts or requires that it's not negative. I would expect a check to return a Boolean result, not throw an exception.
You can avoid the repeated calls to myPow if you store the result in an array.
final long[] c = new int[a.length + b.length - 1];
c[i+j] = a[i] * b[j];
long multiplier = 1;
for (long multiplicand : c) {
product += multiplicand * multiplier;
multiplier *= 10;
}
This does one more multiplication than the greatest call to myPow but replaces all the calls.
It's trickier, but you could probably do the same thing without the array.