Seems to work, but seems a little askward.
The way the variable rate is initialized and then immediately
incremented is awkward.
Here is a possibly buggy program that does this in a different way:
class  MillionDollarBuggy
{
  public static void main( String[] args ) 
  {
    double initialAmount = 1000.00 ;
    double dollars = 0.0;
    double rate;
    int    year;
    rate = 0.0;   // Start interest rate at zero
 
    while ( dollars < 1000000 )
    {
       // compute the dollars after 40 years at the current rate
       year =  1 ;     
       dollars = initialAmount;     
       while (  year <= 40 )
       {     
         dollars = dollars + dollars*rate  ; // add another year's interest     
         dollars = dollars + 1000 ;          // add in this year's contribution
         year    =  year + 1 ;
       }
       // change to the next rate
       rate = rate + 0.001;
    }
    System.out.println("After 40 years at " + rate*100 
      + " percent interest you will have " + dollars + " dollars" );
  }
}
Is there a bug in this program?