Creo que te vas a reír cuando te lo cuente...
El problema que creo que tienes es que se te ha olvidado que, en Java, los bucles se ejecutan de 0 a (límite superior - 1), en lugar de 1 a límite superior. Cambia el if a:
if(j==(base - 1) || j==0 || i==(altura - 1) || i==0)
y nos cuentas.
Pues estoy empezando con Java y se me presenta el problema de hacer un Rectangulo hueco con un caracter que puedas elegir, os dejo el codigo=
package rectangulovacio;
import java.io.IOException;
import java.util.Scanner;
public class RectanguloVacio
{
public static void main(String args[])throws IOException
{
Scanner sc= new Scanner (System.in);
System.out.println("Introduce el caracter");
char caracter = (char) System.in.read();
System.out.println("Introduce la base del rectángulo");
int base = sc.nextInt();
System.out.println("Introduce la altura del rectángulo");
int altura = sc.nextInt();
for (int i = 0;i < altura;i++)
{
for (int j=0; j < base;j++)
{
if(i==base || i==1 || j==altura || j==1)
System.out.print(caracter);
else
System.out.print(" ");
}
System.out.println();
}
}
}
A mi me parece que está correcto pero obviamente no porque al ejecutarlo, por ejemplo con un rectangulo 6x6 (un cuadrado) da este resultado=
*
******
*
*
*
*