final成员构造函数初始化

lxyscls 2017-03-23 08:52:10
try {
xxx = 123; // xxx is final filed
} catch Exception {
....
}


NetBeans果断提示“可能xxx未被初始化”,请问一般怎么解决呢?去掉异常块,让构造抛异常?还是干脆把final去掉?
...全文
530 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
逗泥丸的平方 2017-03-27
  • 打赏
  • 举报
回复
引用 12 楼 lxyscls 的回复:
谢谢您的回复,我是在构造里面使用了第三方的接口,这个接口会抛异常 目前我选择#11楼的做法,在catch里面补上,不想把这个异常抛出去,因为抛出去意味着外面的使用对该异常产生了依赖 请问注解怎么忽略呢?没用过
注解这个应该是我搞错了. 我当成是null警告了. 你这种情况应该是会报编译错误的. 虽然说代码怎样都可以实现,主要是结构会变得比较奇怪.final应该不是一个很必须的关键字..你是在匿名类里使用到了这个变量? 那大概只能把它们放到一个try块里面或者是提升为全局变量了.. 再就是,我觉得异常并不会产生额外的依赖关系,只要你在合适的地方处理了异常都是OK的. 当然如果你觉得直接return可以满足你的需求那是最简单的方式了... 但是这样也剥夺了这里向外发布最后通知的能力.(外部需要知道这个异常吗,构造失败不会产生其他的问题吗)
lxyscls 2017-03-27
  • 打赏
  • 举报
回复
引用 10 楼 qq_35209952 的回复:
[quote=引用 9 楼 qq_35209952 的回复:] [quote=引用 6 楼 lxyscls 的回复:] [quote=引用 3 楼 qq_35209952 的回复:] “可能xxx未被初始化”,你在上面 写了 final Object xxx; 吧 那就很尴尬了.. 你既然try了, 就有可能走不到 xxx = 123; 然后你的xxx就是未初始化. 连null都不是.
无解? final filed和try {} catch {}个人觉得本质上没有关系呀 难不成只能让构造函数抛异常?[/quote] 啥? 好像我们不在一个频道上. 这是一个警告吧. 那么分情况来讨论一下: 如果你确认 xxx = 123;不会出异常. 就完全没必要把它写在try里面吧? 如果你认为 xxx = 123;会出异常. 那就在catch里面写一下xxx = null 就好了. [/quote] 我是认为你的xxx = 123没这么简单才这样说的. 当然加注解也可以忽略这个错误,只是我觉得这里的确有潜在的问题, 不应该这样处理.[/quote] 谢谢您的回复,我是在构造里面使用了第三方的接口,这个接口会抛异常 目前我选择#11楼的做法,在catch里面补上,不想把这个异常抛出去,因为抛出去意味着外面的使用对该异常产生了依赖 请问注解怎么忽略呢?没用过
China小嘿 2017-03-27
  • 打赏
  • 举报
回复
要么 在try里面声明的时候加 final 如果变量不是常量就不要用final修饰,final只能在变量声明的 时候初始化。
逗泥丸的平方 2017-03-27
  • 打赏
  • 举报
回复
引用 14 楼 lxyscls 的回复:
[quote=引用 13 楼 qq_35209952 的回复:] [quote=引用 12 楼 lxyscls 的回复:] 谢谢您的回复,我是在构造里面使用了第三方的接口,这个接口会抛异常 目前我选择#11楼的做法,在catch里面补上,不想把这个异常抛出去,因为抛出去意味着外面的使用对该异常产生了依赖 请问注解怎么忽略呢?没用过
注解这个应该是我搞错了. 我当成是null警告了. 你这种情况应该是会报编译错误的. 虽然说代码怎样都可以实现,主要是结构会变得比较奇怪.final应该不是一个很必须的关键字..你是在匿名类里使用到了这个变量? 那大概只能把它们放到一个try块里面或者是提升为全局变量了.. 再就是,我觉得异常并不会产生额外的依赖关系,只要你在合适的地方处理了异常都是OK的. 当然如果你觉得直接return可以满足你的需求那是最简单的方式了... 但是这样也剥夺了这里向外发布最后通知的能力.(外部需要知道这个异常吗,构造失败不会产生其他的问题吗)[/quote]
class Cmd {
    boolean help;
    String version;
    ... ...
}
其实大概是这么一个类,存放使用apache.commons.cli解析args后的结果,所以filed是final还是合适的 异常是apache.commons.cli解析函数抛的,如果要throws的话就意味着使用Cmd的其他类需要知道“使用了apache.commons.cli”这一事实,个人觉得不太必要[/quote] 我的意思是, 如果初始化真的有可能失败,而且这个失败会带来其他后果, (拿了一个new过的对象,结果里面xxx是空的) 那么仅仅去掉final也是不负责任的行为.. 你的程序里面一定要有针对这种异常的解决方案,不是么 ? 当然如果你觉得那个异常不可能存在,就当我没说了.
逗泥丸的平方 2017-03-27
  • 打赏
  • 举报
