请问Try{}catch{}{}finally{}变量声明的一个小问题

Connection conn = null;
Statement statement = null;
try {
conn = getConnection2();
String sql = "insert into userinfo(username,password)values('avas1','dsfad')";
statement = conn.createStatement();
statement.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
} finally {
statement.close();
conn.close();
}
如果我将conn 和statement放到try里声明,那么finally就会提示找不到这两个变量
这是为什么?

和try catch没有关系,只要是块,就符合这个规则。包括if for while switch等,也包括你不使用以上关键字,故意就写一个块。

这是作用域的问题,一对花括号代表着一个作用域,当你在try的花括号里面定义变量时,该变量只能在try{}中才有效,可以理解为该变量只属于try,finall{}里是找不到该变量的。
如果你在try{}catch{}finally{}的外面定义变量,意思是作用域是在整个try{}catch{}finally{},可以理解为是属于他们共有的。

看java的异常处理机制吧,作用域问题。如果放在try块里,他的作用域只会在try接下来的第一花括号。

在块中声明的变量,在块外面无效。
比如
void foo()
{
{
int i = 1;
}
i = 2; // error
}

你没实例化啊,先在finally中执行了在执行try,顺序就反了。当然报错了

作用域的问题,try块中声明的变量只能在try块中有效,finally中就提示变量未声明了。