
「名簿クラス Meibo」
を自作しようと思っています。
人の名前の配列 person[0]~person[max-1]をフィールド変数に持ちます。
このとき、Meibo から名前を取り出すメソッド
getMemberName(int id) {
return person[id];
}
では、「id が max を超えていないか」をチェックした方が良いと思います。
C言語を使っていた時は
getMemberName(int id) {
assert (id < max);
return person[id];
}
のように、assert 関数でチェックをしていました。
しかし、調べてみると、java では assert のサポートはバージョン1.4からのようです。
java を使う人たちは、通常こういうときにどうしてきたのでしょうか?
(assert 関数を自作する?)
No.5ベストアンサー
- 回答日時:
「Javaを使う人たちは、通常こういうときどうしてきたのでしょうか?」と聞かれているので、なるべく正確に答えると、「何もしない」となると思います。
通常、Javaでは配列の境界チェックは行わず
getMemberName(int id) {
return person[id];
}
とするのが一般的です。
ここで質問者さんに知ってほしいことが2つあります。
1つはなぜ「何もしない」のかということですが、Javaでは配列の境界チェックはVM側がやってくれるので、配列の範囲を超えたアクセスをすると「ArrayIndexOutOfBoundsException」がスローされます。それに対しC言語では配列のサイズを超えていても「配列があるものとして」アクセスするため、万が一配列のサイズを超えたインデックスを指定してまうと不正なメモリアクセスを行い重大な問題になりかねません。それでassertによって厳しいチェックを行っているのでしょう。
そしてもう一つはJavaで1.4からサポートされているassertは通常、「実行時にはオフ」にします。これはassertは開発中にバグを発見するために主に用いられ、「プログラムが誤っている」状態だと判断するものだと言えるからです。それに対し「例外」は実行時のエラー、プログラムが予期せぬ処理を実行しようとしたときに使われるものだ言えます。この2つを区別しておくことは重要です。
ちなみに、どうしても境界チェックを行いたい場合、私なら
if (isAvailableID(id)) {
String name = getMemberName(id);
}
というように、呼び出し元のほうでチェックするようにします。ついでにisAvailableIDメソッドは
public boolean isAvailableID(int ID) {
reutrn 0 <= ID && ID <= person.length-1;
}
といった感じでしょうか。
No.4
- 回答日時:
よくよく見たらすごい勘違い・・・
配列の最大数はわかってますね。
呼び出し側の処理でmaxを超えてたらnullを返すとか
空白を返すとかエラーを投げるとか用途によってわけるかもしれません。
この回答への補足
みなさん、ありがとうございます。みなさんのご回答によると
●何もしなくても、ArrayIndexOutOfBoundsException というエラーを java が出してくれる
Cより随分便利ですね。
●だから、呼び出し側で java が出すエラー(か自作のエラー)を拾って処理すればよい。
●もしくは、return null をする
というところが中心でしょうか。
最初は、呼び出し側ではなく Meibo の方で処理が完結すればよいと思っていました。しかし、よく考えたら、呼び出し側も Meibo のエラー処理を知っておく必要があるのですね。
No.3
- 回答日時:
こんにちは。
person.length
で配列の要素数がintで返ってくるのでそれで比較してます。
try~catchでArrayIndexOutOfBoundsExceptionを拾うなんてことも
可能ですね。
No.2
- 回答日時:
2通りあります。
1. if文を使い、id < max のときのみreturnするようにする。
2. getMemberNameを呼ぶところで、try~catchをする。
No.1
- 回答日時:
> java を使う人たちは、通常こういうときにどうしてきたのでしょうか?
例外をスローするのが一般的じゃないかなぁ。まぁこれは私の流儀なので一般ではないかも知れない。
getMemberName(int id) {
if(id < max)
throw new Exception("配列の範囲を超えています");
return person[id];
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Skype スカイプのIDについておしえてください。 1 2023/04/13 08:52
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- SQL Server SQL 期間内の実施数を合計したい 2 2023/03/03 22:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[Ljava.lang.Stringってなんですか
-
C#で動的配列Listの中身をListB...
-
JavaBeansの配列の値取得方法に...
-
Javaで文字と数字が混ざったも...
-
同じ配列またはクラスを、2回...
-
C++で、Excelの内容を取得する...
-
jspでの二次元配列
-
この警告はどうすれば?
-
n番目に大きな値を探索する
-
ファイルの読み込み、配列に格納
-
C#で配列の戻り値について
-
javaについて
-
java 乱数を並べて重複させない...
-
2次元リスト
-
java
-
Generics で型チェック
-
半角カナの判別方法
-
配列で、値の入っている要素数...
-
strutsでの配列の扱い方について。
-
教えて下さい。for文内での変数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaで文字と数字が混ざったも...
-
フローチャート
-
この警告はどうすれば?
-
[Ljava.lang.Stringってなんですか
-
配列で、値の入っている要素数...
-
C#で動的配列Listの中身をListB...
-
配列の中に複数存在する数がい...
-
セッションを使ったint型の値の...
-
【C#】ハッシュテーブル(連想...
-
javaについて
-
javaでの文字列からの数字抽出
-
配列について
-
javaで大容量テキストファイル...
-
配列数を超えてアクセスしたと...
-
【Ajax通信&Java】配列の受け取...
-
『args[]』とは?
-
ArrayListからBean配列に値をセ...
-
C言語でunsigned char配列を連...
-
strutsで2次元配列をやりとりす...
-
javamailで複数人にメールを送...
おすすめ情報