はじめて質問いたします。
現在、JDK1.1.7 で開発したアプレットがあるのですが、
この中で、java.awt.Choice を未選択状態にする為に select(-1); 
としている個所があります。
このアプレットをJavaPlug-in1.3.1 を使用して実行すると、IllegalArgumentException
が発生してしまいます。

そこで、1.1.7 と 1.3.1 のソースコードを比べてみると、確かに、1.3.1 では、
select(-1) は認めていないようです。

--- JDK1.1.7 の java.awt.Choice の実装 --->

public void select(int pos) {
  if (pos >= pItems.size()) {
    throw new IllegalArgumentException("illegal Choice item position: " + pos);
  }
    :
    :
}
<--- JDK1.1.7 ---

--- JDK1.3.1 の java.awt.Choice の実装 --->

public synchronized void select(int pos) {
  if ((pos >= pItems.size()) || (pos < 0)) {     <--- 違いはここだけ。。。
    throw new IllegalArgumentException("illegal Choice item position: " + pos);
  }
    :
    :
}
<--- JDK1.3.1 ---

う~ん、まさしく、-1 を拒否していますね。

何故、このような実装の違いが出ているのでしょうか?
(私的には、Java2開発者の気まぐれなのではと考えてしまいます。。)

また、このアプレットを最小限の修正で1.3.1 でも正常に動作するようにしたいの
ですが、1.3.1 の java.awt.Choice では未選択状態にする事は不可能なのでしょうか?

ご存知の方がおられましたら、是非、お教え頂きたいと思います。
よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

バージョン1.1.xのAPI仕様を見ても、select(-1)で未選択状態に出来るとは書いてないんですよね…… だから1.1.7のselect(-1)で未選択状態に出来たのは、たまたまそうなっていたからとしか言いようがありませんね。



API仕様では、バージョン1.1でも1.3でも例外キャストの条件が「指定された位置が無効な場合」となっていて、具体的な数字が出てこないのでかなりあいまいな表現ですが、それでも引数に-1を渡したら普通は例外になると考えるのが自然です。

いずれにせよ、バージョン1.3のAPI仕様を見る限り、未選択状態に関することは載っていないので、あとから未選択状態になるように仕向けるのはあきらめたほうが良いと思われます。ほかに上のような裏技があったとしても、将来の実装が変更されないとは言い切れません。

提案: 未選択状態にする代わりに、空白の選択項目、あるいはウェブページに良くある「選択してください!」といったような“無効な項目”を作ってはどうでしょう。未選択状態にする目的がかかれてないので、なんともいえませんが。
    • good
    • 0
この回答へのお礼

>だから1.1.7のselect(-1)で未選択状態に出来たのは、たまたまそうなっていたからとしか言いようがありませんね。

うっ、確かにおっしゃるとおりです。。。
たまたまうまく動いていたからそのままにしておいたと言った感じでしょうか。。。

>提案: 未選択状態にする代わりに、空白の選択項目、あるいはウェブページに良くある「選択してください!」といったような“無効な項目”を作ってはどうでしょう。

そうですね。やっぱりそれしか無いですよね。今後の事も考えると。。。
しかし、数が多いので手間が。。。

ご回答本当にありがとうございました。

お礼日時:2002/04/03 14:18

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む

Q"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

Qjdk1.3で実行すると・・・

jdk1.3でコンパイルし実行すると

Exception in thread "main" java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:385)
at java.awt.GridBagLayout.setConstraints(GridBagLayout.java:357)
at rei008.<init>(rei008.java:144)
at rei008.main(rei008.java:20)

というメッセージが出てプログラムが実行できません。
なぜなんでしょうか?宜しくお願いします。

Aベストアンサー

1.「初期化していない」または「値をセットしていない」変数をアクセスしていませんか。
2.戻り値に値が入っていますか。
3.DBやファイルから読み込んだ値は本当にありますか。

NullPointerExceptionの場合はこれをチェックしています。

QExceptionのStackTraceをStringに格納したい(JDK1.3)

Exception発生時のStackTraceをString変数に格納してエラー時のログ出力等の処理に使用したいと思っており、StackTraceをStringに格納する方法で思案しております。JDK1.4であればgetStackTrace()等が使えそうですが、当方はJDK1.3を使用しており、1.4から実装されたgetStackTrace()は使用できないために独自にコーディングする必要があると思っております。

なにかよい方法はないでしょうか。Stringは配列になってももちろんかまいません。サンプルロジックや参考HP等を紹介していただきたいと思っております。

よろしくお願いいたします。

Aベストアンサー

StringWriterをラップするPrintWriterを作って、printStackTrace(PrintWriter s)で出力すれば?

QJDKバージョン1.3.1以上1.4以下のものを探しています。

JAVAの事が良く分かってなくて恐縮ですが、
バージョン1.4(もしくは1.3.1以上1.4以下)のJDKが必要で、探しているのですが、見つけられません。
どなたか入手先を教えてください。

Aベストアンサー

Archive: Java[tm] Technology Products Download
http://java.sun.com/products/archive/


人気Q&Aランキング

おすすめ情報