This piece of code is inherently flawed:
for (int queen = 0; queen < queens.length; queen++) {
placeQueens(queen);
}
You can't decide where to put queen 0 without deciding where to put queen 1 to 8 at the exact same time. You've implemented "First Fit":
And First Fit does not result in a feasible solution as you can see in the example above. More info in this manual (including algorithms that do work).
Here's an algorithm that does work (but scales horribly):