5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【初心者】Java質問・相談スレッド86【大歓迎】

1 :デフォルトの名無しさん:2006/06/03(土) 00:00:40
過去ログ、関連スレッド、よくある質問とその回答、
質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
http://www.wikiroom.com/java/

これからJavaでプログラミングを始めたいが、何をすればいいかわからない人も、
wikiからのリンクをおたどりください。

よくある質問
・「コマンドまたはファイル名が違います」
 「'javac' は、内部コマンドまたは外部コマンド、
 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
 「Exception in thread "main" java.lang.NoClassDefFoundError: 」
 http://www.wikiroom.com/java/?path,classpath
・String に == は使うな。equals を使え。

前スレッド
【初心者】Java質問・相談スレッド85【大歓迎】
http://pc8.2ch.net/test/read.cgi/tech/1147315998/

/* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。
質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */
また、当スレで質問をするかたは、回答をもらえたときに、
wikiの更新をして頂ければ、忝なく存じます。

JavaScriptの質問は、ここでは受け付けていません。
Web製作板をご利用ください。http://pc5.2ch.net/hp/

次スレは>>980あたりで。

188 :183:2006/06/07(水) 23:05:30
あ、そうか、パス変えればいいのか、漏れは、、OTL
レスしてくれた人、つまらん質問して悪かったスマン。。。

189 :デフォルトの名無しさん:2006/06/07(水) 23:05:38
>>187
multi;art/form-data

190 :デフォルトの名無しさん:2006/06/07(水) 23:10:18
学校の授業でJavaをかじった程度の学生です。
勉強がてら自分でソフトを作ってみたいんで色々考えてるんですけども難易度がどうも分からずちょっと質問させてください。

考えているソフトは
・クリップボードを監視してURLが入ってきたらブラウザを起動する
というものです。
1行チャットみたいなのがあって文字交じりの間にURLが入ってるんです。
1行丸ごとしかコピーできないのでアドレスバーに貼ってから前後の文字を消してる状態なんです。

ちょっとソフト探してみたんですけど見当たらないんでつくろうかと思ったんですけどどうなんでしょうか?
タスクトレイに常駐とかもさせたいんですけどJavaではまったく作ったことがなくてどれくらい難しいのか・・・

お暇あればレスよろしくお願いします。


191 :デフォルトの名無しさん:2006/06/07(水) 23:15:35
>>190
Javaでは無理。

192 :デフォルトの名無しさん:2006/06/07(水) 23:25:03
>>190
ヒントだけ
1,java.util.Timer
2,java.awt.datatransfer.Clipboard
3,java.lang.Runtime

タスクトレイに常駐はJavaのみではちと難しい。

193 :デフォルトの名無しさん:2006/06/07(水) 23:26:48
クリップボードの内容の取得は可能。
トレイ常駐はMustang(Java SE 6)から可能。

なのだが、肝心のクリップボード監視機能はなさそうだ。

194 :デフォルトの名無しさん:2006/06/07(水) 23:28:25
>>192
pollingか。
あまりエレガントではないが、それなら可能ではあるな。

195 :192:2006/06/07(水) 23:38:30
>>194
ポーリング以外にも処理できる方法があるの?
後学の参考にしたいのでご教示願う。

196 :デフォルトの名無しさん:2006/06/07(水) 23:46:35
>>195

や、クリップボードの内容の変化を通知するイベント&イベントリスナー
がないもんかと探してみてさ、ないな、じゃあできないな、と思いこんじゃ
って、ポーリングという手に気づかなかった漏れの頭が固かったという
ことなのです。

197 :190:2006/06/07(水) 23:46:42
レスありがとうございます。

まず・・・クリップボードの内容取得と監視が何が違うのかすらいまいち分かってませんorz
タスクトレイに常駐せずにクイック起動とかにショートカット作っておいて起動したときにクリップボードの内容を取得。
ということができるということでしょうか?

使い勝手は落ちるかもしれませんが劣化版・・・というのか初めて作るので敷居は低い方がいいかな・・・とか思ってます;


198 :sage:2006/06/08(木) 00:12:23
>>189
情報サンクス

