4

私は次のコードを持っています、

class AA {

    public static void main(String[] args) {

        long ll = 100 ;

        AA1 a1 = new AA1() ;

        if(ll == 100) // Marked line
            long lls [] = a1.val(ll);

    }
}

class AA1 {

    public long [] val (long ll1) {
        long [] val = new long []{1 , 2, 3};
        return val ;
    }

}

マークされた行なしで適切に実行されます。ただし、マークされた行でエラー「.class expected」が発生します。何が問題で、これを解決する方法を教えてもらえますか?

4

2 に答える 2

9

基本的に、これは問題の簡略版です。

if (condition)
    int x = 10;

Javaではそれができません。変数宣言を本体内の単一のステートメントとして使用することはできませんif...おそらく、変数自体が無意味になるためです。唯一の目的は、割り当てに使用される式の副作用です。

無意味な宣言が本当に必要な場合は、中括弧を使用します。

if (condition) {
    int x = 10;
}

まだ役に立ちませんが、少なくともコンパイルされます...

編集:コメントに応答して、ブロックの外側で変数を使用する必要がある場合は、ブロックのifに宣言する必要があり、値を読み取る前に初期化されていることを確認してください。例えば:if

// Note preferred style of declaration, not "long lls []"
long[] lls = null; // Or some other "default" value
if (ll == 100) {
    // I always put the braces in even when they're not necessary.
    lls = a1.val(ll);
}
// Now you can use lls

または:

long[] lls;
if (ll == 100) {
    lls = a1.val(ll);
} else {
    // Take whatever action you need to here, so long as you initialize
    // lls
    lls = ...;
}
// Now you can use lls

または、条件式を使用することもできます。

long[] lls = ll == 100 ? a1.val(ll) : null;
于 2012-04-25T22:16:28.107 に答える
2

Jon Skeet が指摘しているように、これ (1):

if(ll == 100)
    long lls [] = a1.val(ll);

宣言を単一のステートメントとして使用しているため、コンパイルされません。

これ (2):

if(ll == 100){
    long lls [] = a1.val(ll);
}

コンパイラは の内部にあるものをあまり気にしないため、コンパイルされます。これは、 に関する{}限り、ブロックifです。(3) と同等であるため、これも無意味です。

if(ll == 100)
    a1.val(ll);

ただし、(1)を見ると、通常、実際に意味されているのは次のように見えます。

long lls [];
if(ll == 100)
    lls = a1.val(ll);
于 2012-04-25T22:25:25.060 に答える