★★Java質問・相談スレッド143★★
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2011/01/25(火) 03:07:32JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作管理 http://pc11.2ch.net/hp/
Webプログラミング http://pc11.2ch.net/php/
をご利用下さい。
よくある質問
・「コマンドまたはファイル名が違います」
「'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
「Exception in thread "main" java.lang.NoClassDefFoundError: 」
(p)ttp://www.wikiroom.com/java/?path,classpath
・String に == は使うな。equals() を使え。
・「\12288 は不正な文字です。」
文字リテラル以外で全角スペースは使えません。半角スペースに。
・その他の質問→「APIのjavadoc見ろ」
前スレッド
★★Java質問・相談スレッド142★★
http://hibari.2ch.net/test/read.cgi/tech/1290103530/
次スレは>>950あたりで。
過去ログ、関連スレッド、よくある質問とその回答など、
質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
http://www.wikiroom.com/java/
0655デフォルトの名無しさん
2011/03/04(金) 11:14:07.73そう思うよ。@paramや@throwsでだめな呼び出し方があると文書化できるし、実行時にもわかる
正しく処理されてだめな時はだめになるかを成立しているかは、テストで確かめられる
assertはエラーだからVMレベルで実行不可能という意味で使いたいところかな。書くのは簡単なんだけど
>>654
「何かしら例外を投げるだろう」はコードの浅いところで起きた方がいいと思う
それに例外が無いということはすべての変数が受け入れ可能って仕様になるから
呼び出しミスなのにメソッドの実装ミスを意味させることになる
今回の場合設計上悪い呼び出し方があるって解っていることだし
コードは短い方がいいけど、間違いが解りやすくなってる方がよりいい
0656デフォルトの名無しさん
2011/03/04(金) 11:28:32.500657デフォルトの名無しさん
2011/03/04(金) 12:53:39.03基本的にはJavadocに書いた仕様を満たすようにすりゃ良いとは思う
引数の仕様にi <= 0はダメって書いてあるならIAE投げるのが普通だろ
0658デフォルトの名無しさん
2011/03/04(金) 15:29:39.97誰が使うか全くわからんくらいに大量配布するAPI作るってんならともかく、
ふつう目的の機能を動かすためにプログラミングするんだろう
どうせ投げない例外処理を書いてもしょうがない
(当たり前だが、失敗しそうなことに対して自動テスト書いてくことのほうが大事)
0659デフォルトの名無しさん
2011/03/04(金) 15:35:49.46素人さん?
0660デフォルトの名無しさん
2011/03/04(金) 15:45:04.87そもそも自動テストを「失敗しそうな事」とやらの検証の為に書いている時点でおかしいだろ
自動テストは仕様通りの動作をする事を保証する為に書く物だ
その例外が発生しない事をお前はどうやって保証するつもりだよ
「ぼくがぼくの為に書いてぼくが使ってるAPIなんだから絶対大丈夫だよ!」とでも言うつもりか
0661デフォルトの名無しさん
2011/03/04(金) 15:57:54.640662デフォルトの名無しさん
2011/03/04(金) 16:00:47.48良く嫁
0663デフォルトの名無しさん
2011/03/04(金) 16:25:09.24範囲外の値を引数に指定したらArrayIndexOutOfBoundsExceptionをスローするとドキュメントに書いてあるなら
別にそれはそれで構わないが、エラーを出さずに正しく動いているように見えてしまったり
後になってからエラーが出たりするのは最悪
0664デフォルトの名無しさん
2011/03/04(金) 16:45:10.42それはそういう仕様だとJavadocに書いてあったりしないか?
仮に書いていなかったとしても、標準APIでもある事例だからと言って
問題解決を複雑化したり、バグの温床になるようなコードを書く理由にはならない
Javaは上位互換を大事にしている言語だから
実際はその仕様はイケてないと思われているけれど
スローする例外の種類が変わると互換が崩壊するから
なおしたくてもなおせない可能性だってあり得るわけで
0665デフォルトの名無しさん
2011/03/04(金) 16:52:49.18NullPointerException投げるんでもIllegalArgumentException投げるんでもどっちでもいい。
そーいやmethod(@NonNull String arg)みたいなアノテーションってどうなったんだっけ?
0666デフォルトの名無しさん
2011/03/04(金) 17:01:45.67JSR308が動いてないから無かった事になってるんじゃない?
0667デフォルトの名無しさん
2011/03/04(金) 17:02:50.660668デフォルトの名無しさん
2011/03/04(金) 17:05:00.320669デフォルトの名無しさん
2011/03/04(金) 17:12:54.160670デフォルトの名無しさん
2011/03/04(金) 17:57:36.220671デフォルトの名無しさん
2011/03/04(金) 19:01:09.600672デフォルトの名無しさん
2011/03/04(金) 19:44:29.520673デフォルトの名無しさん
2011/03/04(金) 19:53:20.67そういう機能入れだしたら歯止めがきかなくなるんだよな
俺俺JavaだらけになってC++みたいになる
0674デフォルトの名無しさん
2011/03/04(金) 21:59:25.33似たような物でグーグルがインターフェイスでバリデーションかけれるフレームワークリリースしてたけど
あれはインターフェイスでバリデーションかけられるから良いんであって
@NonNullとか怖ろしい真似するのはやめて欲しいよな
0675デフォルトの名無しさん
2011/03/04(金) 22:06:05.740676デフォルトの名無しさん
2011/03/04(金) 22:08:10.060677デフォルトの名無しさん
2011/03/04(金) 22:11:15.360678デフォルトの名無しさん
2011/03/04(金) 22:23:35.85synchronizedで他のスレッドが実行されてる時は
そのスレッドがロックを解除するまでwaitが維持される
0679デフォルトの名無しさん
2011/03/04(金) 22:25:39.81if(i > 0) b(i);
}
private void b(int i) {
if(i <= 0) throws IllegalArgumentException();
...
}
この IllegalArgumentExceptionを投げる分岐はVMレベルで到達可能なのか?
0680デフォルトの名無しさん
2011/03/04(金) 22:34:13.41書いてはある。ただし明示的チェックはしていないとあるし、throwする例外だと宣言されているわけではない。>>654 と同じ方針だと思われる。
> 領域が境界内にない場合は、ArrayOutOfBoundsExceptionがスローされることがあります。ただし、明示的な境界チェックは必ずしも実行されません。
NullPointerExceptionとArrayOutOfBoundsExceptionは明示的にチェックされていないことが多い。
0681デフォルトの名無しさん
2011/03/04(金) 22:35:43.39仮にそのクラスにそれ以外メソッドがないとしても、リフレクション経由の呼び出しもあるし。
0682デフォルトの名無しさん
2011/03/04(金) 22:39:18.88Thread.sleepだと維持されるけど、Object.waitだとされないんだよ…
俺も今日試して知ったんだが…
0683デフォルトの名無しさん
2011/03/04(金) 22:40:52.800684デフォルトの名無しさん
2011/03/04(金) 22:43:02.54java.lang、java.io、java.utilあたりは真面目に境界チェックやnullチェックやってたような。
0685デフォルトの名無しさん
2011/03/04(金) 22:44:23.12setAccessibleすりゃできるよ。
0686デフォルトの名無しさん
2011/03/04(金) 22:46:59.47お前はその状態からbが呼ばれる複数の方法が想像できない程度のバカなのか?
仮にその二つのメソッドしかないプログラムならば、お前はそんなコードを書くバカなのか?
違うだろ?
0687デフォルトの名無しさん
2011/03/04(金) 22:48:00.41privateメソッドなのに
b()が呼ばれる可能性を否定できない!
とそのクラスを開いているエディタの前で頭抱えるのか?
ああ、リフレクションね。
そんなこと言ったら、Threadの推奨されないメソッドを使ったりすると
いつでもどこでもチェックされる例外が投げられる可能性があるから、
どこでも、Exceptionをキャッチしとかないとね。
0688デフォルトの名無しさん
2011/03/04(金) 22:51:25.26真面目にチェックしているAPIを呼ぶ前に、値のチェックをするべきかって話。
APIからにしろ、ユーザーコードにしろ、例外が投げられて処理を抜ける。
0689デフォルトの名無しさん
2011/03/04(金) 22:53:58.280690デフォルトの名無しさん
2011/03/04(金) 22:59:36.71VMで到達不可能なところにassertを書くべきならば
IllegalArgumentExceptionを投げる分岐は到達不可能なのだから
IllegalArgumentExcpetionを投げるよりはassertを書くべきだろ
と主張したつもりだったのだが、
便所の落書にこんなにつらづらと書くのは面倒だし
意図は分かるだろうと手抜きをした俺は馬鹿なのか?
0691デフォルトの名無しさん
2011/03/04(金) 23:08:38.78>便所の落書に
真面目な返事を期待したのが(ry
0692デフォルトの名無しさん
2011/03/04(金) 23:13:12.17アサーションはあくまでテストの為の物なんだし
0693デフォルトの名無しさん
2011/03/04(金) 23:20:16.250694デフォルトの名無しさん
2011/03/04(金) 23:26:53.250695デフォルトの名無しさん
2011/03/04(金) 23:29:45.750696デフォルトの名無しさん
2011/03/04(金) 23:32:34.25事後条件、不変条件および非公開メソッドの事前条件はassertを使う。
0697デフォルトの名無しさん
2011/03/04(金) 23:39:23.290698デフォルトの名無しさん
2011/03/04(金) 23:41:30.67もうちょっとマシなやり方あったんちゃうんかと
0699デフォルトの名無しさん
2011/03/04(金) 23:45:05.34そういう奴はjava.util.loggingは使わん(キリッって言ってんだろうな。
0700デフォルトの名無しさん
2011/03/04(金) 23:45:11.460701デフォルトの名無しさん
2011/03/04(金) 23:45:45.860702デフォルトの名無しさん
2011/03/04(金) 23:48:24.54ロガーも実際使わないだろ?
標準APIや言語機能であっても
イケてなければ代わりのものを使うのは
カッコ悪いことじゃないよ
0703デフォルトの名無しさん
2011/03/04(金) 23:55:51.430704デフォルトの名無しさん
2011/03/05(土) 00:09:50.34カッケーッスネ
0705デフォルトの名無しさん
2011/03/05(土) 00:20:21.87防御的コピーの前に事前条件チェックは意味ないし、
オブジェクトの責務を考えれば、防御的コピーはそれをフィールドに格納するクラスが行うべき。
したがって、非公開なメソッド(コンストラクタを含む)まで事前条件のチェックが遅延されるかもしれないし、
その場合そこでIAEを投げざるを得ない。
また、オブジェクト指向の意味を考えれば
オブジェクトは、そのメソッドの呼び出しかたや順序に依存せずに整合性を保つことを保証することで、
一度に考えなければならない複雑さを各オブジェクトに分散・カプセル化しているのだから、
privateなどでカプセルの内側でありオブジェクト指向の範囲外であることを明示でもしてない限り
渡されてくるオブジェクトに対して、事前条件のチェックがされているのか、それとも遅延されているのか
判断する材料をそのオブジェクトの外に求めるのは、カプセル化に逆行する。
0706デフォルトの名無しさん
2011/03/05(土) 00:26:26.75対処法ある?
0707デフォルトの名無しさん
2011/03/05(土) 01:05:01.82プロセス殺したら?
0708デフォルトの名無しさん
2011/03/05(土) 02:08:54.440709デフォルトの名無しさん
2011/03/05(土) 02:25:32.10http://sourceforge.jp/
0710デフォルトの名無しさん
2011/03/05(土) 02:33:37.16もっと具体的にお願いします
0711デフォルトの名無しさん
2011/03/05(土) 02:44:59.95> 防御的コピーの前に事前条件チェックは意味ないし、
意味不明
0712デフォルトの名無しさん
2011/03/05(土) 12:29:29.79ありえない。だから例外やassertは無くてもいい
privateメソッドは参照もとをテストすれば実装が正しいかわかるから
でもプログラミングミスを防ぐ目的なら入れてドキュメントを作るとなお良い
入れるとして、assertよりillegalArgumentExceptionの方が意味が合う
そもそもassertは、使われるかもしれないし使われないかもしれないから、チェックにならない
0713デフォルトの名無しさん
2011/03/05(土) 12:38:49.59だから、assertは実行することもできるというオマケつきのコメントだと
コメントは必要ないと主張するのか?
0714デフォルトの名無しさん
2011/03/05(土) 12:43:02.930715デフォルトの名無しさん
2011/03/05(土) 13:49:38.540716デフォルトの名無しさん
2011/03/05(土) 14:30:39.31コメントに書くくらいならドキュメントに書け
情報分散させんなカス
0717デフォルトの名無しさん
2011/03/05(土) 15:13:15.920718デフォルトの名無しさん
2011/03/05(土) 15:41:03.36根本的にassertと例外を比較してるのが間違いだと俺も思う
assertはあくまで実行可能なコメントでありテスト用途だと思うし
コンパイル方法によっては実行されない以上は例外の代用たり得ない
コメントとしては、プログラミング中のミスも把握しやすいし悪くはないと思うよ
他の人がソース読んだ時も、条件が明示的に書いてあって見通しは良くなると思う
ただErrorで落とすようなものだし、一応Javadocにもその旨記載した方が良いんじゃない?
意図的にエラーで落とすプログラムってのが俺には想像付かないけど経験不足なんだろう
俺ならエラーで落とすくらいなら、例外投げてキャッチしてログ吐いてから終了って手順を取る
0719デフォルトの名無しさん
2011/03/05(土) 15:42:56.920720デフォルトの名無しさん
2011/03/05(土) 16:24:27.25直接「お前の使い方が間違ってる」と怒鳴りに行けるような関係ならポリシー次第でassertでもいい
代わりにコードに怒鳴らせる必要があるなら例外
0721デフォルトの名無しさん
2011/03/05(土) 16:36:53.740722デフォルトの名無しさん
2011/03/05(土) 16:43:25.340723デフォルトの名無しさん
2011/03/05(土) 16:55:00.38assertと例外の質問があったからだろバカ
0724デフォルトの名無しさん
2011/03/05(土) 17:35:47.450725デフォルトの名無しさん
2011/03/05(土) 17:40:56.05assertは例外の代わりにはならないし
例外もassertの代わりにはならない
0726デフォルトの名無しさん
2011/03/05(土) 17:46:21.44内部をどう作ろうが勝手。プロジェクトのポリシー次第。
約束の通じない不特定多数が使うライブラリに関しては、引数はきっちりチェックして例外を投げる。
0727デフォルトの名無しさん
2011/03/05(土) 18:12:44.71例外にしろassertにしろコード中に書かなくてもいいってのを説明したのが元々
理解したのか知らんけど、テストでわかるのに到達するしないの話になるのも知らん
引数チェックはもちろん入れたっていい。でもテスト通れば一応期待通り動いてるのは解る
チェック入れるならassertより例外を使うのが通例で、入れたらドキュメント(コメント)は書けと言ってる
例外なら@throwsで定型のドキュメントが書ける
assertなら@throws AssertionErrorだろうけど、俺はテストライブラリ以外でこれを見たことが無い
0729デフォルトの名無しさん
2011/03/05(土) 18:18:05.730730デフォルトの名無しさん
2011/03/05(土) 18:31:40.46そうそう、元々の元はそれ
0731デフォルトの名無しさん
2011/03/05(土) 18:45:27.170732デフォルトの名無しさん
2011/03/05(土) 19:24:53.330733デフォルトの名無しさん
2011/03/05(土) 19:48:06.04ある
0734デフォルトの名無しさん
2011/03/05(土) 20:10:50.200735デフォルトの名無しさん
2011/03/05(土) 20:46:04.90勘違い乙
0736デフォルトの名無しさん
2011/03/05(土) 22:04:20.74NullPointerExceptionやIllegalArgumentExceptionを発生させるってどうなのか?
外部から引数ありのpublicメソッドがNPEやIAEを投げてきたら
自分が渡した引数に問題があると思ってしまうのが自然じゃないのか?
0737デフォルトの名無しさん
2011/03/05(土) 23:32:39.07お前は何を言ってるんだ?
0738デフォルトの名無しさん
2011/03/05(土) 23:50:14.930739デフォルトの名無しさん
2011/03/06(日) 00:37:59.53末端コーダーの手抜きコードなんてさわりたくもないな。
0740デフォルトの名無しさん
2011/03/06(日) 00:53:49.630741デフォルトの名無しさん
2011/03/06(日) 00:53:55.81こんなことを言う奴のコードなんて触りたくもないな。
0742デフォルトの名無しさん
2011/03/06(日) 00:59:22.130743デフォルトの名無しさん
2011/03/06(日) 01:01:36.01どうやるの?
0744デフォルトの名無しさん
2011/03/06(日) 10:07:21.12がっ
0745デフォルトの名無しさん
2011/03/06(日) 12:45:17.88//タスク実行
}
を、タスク実行の部分を
Thread t = new Thread(new Runnable(){
//タスク実行
}
のように非同期に書き換えたのですが
Runnable#run()の中で発生する例外を呼び出し元で処理させるようにしたいのですが
一般的にはどのように書くのがよいのでしょうか?
0746デフォルトの名無しさん
2011/03/06(日) 13:21:30.790747デフォルトの名無しさん
2011/03/06(日) 18:05:04.07すいません、よくわからないです。。
0748デフォルトの名無しさん
2011/03/06(日) 19:32:28.12contains("" + j)とするとできるのですが
この引数 "" + j がCharSequenceになるのはどういうことなのか
わかりません教えてください。
0749デフォルトの名無しさん
2011/03/06(日) 19:37:23.08これは言語仕様でそう決まっている。
文字列はStringクラスのインスタンス。
StringクラスはCharSequenceインターフェイスを実装している。
だから文字列をCharSequence型として扱うことができる。
0750デフォルトの名無しさん
2011/03/06(日) 19:40:57.19分かりました。ありがとうございます。
0751デフォルトの名無しさん
2011/03/06(日) 20:48:35.71今時非同期処理はThreadじゃなくてconcurrencyユーティリティを使いな
Callableのcallにタスクを書いてExecutorService作ってsubmit
Futureオブジェクトが返るから、それをgetする時にcallで呼んだ例外が解る。
Swing GUI使うならSwingWorkerで、タスクをdoInBackgroundに実装する方が楽
0752デフォルトの名無しさん
2011/03/06(日) 20:53:28.58newをしなくていいクラスと
newをしなくてはいけないクラスの違いって何?
0753デフォルトの名無しさん
2011/03/06(日) 21:45:49.26なるほど。。ありがとう
調べてみます。
0754デフォルトの名無しさん
2011/03/06(日) 21:59:25.46なにか原因に心あたりはありませんでしょうか。
たとえば
<c:forEach var="i" begin="1" end="3">
<p>i=${i}<p>
</c:forEach>
と書いた場合、実行結果が
<p>i=${i}<p> <p>i=${i}<p> <p>i=${i}<p>
となります。期待するのは
<p>i=1<p> <p>i=2<p> <p>i=3<p>
となります。ループはしているので、<c:forEach>は動いているのですが、${var}がうまく展開されません。
■ このスレッドは過去ログ倉庫に格納されています