199 :デフォルトの名無しさん:2006/06/08(木) 00:28:33
監視ってのは、クリップボードの内容が変わったことを知るってこと。

変わろうが変わるまいがひたすら1秒おきとかの周期で内容を取得し
てみるのが、ポーリングという概念。前回ゲットした内容と違うもの
が得られたら、新しい内容で目的の処理をすればいい。

対して、監視するってのは、新しい内容がクリップボードに入った
ことだけをなんとかして知り、そのときだけ内容を見に行くって
こと。可能ならば、こうした方がパソコン全体に与える負担は軽く
なると思われる。

クリップボードの中身を取ってくるという行為の負荷が無視できるほど
軽微なら、ポーリングでOK。

Toolkit tk = Toolkit.getDefaultToolkit();
Clipboard cb = tk.getSystemClipboard();
Object data = (String)cb.getData(DataFlavor.stringFalvor);
とかでクリップボードの内容が取れたと思う。

あと、常駐させるだけならタスクトレイにアイコンを出さずに
居座ることもできるので、それならMustangを待たなくてもよいですね。
この場合、Windowsだとシステムモニタとかから終了させることになる。

200 :192:2006/06/08(木) 00:31:23
>>196
レスありがとう。

>>190
できる。
「Clipboard java」で検索してみては。

201 :デフォルトの名無しさん:2006/06/08(木) 00:36:22
>>200

> >>190
> できる。
> 「Clipboard java」で検索してみては。

何でいちいち二回も答えてんの?

202 :デフォルトの名無しさん:2006/06/08(木) 00:36:24
補足しとくと、クリップボードなどの変更を監視したい場合、
処理負荷以外に、ポーリングでは取り落としが発生する可能性があるなど、
制限が出てくる。
監視機能がある場合も仕組みによっては取り落としが無いとは限らないけど、
そういうことが無いように実装されている場合が多い。


203 :190:2006/06/08(木) 01:05:14
皆さんご丁寧にありがとうございます。

色々試行錯誤しながら作ってみようと思います。
行き詰ったときお世話になるかもしれませんがよろしくお願いいたします;

>>201
難しい、と答えてもらってできる。と答えてもらってるんで質問者としてはちょっとやるきが出てありがたいっす。

204 :デフォルトの名無しさん:2006/06/08(木) 01:06:42
質問です。
アプレットで、Jテーブルにデータベースの内容を表示したのですが、
テーブルに表示した内容をマウスでクリックする事で、
クリックした行のデータベース内容を取得したいのですが、
この場合、クリックでの内容取得はどうすれば良いでしょうか?

MouseListenerを使って足掻いているんですが、
テーブルその物のデータとか、座標とか、違うものばかり取得してしまい、
目的のデータを取ってくる事が出来ず、詰まっています。

何かヒントだけでも頂けると助かります。

205 :デフォルトの名無しさん:2006/06/08(木) 01:08:53
>>204
クリックされた行のデータをキーにして検索すれよ

206 :デフォルトの名無しさん:2006/06/08(木) 01:17:31
>>187
ファイルアップロードとか

207 :デフォルトの名無しさん:2006/06/08(木) 01:44:56
>>205
早速のレスありがとうございます。説明不足でした。
クリックされた行のデータを取得する時点で詰まっています。
getValueAt() やgetRowCount() を使おうにも、書式が変なのか動作せず、
他の方法も思いつかないのが現状です。

208 :デフォルトの名無しさん:2006/06/08(木) 01:49:51
あっそう、としか答えようが無いわけだが

209 :デフォルトの名無しさん:2006/06/08(木) 01:54:11
columnAtPointとrowAtPointで座標を行、列に変換してからgetValueAtで要素をとれ

205=208か?的外れな回答はスレの質をさげる

210 :デフォルトの名無しさん:2006/06/08(木) 01:57:37
何かスレの質とか語り始めたぞw

211 :デフォルトの名無しさん:2006/06/08(木) 02:05:47
配列の質の次はスレの質かw

212 :204:2006/06/08(木) 02:23:35
>>209
ありがとうございます。その書式は試していませんでした。
Eclipseで赤線エラー吐いてますが、apiのJTable欄に色々書いてあるので、
columnAtPointとrowAtPointを無事読み込むよう、色々試行錯誤してみます。


