Java: startPath как исключение "public static final" - PullRequest
0 голосов
/ 10 апреля 2010

[Обновлено, извините за изменение, но теперь к реальной проблеме] Я не могу включить try-catch-loop для исключения из метода getCanonicalPath (). Я попытался решить проблему ранее с методом и затем объявил значение там. Проблема в том, что это Финал, я не могу его изменить. Итак, как иметь стартовый путь как "публичный статический финал".

$ 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 ]

5 голосов
/ 10 апреля 2010

Вы можете предоставить статический метод для инициализации вашей статической переменной:

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
    }
4 голосов
/ 10 апреля 2010

имя в порядке; Вы забыли объявить тип.

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

Исправляя это, вы, конечно, понимаете более сложную проблему того, как бороться с возможными IOException и startingPath, являющимися final. Одним из способов является использование static инициализатора:

JLS 8.7 Статические инициализаторы

Любые статические инициализаторы , объявленные в классе, выполняются при инициализации класса и вместе с любыми инициализаторами полей для переменных класса могут использоваться для инициализации переменных класса класса.

 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 (см. ответ Кевина Брока ). Такой подход на самом деле приводит к лучшей читабельности и является рекомендуемым подходом Джоша Блоха в Effective Java .


Смотри также

2 голосов
/ 10 апреля 2010

Просто инициализируйте его в статическом блоке (переменная является конечной). Вы не можете поймать исключения при объявлении переменной.

0 голосов
/ 10 апреля 2010
 public static final String startingPath = (new File(".")).getCanonicalPath();

Вам не хватает типа переменной startingPath

0 голосов
/ 10 апреля 2010

Вам не хватает типа вашей переменной, оно должно быть

public static void String startingPath ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...