回复
引用 14 楼 lxyscls 的回复:
[quote=引用 13 楼 qq_35209952 的回复:] [quote=引用 12 楼 lxyscls 的回复:] 谢谢您的回复,我是在构造里面使用了第三方的接口,这个接口会抛异常 目前我选择#11楼的做法,在catch里面补上,不想把这个异常抛出去,因为抛出去意味着外面的使用对该异常产生了依赖 请问注解怎么忽略呢?没用过
注解这个应该是我搞错了. 我当成是null警告了. 你这种情况应该是会报编译错误的. 虽然说代码怎样都可以实现,主要是结构会变得比较奇怪.final应该不是一个很必须的关键字..你是在匿名类里使用到了这个变量? 那大概只能把它们放到一个try块里面或者是提升为全局变量了.. 再就是,我觉得异常并不会产生额外的依赖关系,只要你在合适的地方处理了异常都是OK的. 当然如果你觉得直接return可以满足你的需求那是最简单的方式了... 但是这样也剥夺了这里向外发布最后通知的能力.(外部需要知道这个异常吗,构造失败不会产生其他的问题吗)[/quote]
class Cmd {
    boolean help;
    String version;
    ... ...
}
其实大概是这么一个类,存放使用apache.commons.cli解析args后的结果,所以filed是final还是合适的 异常是apache.commons.cli解析函数抛的,如果要throws的话就意味着使用Cmd的其他类需要知道“使用了apache.commons.cli”这一事实,个人觉得不太必要[/quote] 说实话没懂 .. 反正看个人喜好吧.. 只是看起来在这里final又不是必要的关键字..为了一个不必要的东西带来这么多麻烦感觉得不偿失
lxyscls 2017-03-27
  • 打赏
  • 举报
回复
引用 13 楼 qq_35209952 的回复:
[quote=引用 12 楼 lxyscls 的回复:] 谢谢您的回复,我是在构造里面使用了第三方的接口,这个接口会抛异常 目前我选择#11楼的做法,在catch里面补上,不想把这个异常抛出去,因为抛出去意味着外面的使用对该异常产生了依赖 请问注解怎么忽略呢?没用过
注解这个应该是我搞错了. 我当成是null警告了. 你这种情况应该是会报编译错误的. 虽然说代码怎样都可以实现,主要是结构会变得比较奇怪.final应该不是一个很必须的关键字..你是在匿名类里使用到了这个变量? 那大概只能把它们放到一个try块里面或者是提升为全局变量了.. 再就是,我觉得异常并不会产生额外的依赖关系,只要你在合适的地方处理了异常都是OK的. 当然如果你觉得直接return可以满足你的需求那是最简单的方式了... 但是这样也剥夺了这里向外发布最后通知的能力.(外部需要知道这个异常吗,构造失败不会产生其他的问题吗)[/quote]
class Cmd {
    boolean help;
    String version;
    ... ...
}
其实大概是这么一个类,存放使用apache.commons.cli解析args后的结果,所以filed是final还是合适的 异常是apache.commons.cli解析函数抛的,如果要throws的话就意味着使用Cmd的其他类需要知道“使用了apache.commons.cli”这一事实,个人觉得不太必要
逗泥丸的平方 2017-03-24
  • 打赏
  • 举报