213 :デフォルトの名無しさん:2006/06/08(木) 02:58:19
サニタイジングについて質問です。
以下のように一文字ずつ置換する方法しか思いつかないのですが
スマートに高速に置換する方法ってありますでしょうか?

pattern = Pattern.compile("<");
matcher = pattern.matcher(sHTML);
sHTML = matcher.replaceAll("<"));
pattern = Pattern.compile(">");
matcher = pattern.matcher(sHTML);
sHTML = matcher.replaceAll(">"));

214 :デフォルトの名無しさん:2006/06/08(木) 03:00:57
213のソース3行目は&lt;、6行目は&gt;です。
変換されてブラウザに表示されてしまいました><

215 :デフォルトの名無しさん:2006/06/08(木) 03:03:03
StringBuffer buffer = new StringBuffer();
for(int i=0; i<sHTML.length(); i++){
  char ch = sHTML.charAt(i);
  switch(ch){
  case '<':  buffer.append("<"); break;
  case '>':  buffer.append(">"); break;
  default:   buffer.append(ch); break;
  }
}
sHTML = buffer.toString();

216 :デフォルトの名無しさん:2006/06/08(木) 03:09:32
検査対象と置き換え先の文字を
それぞれ配列に登録しておく方法はどうかな。

217 :デフォルトの名無しさん:2006/06/08(木) 06:04:06
>>213
正規表現とreplaceAll()を使うとエラい遅いぞ。

218 :199:2006/06/08(木) 13:29:38
ちとBugParadeをみてみたら、クリップボードの内容変更通知が
RFE(機能拡張の要望)としてあがっており、解決済みになっていた。
java.awt.datatransfer.FlavorEvent/Listenerを使えと言うことら
しい。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4259272
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/datatransfer/FlavorListener.html#flavorsChanged(java.awt.datatransfer.FlavorEvent)

219 :デフォルトの名無しさん:2006/06/08(木) 14:37:28
java.uti.Collections#sort()
って、意外と高速?

QuickSort系の処理を作って、2万行のテキストデータをソートさせてみたのだが、
自前(というか、サンプルを改造)のQuickSortより、Collections#sortのほうが高速だった。

o....rz

220 :デフォルトの名無しさん:2006/06/08(木) 15:51:15
>>219
サンプルデータ次第かもよ。
クイックソートの場合、使用する境界値が中央値より離れるほど
効率が下がるから。

Collections#sort()はマージソートなので、またアルゴリズムが違う。
詳しくはソートのアルゴリズムについて調べてくれ。

221 :219:2006/06/08(木) 16:51:37
>>220
お、マージソートですか。ありがとう。

ソートしたデータは、>>122の郵便番号データ。
ソートキーは、郵便番号データ中の大口事業所等の所在地の
JISコード(5バイト)ってやつをString→intに変換したもの。

環境は、PenM1.4GHz、RAM1GB、Java5.0で、
Collections#sort = 890ms〜900ms
自前QuickSort = 2060ms〜2100ms

アルゴリズムが違うとはいえ、2倍以上も遅いです。。。
自作したcompareToメソッドがタコいのかも。
つか、オレがその>>122。吊ってくる・・・

ちなみに、アルゴリズムの参考にしたサンプルコードがあるページはここ。
ttp://www.cs.ubc.ca/~harrison/Java/sorting-demo.html
Fast Quick Sortってやつを改造して、作りかけのCSVパーサに組み込んでみますた。
けっこー勉強になりましたよ。

とりあえず、郵便番号データを全部パースしてオブジェクト化したあと、
再度オリジナルと1バイト違わぬ全く同じCSVデータ化してファイルにはき出せるとこまで確認出来た。
なんとなくうまく動いてるモヨンヌ。

222 :デフォルトの名無しさん:2006/06/08(木) 17:49:31
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
ハローワールドをjavac HelloWorld.javaでコンパイルしてjava HelloWorldで実行すると
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
が出るのですが何故でしょうか・・・急に色々なプログラムがこのエラーをはくようになりました

