使用引发异常的方法在静态块中初始化的最终静态变量

因为

考虑下面的代码部分

private static class InnerClass
{
   private static final BufferedImage connectionImage; // line A
   private static final int width;
   // other not relevant fields
   static
   {
       try
       {
           connectionImage = ImageIo.read(...); // doeasn't really matter - any method that throws exception
       }
       catch(IOException e)
       {
           // handle
          connectionImage = null; // line B
       }
       if(connectionimage != null) // line C
       {
          width = connectionImage.getWidth();
       }
       else
       {
          width =0;
       }
   }
   // rest of the class definition
}

在这种情况下,我在行B上获取了“可能已经分配了变量”的信息,如果我在try{}块中有更多行,并且在初始化变量后引起异常,则可能为true 当我final从A行删除单词时,它可以编译,但是static {}当我尝试使用connectionImage.getWidth()(当然,如果它不为null)分配imageWidth / height(也是最终的静态值)时,块中稍后收到警告警告是“初始化期间使用非最终变量”。如果我决定final在A行中使用并删除B行,则在C行中收到“变量connectionImage可能尚未初始化”的信息。

我的问题是:是否有一种方法可以static {}使用引发异常(或通常在内部try/catch)的函数来初始化静态最终变量并在块中使用,还是我应该以其他方式处理?(构造函数)

注意(如果相关):是的,此类的名称是为了告诉您它是内部类。它也是静态的,因为如果不是,我就不能在其中声明静态字段。

我知道如何编写代码来完成我想做的事情,但是由于我的方便,我想拥有这个内部类,并希望将某些行为分开。我只是不知道静态的最终静态块,尝试/捕获情况。我在Google中找不到很好的解释,我什至检查了我以前的“ Thinkking in Java” ...

这是类似Java的东西-最终变量可以在静态初始化块中初始化吗?但是作者没有尝试在catch中初始化变量,也没有在分配后在静态块中使用它们,因此以后不会收到“ Use of non-final ...”警告。

乔恩·斯基特

基本上,您应该使用局部变量:

BufferedImage localImage = null;
try
{
    localImage = ImageIo.read(...);
}
catch (IOException e)
{
    // No need to set a value, given that it's already going to be null.
    // You probably want to log though.
}
connectionImage = localImage;

现在您可以确定connectionImage变量将只分配一次。

然后,我将使用条件运算符作为width,这样可以更清楚地知道只有一个赋值:

width = connectionImage != null ? connectionImage.getWidth() : 0;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

静态最终变量和静态初始化程序块

来自分类Dev

静态最终变量和静态初始化程序块

来自分类Dev

在C99中使用静态变量初始化静态变量

来自分类Dev

为什么超类中的静态块/静态变量在main之前初始化?

来自分类Dev

异常后重试局部静态变量初始化

来自分类Dev

从静态块或方法初始化静态最终int并在批注中使用它

来自分类Dev

使用任何静态方法之前,请确保静态变量已初始化?

来自分类Dev

Java如何初始化静态变量和静态方法?(使用简单代码)

来自分类Dev

使用任何静态方法之前,请确保静态变量已初始化?

来自分类Dev

为什么静态最终变量使用静态方法初始化需要同步?

来自分类Dev

为什么静态最终变量使用静态方法初始化需要同步?

来自分类Dev

静态变量的初始化

来自分类Dev

静态变量未初始化

来自分类Dev

静态变量初始化过程

来自分类Dev

静态变量本身的初始化

来自分类Dev

.lib中的C ++静态变量未初始化

来自分类Dev

在PHP中初始化静态变量

来自分类Dev

在Java中初始化静态变量

来自分类Dev

Java中静态变量的初始化

来自分类Dev

多线程声明中的静态变量初始化

来自分类Dev

在Unity中哪里可以初始化静态变量?

来自分类Dev

.lib中的C ++静态变量未初始化

来自分类Dev

使用静态变量初始化同一类中的变量

来自分类Dev

使用静态变量初始化同一类中的变量

来自分类Dev

方法调用中的静态变量Null,但在程序中初始化

来自分类Dev

在C#中,是否在调用main()方法之前初始化所有静态变量?

来自分类Dev

使用非默认值在VBA中初始化静态变量

来自分类Dev

在静态构造函数中初始化静态变量而不是直接赋值的好处是什么?

来自分类Dev

初始化静态变量时抛出奇怪的异常

Related 相关文章

  1. 1

    静态最终变量和静态初始化程序块

  2. 2

    静态最终变量和静态初始化程序块

  3. 3

    在C99中使用静态变量初始化静态变量

  4. 4

    为什么超类中的静态块/静态变量在main之前初始化?

  5. 5

    异常后重试局部静态变量初始化

  6. 6

    从静态块或方法初始化静态最终int并在批注中使用它

  7. 7

    使用任何静态方法之前,请确保静态变量已初始化?

  8. 8

    Java如何初始化静态变量和静态方法?(使用简单代码)

  9. 9

    使用任何静态方法之前,请确保静态变量已初始化?

  10. 10

    为什么静态最终变量使用静态方法初始化需要同步?

  11. 11

    为什么静态最终变量使用静态方法初始化需要同步?

  12. 12

    静态变量的初始化

  13. 13

    静态变量未初始化

  14. 14

    静态变量初始化过程

  15. 15

    静态变量本身的初始化

  16. 16

    .lib中的C ++静态变量未初始化

  17. 17

    在PHP中初始化静态变量

  18. 18

    在Java中初始化静态变量

  19. 19

    Java中静态变量的初始化

  20. 20

    多线程声明中的静态变量初始化

  21. 21

    在Unity中哪里可以初始化静态变量?

  22. 22

    .lib中的C ++静态变量未初始化

  23. 23

    使用静态变量初始化同一类中的变量

  24. 24

    使用静态变量初始化同一类中的变量

  25. 25

    方法调用中的静态变量Null,但在程序中初始化

  26. 26

    在C#中,是否在调用main()方法之前初始化所有静态变量?

  27. 27

    使用非默认值在VBA中初始化静态变量

  28. 28

    在静态构造函数中初始化静态变量而不是直接赋值的好处是什么?

  29. 29

    初始化静态变量时抛出奇怪的异常

热门标签

归档