0

[更新、変更について申し訳ありませんが、実際の問題になりました] メソッドgetCanonicalPath()からの例外のために、そこにtry-catch-loopを含めることはできません。私は以前にメソッドを使用して問題を解決し、そこで値を宣言しようとしました。問題はそれが最終的なものであり、私はそれを変更することができないということです。したがって、startingPathを「publicstaticfinal」にする方法。

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

5 に答える 5

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
    }
于 2010-04-10T16:06:17.873 に答える
4

名前は大丈夫です。タイプを宣言するのを忘れました。

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

IOExceptionそれを修正すると、もちろん、可能性とstartingPath存在にどう対処するかというより難しい問題に気づきますfinal。1つの方法は、static初期化子を使用することです。

JLS8.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メソッドを使用することです(Kevin Brockの回答を参照)。このアプローチは、実際には読みやすさを向上させる結果であり、EffectiveJavaのJoshBlochが推奨するアプローチです。


も参照してください

于 2010-04-10T15:57:06.573 に答える
2

静的ブロックで初期化するだけです(変数はfinalです)。変数の宣言で例外をキャッチすることはできません。

于 2010-04-10T16:04:11.843 に答える
0

変数のタイプが欠落しています。

public static void String startingPath ...
于 2010-04-10T15:57:47.900 に答える
0
 public static final String startingPath = (new File(".")).getCanonicalPath();

変数のタイプがありません startingPath

于 2010-04-10T15:57:50.973 に答える