223 :デフォルトの名無しさん:2006/06/08(木) 17:59:58
>>222
>>1

224 :222:2006/06/08(木) 18:22:39
>>223
ゴミン><

225 :デフォルトの名無しさん:2006/06/08(木) 18:37:02
くそぉ・・・
俺もなぜか>>222と同じ所でひっかかっちゃってる_| ̄|○
大文字小文字の間違いなんてしてないし、拡張子なんて入れてないし・・・
何度も見直したけど原因がわからない・・・なぜだ・・・

226 :デフォルトの名無しさん:2006/06/08(木) 18:38:48
>>225
>>1

227 :デフォルトの名無しさん:2006/06/08(木) 18:43:04
>>226
何度も見てるんだよ・・・wikiをさ・・・
でも実行できないのは何故だろうか・・・

228 :デフォルトの名無しさん:2006/06/08(木) 18:44:07
ごめん、俺が悪かった_| ̄|○
原因見つけた・・・

229 :デフォルトの名無しさん:2006/06/08(木) 19:34:52
だから俺はあの時「実のおかんと関係持ったらおしまいやで?」と説得してやったのに

230 :デフォルトの名無しさん:2006/06/08(木) 22:31:47
>>221
元データがものの見事にほぼソートされているデータっぽい?
クイックソートにとって最悪のデータ

231 :221:2006/06/08(木) 23:08:36
>>230
う、まさにドンぴしゃでソート済みデータだったかも。。。
とりあえず、他のデータでも試してみます。


232 :デフォルトの名無しさん:2006/06/09(金) 00:36:52
すいません、質問させて下さい。
現在、Javaを用いて天気予報を表示するようなツールを作ろうと思っているのですが、
天気予報の情報は、どこからどのようにして得られる事が出来るのでしょうか?


233 :デフォルトの名無しさん:2006/06/09(金) 00:47:14
>>232
http://neta.ywcafe.net/000339.html

234 :デフォルトの名無しさん:2006/06/09(金) 00:59:35
質問させてください。

ボタン
テキストフィールド
ラベル
(パネル)

これらのコンポーネントだけを並べて表示する場合、きれいに思い描いたとおりに並べたいので
レイアウトをnullにしてsetBound()で一つ一つ並べようと思ったのですが、
画面のサイズ変化に対応できるようにするにはどうすれば良いでしょうか?
画面を広げるとコンポーネント間の距離も広がったり。

235 :デフォルトの名無しさん:2006/06/09(金) 01:05:05
>>234
netbeansを使ったら?

236 :234:2006/06/09(金) 01:11:15
>>235
ありがとうございます。
何のことかわからなかったので検索してみると、開発ツールって出てきました。
僕はいつもメモ帳で書いてるので、こういうのは使ったことが無くてわからないんですが
それを使うとできるようになるんですか?

237 :デフォルトの名無しさん:2006/06/09(金) 01:47:38
使えばわかるさ!使い放題だから遠慮することないさ!
気がつけばメモ帳に戻れなくなるぜ!

238 :2年目 ◆jDx9Dmg0GM :2006/06/09(金) 02:11:57
>>192-193
SWT使えば可能だよ。

239 :234:2006/06/09(金) 02:29:22
>>237
ありがとうございます。やってみます

240 :デフォルトの名無しさん:2006/06/09(金) 12:59:56
Java プログラムで RFC 2822 準拠のメッセージを作成したり、
または *.eml ファイル (というか MH 形式)のファイルを
読み書きしたいのですが、どのようなライブラリを使うのが
Java 世界ではデフォですか?
http://java.sun.com/products/javamail/index.jsp
JavaMail ですか?

241 :デフォルトの名無しさん:2006/06/09(金) 13:18:17
>>240
eml JavaMailでぐぐると出てくる1つ目がそんな感じの事してるな

242 :デフォルトの名無しさん:2006/06/09(金) 13:30:42
サーバ・クライアント間でバイト列の連続送受信をやりたいのですが,
受信するときに
BufferedInputStream in = new ...(socket.getInputStream);
while(in.read(byteSeq) != -1) // byteSeqはbyte[]型
;
と書いているのですが, write側がソケットをクローズしない限り
read(byteSeq)が-1になりません.
byteSeqのサイズが不明な場合どのように書けばよいでしょうか?
どなたかよろしくお願いします.

