Java出现final局部变量无法赋值报错,该如何正确声明对应变量?
报错原因
Java语法规定final修饰的局部变量仅允许进行一次赋值。你当前的代码先在声明时给enter赋值了null,后续在try代码块中又尝试给它赋值新的Scanner实例,重复赋值触发了编译规则校验,因此抛出该错误。
解决方案
根据你的使用场景可以选择以下任意一种方式处理:
- 方案1:去掉声明时的初始赋值,仅保留
final声明,后续只赋值一次
如果你确实需要把变量声明为final(比如要在匿名内部类中使用),可以调整为如下写法:void yyyyyy(ActionEvent event){ final Scanner enter; // 只声明不赋值,此时final变量处于未赋值状态 try{ enter = new Scanner(xxxxx); // 第一次也是唯一一次赋值,符合final规则 // 此处填写业务逻辑 }catch(Exception e){ // 此处填写异常处理逻辑 }finally{ if(enter != null){ enter.close(); } } } - 方案2:移除显式
final声明(Java 8及以上版本适用)
Java 8之后引入了*有效只读(effectively final)*特性:只要一个局部变量只被赋值一次,哪怕没有显式加final修饰,也可以满足匿名内部类、Lambda表达式等场景对变量只读的要求,你可以直接去掉final关键字即可正常编译。 - 方案3:使用try-with-resources语法自动释放资源(更推荐)
你当前的代码本质是要在finally块中关闭Scanner资源,Java 7及以上版本支持try-with-resources语法,可以自动实现资源关闭,不需要手动编写finally逻辑,也不需要额外处理变量声明问题:void yyyyyy(ActionEvent event){ try(Scanner enter = new Scanner(xxxxx)){ // 业务逻辑直接使用enter即可,无需手动调用close方法 }catch(Exception e){ // 此处填写异常处理逻辑 } }
内容的提问来源于stack exchange,提问作者Talcazul
相关产品推荐
相关产品推荐

