try catch 提示未初始化错误

/*分别给cl 和li初始化为null后运行又有nullpointerexception
总而言之,就是觉得try{}里面的赋值没有成功*/
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Scanner;

public class Exercise21 {

public static void main(String[] args) 
{
    // TODO Auto-generated method stub
    Scanner sc=new Scanner(System.in);
    System.out.println("用户名:");
    String name=sc.nextLine();
    System.out.println("密码:");
    String password=sc.nextLine();
    if(new LoginCheck().login(name, password))
        System.out.println("登陆成功!");
    else
        System.out.println("登陆失败!");
}

}

@Retention(value=RetentionPolicy.RUNTIME)
@interface LoginInfo
{
public String name();
public String password();
}

class LoginCheck
{
@LoginInfo(name="zmx",password="123456")
public boolean login(String name,String password)
{
Class<?> cl=null;
try
{
cl=Class.forName("LoginCheck");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
LoginInfo li=null;//这里不初始化会报错
try
{
li = cl.getMethod("login").getAnnotation(LoginInfo.class);//将这里的getMethod("login")改成getMethod("login",String.class,String.class)就ok了
}
catch (NoSuchMethodException e)
{
e.printStackTrace();
}
catch (SecurityException e)
{
e.printStackTrace();
}
return li.name().equals(name)&&li.password().equals(password);
}
}

java语法规定,方法内定义的局部变量必须先初始化,才能再使用的。但是类的成员变量,会被赋值初始值可以不初始化。
结论就是:局部变量必须先初始化,后使用。

赋值为Null不一定就是初始化了,而是需要为其分配空间