243 :デフォルトの名無しさん:2006/06/09(金) 14:17:47
>>242
APIリファレンスくらい嫁

・ソケットにバッファされたバイトがなく、close を使用してソケットが閉じられていない場合、available は 0 を返す


244 :デフォルトの名無しさん:2006/06/09(金) 15:10:54
>>243
バッファにデータが残っているかどうかではなく, write()が終端したらループを抜けたいんですが, そもそもwrite()自体は終端しないのでしょうか?
read()が-1を返す条件が今の所ソケットクローズ以外に見つかりません

245 :デフォルトの名無しさん:2006/06/09(金) 15:24:32
>>244
ところてんって知ってる?
あれがイメージできればavailableの意味が解ると思うんだが

246 :デフォルトの名無しさん:2006/06/09(金) 19:26:05
Write側が書き終えたかどうかなんて、
Read側でどうやって知るんだよ。
最初にサイズを送るとか何らかの約束がないと無理だろ。


247 :デフォルトの名無しさん:2006/06/09(金) 19:42:12
文字列なら0終端という技が可能。
文字列ベースならざくざく読み込んでけばいい
(buffサイズ超えたらコネクション切るとか居るけどね)

バイナリなら俗にいうContent-Lenghtを事前に送る必要がある
これは「事前にサイズを知っている」という条件を満たすためのものだから
例えばはなから8バイトずつとか分かっているなら必要ない

Content-Lengthを必要とせずにバイナリを送る裏技(力技)もあるけど
これは一般的なやり方だとだいたいサイズが4/3倍になる

248 :デフォルトの名無しさん:2006/06/09(金) 20:02:55
>>243 245 246 247
やっぱりそうでしたか。write()が裏でサイズ送るか終端してくれれば
うれしいなと思ったんですが。available()は勉強しときます。
ありがとうございました。

249 :デフォルトの名無しさん:2006/06/10(土) 00:11:01
243=245か?availableは終端判定にはまったく使えないぞ。

250 :デフォルトの名無しさん:2006/06/10(土) 00:24:58
初心者質問失礼いたします。

int型をString型に代入する方法ってありますか?

int a = 1234;
を、
String str に代入したいのです。
String型をint型に…だったら Integer.parseInt(str); とすればいいんでしょうけど、
逆だとどうすればいいのかわかりません。
買ってみた入門書にも書いてなかったので、よろしくお願いします。

251 :デフォルトの名無しさん:2006/06/10(土) 00:27:00
何故Javaにはデストラクタがないのですか?

252 :199:2006/06/10(土) 00:28:38
代入するのは無理。
つーか Integer.parseInt(str)も、Stringをintに代入しているわけじゃないぞ。

intの値の文字列表現を作ることは出来る。
String str = String.valueOf(a);
とすると、int型のaの値の10進表現文字列を作ってくれる。

253 :デフォルトの名無しさん:2006/06/10(土) 00:30:56
>>252
ありがとうございます!早速チャレンジしてみます!
Integer.parseInt(str);は代入じゃなかったんですね……!!!!

254 :デフォルトの名無しさん:2006/06/10(土) 00:41:33
>>248
おいおい勝手にwariteでへんなのおくられたらこまるだろ

255 :デフォルトの名無しさん:2006/06/10(土) 00:44:56
>>253
ジー

256 :デフォルトの名無しさん:2006/06/10(土) 00:45:15
>>249
そういや似たようなので@ITでもIO回りの記事嘘かきまくってたの思い出した
終端判定にready()つかうあほな記事は他のところでも見られるんだよな
なんでへんな書き方が流行ったのだろうか

257 :デフォルトの名無しさん:2006/06/10(土) 00:59:31
test[0,1,2] = 10;
指定した配列に10を入れたいのですが、エラーが出ます。
どこが間違っているのでしょうか・・・?

258 :デフォルトの名無しさん:2006/06/10(土) 01:02:12
>>257
どういうエラーかを言いなさい。
>>1

