关于Java变量初始化

想请教,若是局部变量一开始宣告时未初始化,
但在for循环中有给予该变量初始化值,循环时也有赋值给该变量,且在循环中也可以打印出该变量,为何出循环后又会跳出该变量未初始化的编译错误讯息呢?
在for循环内不是已初始化并赋值给该变量了吗?

如下例:

public static void main(String args[]){

int arr[]={40,30,20};
int min;

for(int i=0;ifor(int j=i+1;jif(arr[j]< min)
     {
        min=arr[j];
      }
     }
  System.out.println(min); //在for循环中min值打印的出来
}

System.out.println(min); //但若在此打印则会显示min未初始化的编译错误

再麻烦各位神人解惑了!

因为这里涉及到图灵停机问题,编译器不可能在不真正执行一遍代码就判断一个循环是否能够停下来,而一旦真正执行它自己又会可能会陷入死循环无法停下来,所以在编译阶段是根本没法判断一个循环到底会不会执行的
既然循环可能不会执行,那么你在循环里写的赋值就不算数,必须在代码能够检测到的位置赋值才算数

编译器的检测机制造成的,在它看来那个for循环是有可能不执行的,因为它在做检测时不会真的去执行i<arr.length看条件是不是真、循环体中的min=xxx会不会执行,它就做简单的判断,即for循环可能会执行,也可能不会执行。那么min就存在未被初始化这种可能性,所以会报错。
一般来说编程规范也会要求声明变量时直接赋初值,以防万一嘛