Java:startingPath为“public static final”异常

时间:2010-04-10 15:55:50

标签: java static scope final

[已更新,对于此更改感到抱歉,但现在确实存在问题] 我不能在那里包含try-catch-loop来获取方法getCanonicalPath()的异常。我试图先用方法解决问题,然后在那里声明值。问题是它是最终的,我无法改变它。那么如何将startingPath作为“public static final”。

$ cat StartingPath.java 
import java.util.*;
import java.io.*;

public class StartingPath {
 public static final String startingPath = (new File(".")).getCanonicalPath();

 public static void main(String[] args){
  System.out.println(startingPath);
 }
}
$ javac StartingPath.java 
StartingPath.java:5: unreported exception java.io.IOException; must be caught or declared to be thrown
 public static final String startingPath = (new File(".")).getCanonicalPath();
                                                                           ^
1 error

5 个答案:

答案 0 :(得分:5)

您可以提供静态方法来初始化静态变量:

public static final String startingPath = initPath();

private static String initPath() {
    try {
        return new File(".").getCanonicalPath();
    } catch (IOException e) {
        throw new RuntimeException("Got I/O exception during initialization", e);
    }
}

或者您可以在静态块中初始化变量:

public static final String startingPath;

static {
    try {
        startingPath = new File(".").getCanonicalPath();
    } catch (IOException e) {
        throw new RuntimeException("Got I/O exception during initialization", e);
    }
}

编辑:在这种情况下,您的变量为static,因此无法声明抛出的异常。仅供参考,如果变量是非static,您可以通过在构造函数中声明抛出的异常来执行此操作,如下所示:

public class PathHandler {

    private final String thePath = new File(".").getCanonicalPath();

    public PathHandler() throws IOException {
        // other initialization
    }

答案 1 :(得分:4)

这个名字很好;你忘了申报这个类型了。

public static final String startingPath;
//                  ^^^^^^

解决这个问题,您当然会意识到如何处理可能的IOExceptionstartingPath final这一难题。一种方法是使用static初始值设定项:

JLS 8.7 Static Initializers

  

在类中声明的任何静态初始化器在初始化类时执行,并且与类变量的任何字段初始化器一起,可用于初始化类的类变量。

 public static final String startingPath;
 static {
    String path = null;
    try {
      path = new File(".").getCanonicalPath();
    } catch (IOException e) {
      // do whatever you have to do
    }
    startingPath = path;
 }

另一种方法是使用static方法(请参阅Kevin Brock's answer)。这种方法实际上提高了可读性,是Josh Bloch在 Effective Java 中推荐的方法。


另见

答案 2 :(得分:2)

只需在静态块中初始化它(变量是最终的)。您无法在声明变量时捕获异常。

答案 3 :(得分:0)

您缺少变量的类型,它应该是

public static void String startingPath ...

答案 4 :(得分:0)

 public static final String startingPath = (new File(".")).getCanonicalPath();

您缺少变量类型startingPath