259 :デフォルトの名無しさん:2006/06/10(土) 01:02:37
for(int i=0; i < 3; i++) {
test[i] = 10;
}
じゃだめなのか

260 :デフォルトの名無しさん:2006/06/10(土) 01:56:45
if文で (a と b)どちらかに当てはまった場合true処理を続ける為のの記号教えてください
&じゃなくて・・・忘れました

261 :デフォルトの名無しさん:2006/06/10(土) 01:58:53
^

262 :デフォルトの名無しさん:2006/06/10(土) 02:03:44
>>260-262
暇だからって荒すな。||

263 :199:2006/06/10(土) 02:56:05
「どちらか一方が当てはまったときのみ。両方が当てはまったら×」なら261のとおり ^
「両方当てはまってもOK」なら ||

264 :199:2006/06/10(土) 03:04:14
両方当てはまってもOKは | でもいい。
||との違いは、左辺が真だった時点で右辺の真偽を問うか否か。

15.22.2 Boolean Logical Operators &, ^, and |
15.24 Conditional-Or Operator ||
JLSのこのへんな。

265 :デフォルトの名無しさん:2006/06/10(土) 03:31:45
>>251
そういう言語仕様だから。
捨てられた(参照されなくなった)メモリはJVMが勝手に
回収する。ゆえに使用済みのオブジェクトにはできるだけ
すみやかにnullを代入すべし。

266 :デフォルトの名無しさん:2006/06/10(土) 06:38:53
package test;

public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World");
}
}

testフォルダに移動して、
上記のようにパッケージ指定してあるソースをコンパイルして、
java HelloWorldと入力して実行しようとしたら、
Exception in thread "main"
java.lang.NoClassDefFoundError: HelloWorld(wrong name:test/HelloWorld)
と出て、実行できません。
入力をjava test.HelloWorld にしてみましたが、だめでした。
NoClassDefFoundErrorが出た時のFAQなど調べても、
回答がありませんでした。
どうしたら実行できるのでしょうか?

267 :デフォルトの名無しさん:2006/06/10(土) 06:43:16
>>266
>>1

268 :デフォルトの名無しさん:2006/06/10(土) 06:47:25
LinuxでJavaやる場合ってテキストエディタはemacsで十分ですか?

269 :デフォルトの名無しさん:2006/06/10(土) 06:53:22
eclipse最強

270 :デフォルトの名無しさん:2006/06/10(土) 07:02:22
>>266
それもFAQだけど一応…
testフォルダの一つ上に出て
実行してみて。

>>268
内様に依る。

271 :デフォルトの名無しさん:2006/06/10(土) 10:05:26
>>265


272 :デフォルトの名無しさん:2006/06/10(土) 10:45:49
>>268
  _  _∩
( ゚∀゚)彡  vim!
 ⊂彡     vim!


273 :デフォルトの名無しさん:2006/06/10(土) 11:32:32
JAVAのフォルダに
「j2re1.4.1_02」と「jre1.5.0_06」があるんですが
「j2re1.4.1_02」は削除しても良いファイルですか?

274 :デフォルトの名無しさん:2006/06/10(土) 11:35:22
javaのフォルダって何?
わざわざ自分で用意しない限りできないだろ?
コンパネのプログラムの追加と削除で消せるよ

275 :デフォルトの名無しさん:2006/06/10(土) 13:23:57
>>274
プログラムファイルのとこにJavaのフォルダがあるんですよ...
無意識に作ったのかもしれません。
では「j2re1.4.1_02」はいらないプログラムってことですよね?

276 :デフォルトの名無しさん:2006/06/10(土) 13:31:37
消す前に以下のことを試してみ
1.コマンドプロンプトを開く(Winキー+Rキーで出てくる窓にcmd)
2.java -versionと入力
3.出てくるバージョンが1.5なら、1.4は遠慮せず消す
4.1.4が出てきたら環境変数JAVA_HOMEを1.5にする

277 :デフォルトの名無しさん:2006/06/10(土) 13:56:21
>>276
1.5とでました。ありがとうございます!


278 :デフォルトの名無しさん:2006/06/10(土) 14:50:18
Javaというよりプログラムを始めて間もないものです。

