Increasing code coverage can increase your confidence in the correctness of the code but even when all code paths are covered by tests, it's often impractical to cover all possible inputs too. As an example, take this this method:
public static int divide(int numerator, int denominator) {
return numerator / denominator;
}
You could trivially write a unit test that covered 100% of the lines of this method:
@Test
public void testDivide() {
assertEquals(2, MathHelper.divide(4, 2));
}
But you would still have a divide by zero error crop up in the case of denominator = 0.
The best you can do is try to think of as many interesting edge case inputs as you reasonably can and write tests around them. And when you do encounter bugs with novel inputs, fix the bugs and write new tests (as you have done) to prevent regressions.
It's also often helpful to consider what might go wrong with libraries and/or external dependencies of your code, which have many code paths of their own that are not showing up in code coverage metrics measuring just your codebase. What happens when the database is unavailable? Network unavailable? Disk full? etc.
For some useful tips on how to get better at thinking of interesting edge cases see this Quora question.