下のようなコードを書いて、たとえば
java PossibleCompilerMalfunction Hello
のように実行すると、
Hello
と表示されることを期待していたのですが、
null
と表示されてしまいます。
(JDK1.5を使っています)
final String t = args[0];
の部分を
final String t = "Hello";
のように書き換えると、
Hello
と表示されます。
つまり、コンパイル時に「t」の値が決まっていなければ
nullになってしまうようです。
これってコンパイラのバグでしょうか。
あるいは私の考えに間違いがあるのでしたら、
指摘していただけるとありがたいです。
public class PossibleCompilerMalfunction {
public static void main(String[] args) {
final String t = args[0];
MyClass mc = new MyClass() {
void foo() {
System.out.println(t);
}
};
}
static abstract class MyClass {
MyClass() {
foo();
}
abstract void foo();
}
}
No.3ベストアンサー
- 回答日時:
私の環境 (java/javac 1.5.0_06) で試したら
> java PossibleCompilerMalfunction Hello
に対してちゃんと
Hello
と表示されましたよ。
質問者さんのコンパイラは最新のものですか? もし本当に「null」と表示されたのなら確かにバグだと思います。
この回答への補足
ちょっと補足です。
>javacに常に「-target 1.1」というオプションをつける設定にしていたのを忘れてました。
このことを思い出したのは、
UKYさんの「コンパイラは最新のものですか? 」
という回答がきっかけだったことを書き加えておきます。
回答ありがとうございます。
私の使ってるコンパイラは最新版です。
しかし、ひとつ謝らなくてはいけないことがあります。
古いJVMとの互換性を持たせるため、
(IEで動くアプレットを作ったりしているので)
javacに常に「-target 1.1」というオプションをつける設定にしていたのを忘れてました。
つまり私の環境では、
javac SomeClass.java
とタイプすると、下のように実行されるのです。
javac -source 1.2 -target 1.1 SomeClass.java
オプションをつけないでコンパイルしたら、
(すなわち「-target 1.5」でコンパイルしたら)
ちゃんと「Hello」と表示されました。
お騒がせしてすいません。
しかし、「-target 1.1」だと「null」になるのは
やはりコンパイラのバグだと考えてよさそうでしょうか。
No.6
- 回答日時:
こんばんは。
回答というより補足情報です。まず、メソッド変数にfinalを付けた場合は「一度代入された値または参照を変更できない」というもので、使用方法は問題ないと思います。
私の環境でも試してみましたが、nullと表示されました。
javac -J-version = 1.4.2_08
java -version = 1.5.0_06
mainメソッド内にMyClassをすべて定義する場合はHelloが出力されます。
また、mainメソッドの最後で、mc.foo();とするとHelloが出力されます。
問題はMyClassのコンストラクタがfoo()メソッドを呼んでいる箇所のようです。
やはり、コンパイラのバグでしょうか?
回答ありがとうございます。
koki_mさんのコンパイラは、バージョン「1.4.2_08」のようですね。
最新のコンパイラに代えたら、うまく行くかもしれません。
UKYさんの回答に対する「お礼」を参照してください。
No.4
- 回答日時:
コンパイルエラーと断定は出来ませんが、UKYさんの主張が正しいと思います。
次のように t="World"; を追加するとコンパイルエラーが出力されます。public class PossibleCompilerMalfunction {
public static void main(String[] args) {
final String t = args[0];
t="World"; //追記
MyClass mc = new MyClass() {
void foo() {
System.out.println(t);
}
};
}
static abstract class MyClass {
MyClass() {
foo();
}
abstract void foo();
}
}
javacの結果
PossibleCompilerMalfunction.java:9: final 変数 t に値を代入することはできません
。
t="World";
^
エラー 1 個
No.2
- 回答日時:
finalとはまさに
「コンパイル時に値が決まっていなければならないもの」
です。
arg[0]はコンパイル時にはnullなので、コンパイラは間違っていません。
回答ありがとうございます。
しかし、final変数は、コンパイル時に値が決まっていなければならないとは限らないのでは?
「ブランクfinal変数」というのもありますし、
たとえば下のようなコードは、コンパイル時には値が決まっていません。
final String userName = System.getProperty("user.name");
また、配列argsの大きさは
実行時のコマンドライン引数によって決まるので、
args[0]はコンパイル時には決まっていないのではないでしょうか。
No.1
- 回答日時:
java の 変数の final 指定は定数ですから、
そうなりますね。
arg[0]は可変なのですから、final 指定しなければ、
OKでしょう。
参考URL:http://ux01.so-net.ne.jp/~komori/doc/java/final. …
回答ありがとうございます。
finalを指定しないローカル変数は
匿名クラス(あるいは無名クラス)からアクセスできないので
やむをえずfinalを付けました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Java eclipse実行ができない 2 2022/07/27 04:47
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Socketの接続のタイムアウトを...
-
変数を動的に利用するには?
-
NoSuchMethodErrorが解決できま...
-
コンストラクタの引数の中のnew?
-
System.exit()の値を取得したい
-
初心者なので教えてほしいです。
-
Javaで日本語の出力が文字化けする
-
考えてもちっともいい案が出て...
-
(1)を表示するには
-
HashMapについて
-
コマンドライン引数の*(アフ...
-
(長文です。すみません。)rep...
-
Java 最大公約数 gcd
-
中カッコ{}だけの記述について
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
ループ処理の際、最後だけ","を...
-
ORA-01858: 数値を指定する箇所...
-
[JAVA]try 内の変数を外で!?
-
オブジェクトの中のプロパティ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数を動的に利用するには?
-
プログラミングの問題です。大...
-
中カッコ{}だけの記述について
-
Javaでlog4jを使ってログ出力を...
-
NoSuchMethodErrorが解決できま...
-
Socketの接続のタイムアウトを...
-
コンストラクタの引数の中のnew?
-
javaのプログラミングで作るRPG...
-
System.exit()の値を取得したい
-
JSP/Servletのパラメータの受け...
-
Processing :指定フォルダ内の...
-
javaで特定の文字列から特定の...
-
インタフェイス実装と抽象クラ...
-
Javaで日本語の出力が文字化けする
-
randomで
-
【初心者です】javaで平均値を...
-
StringクラスのcompareToメソッド
-
初心者なので教えてほしいです。
-
GetterとSetterをやったのに。
-
ArrayList でスタックを
おすすめ情報