オブジェクトを引数にとるあるメソッドの呼び出し側のクラスAと
実装側のクラスBがあります。

Aクラス :foo(new Exception());
Bクラス :public void foo(Exception e){}

Bクラスの引数のExceptionをThrowableに変更して
コンパイル→実行をすると何事もなくうまく実行できます。

Bクラス
public void foo(Throwable e){}

しかし、Bを他所で変更し、コンパイルをせずに、
クラスファイルのみコピーしてそのまま実行すると、
NoSuchMethodErrorが発生してしまします。
Exceptionを引数にもったfooメソッドはないということです。

これはなぜなのでしょうか?
コンパイル時のどういった仕組みが影響しているのでしょうか。

いくらクラスの継承関係で上位互換があるとは言え、
ライブラリ側を変更したら、コンパイルをする必要があるということでしょうか。

279 :デフォルトの名無しさん:2006/06/10(土) 15:10:25
言葉よりソース。要点説明する能力がまだ身についてないんだから、先にすべきはそっちでしょ。

280 :デフォルトの名無しさん:2006/06/10(土) 15:30:47
>>278
メソッドは名前だけじゃなくて、
同時に引数型も(実際のVMはさらに戻り値の型も)使って検索してるから。

void foo(Exception) を探してるけど、
void foo(Throwable) しかみつからんのでNoSuchMethodError 食らってるだけ。
コンパイル時には解決できるけど、実行時には解決できない。

dolphin 以降なら バイトコード弄って無理やり invokeDynamic 使えば
NoSuchMethodError 食らわないかも。

281 :278:2006/06/10(土) 16:13:18
>>280
そういうことですか。
どのような変更をしたら、コンパイルが必要になるか?というのは全て洗い出せるのでしょうか?
それとも、どんな変更でもライブラリを変更したら、必ず使う側もコンパイルすべきとするべきでしょうか。

282 :デフォルトの名無しさん:2006/06/10(土) 16:54:39
Javaはインタプリタだがスクリプトではない

283 :190:2006/06/10(土) 19:56:13
前回はありがとうございました。
ちょこちょこ作ってるんですが壁にぶつかっちゃいましてヒント的なものをお願いします。

公開するものじゃなく身内が使うものを作っているのでとりあえず動けばいいと思い暫定的なものを作っています。
クリップボードからStringに読み込むところまではいけました。
文字列からURLだけを取り出す方法がわからずURLの最後に***とつけてもらうようにしてあります・・・

一応あとはブラウザを起動できれば一旦は完成と思うんですがどうすればいいのか一切わかっていません。
けっこうググったつもりなんですがJavaScriptの方がいっぱいでてきて思うように見つかりませんでした。
勉強がてらに作ってるんで糸口だけでも構わないのでお願いします。

あと皆さんは全く分からない場合どうなさってるんでしょうか?

API仕様では量が多すぎて見つけられず逆引きのところを探しても量が少なくてありませんでした。

284 :デフォルトの名無しさん:2006/06/10(土) 20:03:14
>>281
このあたり
http://java.sun.com/docs/books/jls/third_edition/html/binaryComp.html
読むのが面倒なら、全部コンパイル

285 :デフォルトの名無しさん:2006/06/10(土) 20:10:36
URLの抜き出しは正規表現(java.utilにある)を使うことになるだろうな。
厳密にやるとすごく複雑な表現になるので
https?://[-a-zA-Z0-9_.!~;/?:@&=+$,%#]+
くらいでごまかしてもいいかも。

ブラウザの起動は、JDK1.5までなら外部プロセスにまかせるしかない。
ProcessBuilderを使って、Windowsならstartコマンド、MacOSXならopenコマンド
を実行する。Linuxだとmozilla-remote とか firefox-remoteとかいうのがあった
と思う。要は機種ごとに別の処理を書くことになる。
1.6(現在ベータ版)なら、Desktop.getDesktop().browse(URI) が使える。

286 :デフォルトの名無しさん:2006/06/10(土) 20:11:41
java.util → java.util.regex だな。

287 :266:2006/06/10(土) 20:57:43
>>270
実行できました!ありがとうございます。
もっとよく調べないとだめですね。
逝ってきます・・・orz

249 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)