回复
引用 9 楼 qq_35209952 的回复:
[quote=引用 6 楼 lxyscls 的回复:] [quote=引用 3 楼 qq_35209952 的回复:] “可能xxx未被初始化”,你在上面 写了 final Object xxx; 吧 那就很尴尬了.. 你既然try了, 就有可能走不到 xxx = 123; 然后你的xxx就是未初始化. 连null都不是.
无解? final filed和try {} catch {}个人觉得本质上没有关系呀 难不成只能让构造函数抛异常?[/quote] 啥? 好像我们不在一个频道上. 这是一个警告吧. 那么分情况来讨论一下: 如果你确认 xxx = 123;不会出异常. 就完全没必要把它写在try里面吧? 如果你认为 xxx = 123;会出异常. 那就在catch里面写一下xxx = null 就好了. [/quote] 我是认为你的xxx = 123没这么简单才这样说的. 当然加注解也可以忽略这个错误,只是我觉得这里的确有潜在的问题, 不应该这样处理.
逗泥丸的平方 2017-03-24
  • 打赏
  • 举报
回复
引用 6 楼 lxyscls 的回复:
[quote=引用 3 楼 qq_35209952 的回复:] “可能xxx未被初始化”,你在上面 写了 final Object xxx; 吧 那就很尴尬了.. 你既然try了, 就有可能走不到 xxx = 123; 然后你的xxx就是未初始化. 连null都不是.
无解? final filed和try {} catch {}个人觉得本质上没有关系呀 难不成只能让构造函数抛异常?[/quote] 啥? 好像我们不在一个频道上. 这是一个警告吧. 那么分情况来讨论一下: 如果你确认 xxx = 123;不会出异常. 就完全没必要把它写在try里面吧? 如果你认为 xxx = 123;会出异常. 那就在catch里面写一下xxx = null 就好了.
galiniur0u 2017-03-24
  • 打赏
  • 举报
回复
final和try-catch是没有什么关系,不过由于你的try-catch会导致后面使用这个final变量时,发现其还未初始化,就会报错。楼主还是把try-catch去掉吧。
安正勋 2017-03-24
  • 打赏
  • 举报
回复
引用 5 楼 lxyscls 的回复:
[quote=引用 4 楼 qq_35246620 的回复:] final 类型变量只能被赋值一次,在声明的时候,就要对其进行赋值。 希望对你所以帮助,O(∩_∩)O~
声明时赋值,{}块赋值,构造器赋值都是可以的呀 [/quote] 你可以把这些都去掉,直接在 final 变量声明时赋值,看这样是否还报错, 如果不报错的话,就说明你现在这样写是有问题的,试试吧~
lxyscls 2017-03-24
  • 打赏
  • 举报
回复
引用 3 楼 qq_35209952 的回复:
“可能xxx未被初始化”,你在上面 写了 final Object xxx; 吧 那就很尴尬了.. 你既然try了, 就有可能走不到 xxx = 123; 然后你的xxx就是未初始化. 连null都不是.
无解? final filed和try {} catch {}个人觉得本质上没有关系呀 难不成只能让构造函数抛异常?
lxyscls 2017-03-24
  • 打赏
  • 举报
回复
引用 4 楼 qq_35246620 的回复:
final 类型变量只能被赋值一次,在声明的时候,就要对其进行赋值。 希望对你所以帮助,O(∩_∩)O~
声明时赋值,{}块赋值,构造器赋值都是可以的呀
安正勋 2017-03-24
  • 打赏
  • 举报
回复
final 类型变量只能被赋值一次,在声明的时候,就要对其进行赋值。 希望对你所以帮助,O(∩_∩)O~
逗泥丸的平方 2017-03-24
  • 打赏
  • 举报
回复
“可能xxx未被初始化”,你在上面 写了 final Object xxx; 吧 那就很尴尬了.. 你既然try了, 就有可能走不到 xxx = 123; 然后你的xxx就是未初始化. 连null都不是.
o枫叶o 2017-03-24
  • 打赏
  • 举报
回复
final类型的变量必须在声明的时候赋值,否则编译错误。
幽饮烛 2017-03-24
  • 打赏
  • 举报
回复
try {} catch {}两个语句块都需要对final变量初始化,或者直接抛异常,或者 return。
我爱娃哈哈 2017-03-23
  • 打赏
  • 举报
回复
xxx不是常量的话,就把final去掉

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