1 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 15:21:29 ] 過去ログ、関連スレッド、よくある質問とその回答、 質問をする前に、貴方が見なければならないサイトについての情報は、 下のwikiのページにまとめてあります。 www.wikiroom.com/java/ これからJavaでプログラミングを始めたいが、何をすればいいかわからない人も、 wikiからのリンクをおたどりください。 よくある質問 ・「コマンドまたはファイル名が違います」 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 「Exception in thread "main" java.lang.NoClassDefFoundError: 」 www.wikiroom.com/java/?path,classpath ・String に == は使うな。equals() を使え。 ・「\12288 は不正な文字です。」 文字リテラル以外で全角スペースは使えません。半角スペースに。 ・その他の質問→「APIのjavadoc見ろ」 前スレッド 【初心者】Java質問・相談スレッド101【大歓迎】 pc11.2ch.net/test/read.cgi/tech/1177938653/ /* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。 質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */ また、当スレで質問をするかたは、回答をもらえたときに、 wikiの更新をして頂ければ、忝なく存じます。 JavaScript, Ajaxの質問は、ここでは受け付けていません。 Web製作板をご利用ください。pc10.2ch.net/hp/ 次スレは>>980 あたりで。
331 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 20:44:45 ] System.out.print(Integer.toHexString(b[i] & 0x0FF)); を System.out.printf("%02X", b[i]); でだめ?
332 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 21:04:34 ] >>331 327じゃないけど sprintfみたいな機能ならあるとうれしい
333 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 21:18:48 ] >>328 =329 Integer.toHexString(b[i] | 0xffffff00).substring(6) とか。
334 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 21:23:06 ] せっかくPrintStreamにprintfが付いたのに PrintStreamがOutputStreamだからStringに持って来れん これだからJavaは使えん糞だと言われるんだよなぁ
335 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 21:38:25 ] >>334 String.formatメソッドとかFormatterクラスをよく調べてみたことある?
336 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 21:51:55 ] PipedOutputStream po = new PipedOutputStream(); PipedInputStream pi = new PipedInputStream(po); PrintStream ps = new PrintStream(po); for(int i = 0; i < b.length; i++) ps.printf("%02X", b[i]); byte[] bo = new byte[100]; int len = pi.read(bo, 0, 99); String s = new String(bo, 0, len); System.out.println(s);
337 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 21:55:55 ] すみません。HelloWorldのクラス化でいきなりもうダメぽです。 ↓のようなプログラムを書いたのですが、printlnの("の部分がコンパイル通りません。 なんかIDがありませんと言われてしまいます。何故でしょうか?意味が・・・ public class UserInput { System.out.println("Hello World"); } public class MyJavaTest { public static void main(String args[]) { UserInput(); } }
338 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 22:00:36 ] >>336 byte[100] ってなんだよw PipedOutputStream po = new PipedOutputStream(); PipedInputStream pi = new PipedInputStream(po); PrintStream ps = new PrintStream(po); for(int i = 0; i < b.length; i++) ps.printf("%02X", b[i]); ps.printf("\n"); BufferedReader br = new BufferedReader(new InputStreamReader(pi)); System.out.println(br.readLine());
339 名前:327 [2007/06/09(土) 22:05:07 ] >>335 できました! String s = ""; for(int i = 0; i < b.length; i++) s += String.format("%02X", b[i]); System.out.println(s); 激しくありがとうございました!!!
340 名前:デフォルトの名無しさん [2007/06/09(土) 22:12:24 ] なんだか予想以上にメモリを食うのですが、 staticで作った変数はインスタンスを生成するごとに、 メモリ食うってことはないですよね? インスタンスへのポインタ?みたいなものは、 何バイトくらいメモリ食うのでしょうか?
341 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 22:21:40 ] 環境依存では
342 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 23:03:43 ] >>340 オブジェクトヘッダはVM依存だね。
343 名前:313 mailto:sage [2007/06/09(土) 23:09:51 ] >>325 レスありがとうございます。 色々やってたら無事コンパイルできました。 1行目も本に載ってたimport mybeans;のままでできました。 クラスパスなども修正したので、結局何が原因だったのかよく分かりませんが、 やはりサーブレットをコンパイルする場所(ディレクトリ)が問題だったようです。 因みに本は高橋麻奈さんのやさしいJava活用編第2版で、 問題の箇所はレッスン7のサンプル6でした。 お陰さまで助かりましたありがとうございました。 お騒がせして申し訳ありませんでした。 失礼しましたm(_ _)m
344 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 23:44:57 ] >>337 プログラム勉強するの辞めたほうがいいと思う。 どういう本で勉強しているのか、どういう授業を受けているのかは知らないけど、人の話も聞いていないし理解しようともしてないでしょw 何故か? クラスに定義できるのは、メソッドと変数だけだから。 で、命令文(ステートメント)はメソッド(コンストラクタを含む)にしか記述できない。
345 名前:312 [2007/06/09(土) 23:52:59 ] JAVAからwindowsのバッチファイルを引数を渡して起動の質問をした者です。 ProcessBuilderから引数を渡してバッチを起動するところは成功しました。 (環境変数のPATHに起動したいバッチのパスを入れた) しかし、バッチファイルの途中で処理が止まって、エラーも出ずに処理が止まってしまいます。 具体的に、バッチファイルの中でLhacaを使ってファイルを解凍をしている作業があるのですが、そこで止まってしまうようです。(getInputStream()で確認) Lhacaも環境変数に入ってますし、コマンドラインから単体で実行した時は問題なく動くのですが・・・。 偉い方、ご教授願いますm(_ _)m
346 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 23:53:52 ] >>337 クラスじゃなくてクラスのなかにあるメソッドを呼ばないとダメ public class UserInput { public void sayHello(){ System.out.println("Hello World"); } public void sayAny( String text ){ System.out.println( text ); } } public class MyJavaTest { public static void main(String args[]) { UserInput userInput = new UserInput(); userInput.sayHello(); userInput.sayAny( "aaa" ); userInput.sayAny( "zzz" ); } }
347 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 23:57:19 ] >>346 教育している側から言えば、出題の意図はコンストラクタに記述、だと思う。 クラスの理解は、コンストラクタ⇒変数⇒メソッドかな。 メソッドの引数(特に参照型)は最初は教えちゃダメダメ
348 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 00:03:58 ] >>347 ごめん。>>344 と>>337 だけ読んでレスした。 もっと前からやりとりがあったんかな? 少し上のほう読んでみたけど確認できなかった。
349 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 00:08:56 ] >>348 いや、単発だから回答としては問題ないと思うよ。 ただ、そう書いても>>337 は理解できないと思うが・・・ ここは質問・相談スレであって丸投げじゃないからと、言い過ぎた。 すみません。
350 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 00:09:28 ] >>345 Lhacaを入れていないから分からないけど、Lhacaが何か入力を求める場面とかない? もしくは解凍ファイルを正しく出せる等、Lhacaの出力先は確保されてる? どういうところで実行が止まっているのか状況が分からないから何とも言い様が無い。 > コマンドラインから単体で実行した時 っていうのは、Lhacaを単体で実行?バッチファイルを実行?
351 名前:345 mailto:sage [2007/06/10(日) 00:25:31 ] 説明が不足していました。 > コマンドラインから単体で実行した時 これは、Lhacaでの解凍を組み込んだバッチファイルでの実行の事です。 具体的に、以下のようなコマンドを発行しています。 lhaca "C:\Program Files\eclipse\workspace\aaa\bbb\ccc.lzh" バッチファイルの実行では、自分が指定したディレクトリに解凍されたファイルが想定通り出力されます。 よろしくお願いします。
352 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 00:38:06 ] >>345 なんだっけな、昔似たようなことで嵌ったような・・・ バッチファイルを実行させるのは無理とかそんな結論だった気もするけど、ちょっと覚えてないわ。 バッチファイルをCあたりで1個のexeにして解決したと思う。
353 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 00:38:28 ] >>351 止まってしまう、というのは異常終了するということ? フリーズするということ? あと、エラーも出ずに、というけど、標準エラー出力はgetErrorStreamから取らないと。 まあ、標準出力と標準エラー出力のどちらに出すかはプログラム次第なんだけど。 エラーを出す前に固まったら関係ないしね。 プロセスが使用する作業ディレクトリとか環境変数とかは、 ProcessBuilderでstartする前に、ProcessBuilderのメソッドで設定することができるので、 バッチファイル単体で実行した時と同じような環境を整えてやってみて。
354 名前:デフォルトの名無しさん [2007/06/10(日) 01:00:30 ] 本の通りにやったのですがエラーが出てしまいます。 floatをdoubleに変えると問題ないのですが、floatは使えないんでしょうか。 精度が落ちている可能性 検出値: double 期待値: float a = 2.0; エラー 1個 //Exercise.java class Exercise { public static void main(String args[]) { float a; a = 2.0; System.out.println("変数aの値は" + a + "です"); } }
355 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 01:04:22 ] 情報処理技術者試験向けのJAVA言語の必勝勉強方法とかあったら教えてください^^
356 名前:345 mailto:sage [2007/06/10(日) 01:12:03 ] >>352 cでそんなことも出来るんですね! 難しそうですね〜・・・ >>353 getErrorStreamを組み込んでみましたが、何も出ていないようです。 Process p = new ProcessBuilder("wgetdata.bat","2006","06","06","06").start(); InputStream estream = p.getErrorStream(); InputStream stream = p.getInputStream(); while (true) { int d = estream.read(); if (d == -1) { estream.close(); break; } System.out.print((char)d); } while (true) { int c = stream.read(); if (c == -1) { stream.close(); break; } System.out.print((char)c); } これだと何もエクリプスのコンソールには出ませんでした。 getInputStreamを先に取り出すようにすると、バッチの途中までが出力されます。 バッチの途中でフリーズしているようです。 作業ディレクトリ、環境変数の設定はしていないので、明日あたり取り組んでみたいと思います。
357 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 01:29:56 ] >>354 なんて本? Javaでは、「2.0」のように小数点を数値リテラル(定数)として記述した場合、doubleとして扱われるのが仕様。 なので、doubleをfloatに変換していると見なされコンパイラが警告を出す。 型を指定して小数を書く場合、2.0F, 2.0Dと後ろに型を現す識別子を記述すること。 同じように12桁ほどの整数だとintと見なされlongにいれられない。 この場合はLを後ろにつける。 f,d,l など小文字でもOKだが、lと1が見分けつくにくいので大文字推奨。
358 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 01:36:09 ] >>357 thx 世界でいちばん簡単なJava
359 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 01:37:27 ] >>357 おおお2.0Fとしたらいけた ありがたや〜
360 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 01:40:32 ] >>358 その本、地雷の中の地雷。 やさしいJavaが良書に思えるほど。
361 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 01:42:45 ] >>360 そうなのか・・・ わざわざ買いなおしたのに・・・
362 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 01:44:16 ] >>354 a=2.0f; っていうかその本は捨てたほうがいいかも。 ずっと前にも2chスレに同じような質問があった気がする。 うわー。教えてgoo!とかにもあるなあ。 oshiete1.goo.ne.jp/kotaeru.php3?q=2153924 www.temptech.co.jp/others/java_qa/2020.html その本ってもしかして 世界でいちばん簡単なJava の e 本Java の基本と考え方がわかる本 2003年6月1日 第1版第1刷発行 著者 堀江幸生 発行 株式会社秀和システム (ISBN4-7980-0533-9 C3055) www.amazon.co.jp/dp/4798005339/ じゃねえか? pc8.2ch.net/test/read.cgi/tech/1161492130/964-981 改訂されてないみたいだね。
363 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 01:46:35 ] >>362 あああゴミなのかこの本 昨日からやる気出して取り組んでるのにヽ(`Д´)ノ 研究室の金だからいいけどさ・・・
364 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 01:54:41 ] >>362 てかgooではない方のQ&Aも間違ってるじゃねーかw
365 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 01:57:00 ] >>356 lhasaとかtarだと問題なく処理されて正常終了するなあ。 Lhaca自体の問題なのか、実行環境の問題なのかね。 ところで、名前からみてwgetで取ってきたlzhファイルを解凍する処理なのかな? zipならwgetの処理からzipの解凍までjavaの標準APIで書けるけど、 lzhだと書庫操作用のライブラリを探すなり作るなりして、全部javaで書いてしまうとか。 Process p = new ProcessBuilder("moge.bat", "hoge.lzh", "hoge.taz").start(); java.io.Reader in = new java.io.InputStreamReader(p.getInputStream()); while (true) { int c = in.read(); if (c == -1) break; System.out.print((char)c); } in.close(); moge.bat echo %1 %2 "C:\Program Files\Lhasa\Lhasa.exe" %1 tar xfzv %2
366 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 01:58:11 ] >>364 たしかにw なんだかなー
367 名前:デフォルトの名無しさん [2007/06/10(日) 02:08:42 ] JavaのソースコードでSQL文を書く時 Stringにまとめていれるほうがいいのか StringBufferに一行ずつ書いて後でStringにするのがいいのか メモリ上の問題とかも考えて どちらのほうがいいのでしょうか? Stringに入れた場合、SQLに入れる変数が大量にある場合、見づらくなる気もしますが
368 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 02:19:47 ] >>340 Instrumentation#getObjectSize
369 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 03:10:16 ] Java6で追加されたjavax.scriptを使いたいんだけど、 第三者によって書かれたスクリプトを安全に実行したいんです。 JavaScriptからでも普通にJavaのAPIにアクセス出来てしまうのですが、 これを禁止する方法はあります?
370 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 07:53:26 ] >>367 動的SQLか静的SQLかにもよるけど。 静的SQLの場合、定数として宣言するのが定石。 この時、書き方としては+で連結して書いて何も問題ない。 コンパイラがコンパイルする時に、最適化して1つの文字列としてくれるから。 読みやすさを重視して、1行ずつ改行してインデントきって+連結。 静的SQLの場合、やはり定数として宣言して?を使ったPreparedStatementで使用するのが良い。 もっと複雑なSQLを構築したい場合は、動的にSQLを作成するけど、そういう場合はStringBufferを使用するほうが好ましい。 ただ、どちらにせよコードに定数としてSQLを書くよりも、SQLは外部のテキストファイルか何かで管理する方がベスト。 複雑なSQLを動的に作成する必要がある場合、本当に必要かを検討し、静的SQLの組み合わせで処理できないかを考えるべし。 この辺りは3層構造とかの記事でも読んで。
371 名前:356 mailto:sage [2007/06/10(日) 08:11:18 ] >>365 書庫操作ライブラリの自作ですか! たくさん勉強が必要そうですね。 まさにwgetでデータを取ってきて解凍する処理です。 lhasaとかtarなら正常終了したのですね? 次に試してみます!ありがとうございます。
372 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 08:22:54 ] >>369 「第三者によって書かれたスクリプト」が安全なわけないだろ
373 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 09:33:31 ] >>369 空の javax.script.SimpleBindings とかでグローバルスコープ上書きすれば アクセスできないようにならん? とか思ったけど、Rhinoには通じないみたい。 で、ちょっと方向変えて ScriptEngine engine = new ScriptEngineManager().getEngineByName("rhino"); Bindings b = engine.getBindings(ScriptContext.GLOBAL_SCOPE); b.put("java", new Object()); みたいにするとパッケージの根元から潰したり、同じ事やれば、 デフォルトで Object とか System とか Thread とか潰したりはできそう。 どのクラスを使って良くて、どのクラス使っちゃダメってのを個別に制御しようとすると面倒臭そうだけど
374 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 10:36:39 ] >>371 漏れも調子に乗って既存のlzh系処理ソフトにラッピングする形で 自前の書庫管理してたんだけど途中で書庫サイズが2GB超えて ぼろぼろになって原因がそっちにあるのが分かってやる気なくした 自分でライブラリ作った方が安心出来るよ
375 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 11:51:23 ] >>372 今ご覧になってるWebブラウザは第三者が書いたJavaScriptを安全に実行しているわけで。 >>373 全部のパッケージ潰せて、わずかな安全な自前の関数だけScriptEngine#put()できればとりあえず使いものになります。 java、javax、com、orgあたりを潰せばjava seのapiすべて潰したことになるのかな?潰し忘れがあったらかなりデンジャラス。 あちこちドキュメント漁ってるんだけど、なんでこんな大事なことどこにも書いてないんだろう。 でもとりあえずありがとう
376 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 12:55:05 ] >>375 どうしてJavaScriptでローカルのディスクに書き込めないのはなぜ?
377 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 13:13:52 ] >>375 アプレットでも使われているけど第三者のクラスファイルを安全に実行する 既存のモデルを使う。Javaのセキュリティモデルを勉強すること。 あとjava.sun.comにドキュメントあるよ。JavaSEのドキュメントのページからリンク はられてる。
378 名前:デフォルトの名無しさん [2007/06/10(日) 13:35:55 ] すいません。 誰か教えてください。 DoJa-3.5用(900用)のエミュレータを使ってHelloWorldを出すという、初歩の初歩でつまずいてるのですが、ビルドを実行すると javac:ターゲットリリース1.1がデフォルトのソースリリース1.5と競合しています。 とでて、ビルドが失敗してしまいます。 どうすればよいのでしょうか? Javaスレの神様どうかお教えください。お願いします。
379 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 13:41:09 ] >>378 こっち pc11.2ch.net/test/read.cgi/tech/1174036396/
380 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 13:42:32 ] と思ったら既にマルチしてたのね もう回答は期待出来ないな じゃ
381 名前:デフォルトの名無しさん [2007/06/10(日) 14:12:23 ] すいません。 マルチはダメなんですね。ごめんなさい。 sun.tools.javac.Mainを使用するをチェックしていないのが原因でした。 回答が期待できないといわれたので、別の方法で考えました。 自分で考えたほうが身につきますね。ありがとうございました。
382 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 14:39:17 ] 昨日Image関連で質問した物です。回答ありがとうございました。 回答いただいた内容で解決できたのですが、新たな疑問点が。 Imageをクラス間でやりとりすることは不可能なのでしょうか。 メンバにImageを持たせ、paintにて描画した後、 他クラスからそのImageを取得しようとしたところ、 Paintメソッド内では存在してましたが他クラスから呼び出した時点でnullになっていました。 3DのCUBEを乱数に寄り平行移動させた物を複数生成し、 1クラスにつき一つのCUBEをImageに描画させ、 のちに統合したImageをCanvasに描画するという手順を取っているのですが、 Imageのやりとりが出来ないとなるとこの手法が使えません。 ご教授宜しくお願いいたします。
383 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 14:43:12 ] static
384 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 15:17:31 ] Java2ME環境で質問です。 ネットワーク上のNetBIOS名を列挙したい場合はTCP/UDPから上の部分をすべて自前で実装する以外ありませんか? JCIFSというライブラリはありますが、LGPLなので手が出しづらいです。 スレ違いになりますがjarからclassファイルを取り出して使用した場合はソースを公開する必要があるのかないのか 分かる方はこちらも教えていただけると幸いです。
385 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 15:28:03 ] >>371 lhasaはいいとして、lzhを扱えるtarはないと思うので念のため。 サンプルでtarが展開しているのはtar-ballをgzipで固めたtazファイル。 ProcessBuilderで呼び出したバッチファイルで、 ファイルを生成するプログラムがうまく動作しないとかだといやだなあと思って確認しただけなので。 Lhaca自体の問題というより実行環境の問題の気がしなくもない。 eclipseから起動しているのが原因とかかも。 バッチを呼び出しているjavaプログラムを直接コマンドラインからjavaコマンドで叩いた場合はどうなる?
386 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 15:45:00 ] >>384 そのjarのライセンスに従ってください
387 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 16:32:42 ] >>377 JDKドキュメントのセキュリティの項は目を通してみているけど、さっぱりわからない。ムズ過ぎ…… >>現在、SDK の一部として提供されているコードはすべてシステムコードと見なされて、固有のシステムドメインの中で実行されます。 >>システムコードには、自動的にすべてのアクセス権が与えられます。 とか書かれてるけど、javax.scriptはシステムコードですべてのアクセス権が与えられてて制限は出来ないってこと?
388 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 16:52:35 ] public class a{ public static void b(int foo){ System.out.println("Int"); } public static void b(byte foo){ System.out.println("byte"); } public static void main(String args[]){ b(26); } } mainでbyteを入れているのに、何故intが呼ばれるのですか?
389 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 17:07:51 ] >>388 何故26がbyteなのですか?
390 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 17:10:45 ] >>388 127以下の数だからってbyteとして扱われるわけじゃない。 Lつけなきゃ整数リテラルはすべてint。言語仕様の3.10.1参照。
391 名前:デフォルトの名無しさん [2007/06/10(日) 19:13:20 ] データベースの中身を拾ってきて それをCSV形式でファイルに書き出してデスクトップに落としたい場合 メモリ上にファイルを作成→一行ずWriteで書き出す→拡張子をCSVにしてデスクトップに保存する こういうクラスを作ってやっているのですが だいたい皆さんもこういうやり方でやっているのでしょうか? もっと簡単な方法とかあるのでしょうか?
392 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:19:21 ] ActiveDirectory認証を利用するAPIはありますか?
393 名前:デフォルトの名無しさん [2007/06/10(日) 19:42:06 ] 会社でJavaの引き継ぎをまかせられてしまった初心者です(35歳)。プログラミング経験はほとんど皆無(商用経験は0、社内研究でperlを少しかじった程度)。 以下のプログラムが存在した場合、「this」はどこを示すのか悩んでいます。 class TestClassB extends TestClassA{ public String doExcute(){ 処理ロジック }; } class TestClassA{ public abstruct String doExcute(); public ActionForward excute(){ String result = null; result = this.doExcute(); } } ログを読む限り、TestClassBをインスタンス化して、excute()をcallしているのですが、 TestClassB内には存在しないため、スーパークラスのexcute()をcallしていると読めます。 その後、excute()の中で、「result = this.doExcute();」という記述があるのですが、これは どのような動きをしているのでしょうか。 その後の動きを見ると、TestClassBのdoExcuteを実行しているようなのですが、 具体的な動きがわらないため質問させていただきます。 @この場合、TestClassAの中でthisと宣言されているが、TestClassBがTestClassAを 継承しているので、thisはインスタンス化されたTestClassBを示す。それなのでTestClassBのdoExcuteが実行される。 ATestClassAの中でthisと宣言されているため、明示的にインスタンス化されてはいないが thisはTestClassAを示すため、自動的にインスタンス化される等して、TestClassA内の doExcuteを実行しようとする。しかし、TestClassA内にはabstructでしかdoExcuteが宣言 されていないので、自動的に実装しているものを探してTestClassBのdoExcuteを実行した。 感覚的には@な気がするのですが、thisはその記載されたクラス自身を示すような気がして 下のような考えと悩んでいます。すいませんが教えてください。
394 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:57:27 ] TestClassA tca = new TestClassA(); TestClassB tcb = new TestClassB(); ActionForward afa = tca.execute(); ・・・(1) ActionForward afb = tcb.execute(); ・・・(2) (1) のとき this は tca (2) のとき this は tcb
395 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:01:21 ] >>393 class TestClassB extends TestClassA{ public String doExcute(){ 処理ロジック }; public String doExcute2(){ふが}; } class TestClassA{ public abstruct String doExcute(); public String doExcute2(){ほげ}; public ActionForward excute(){ String result = null; this.doExecute2(); result = this.doExcute(); } } これを実行して比べてみたら?
396 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:01:33 ] >>391 それで何か問題あるの? >>392 Windows固有の機能だからJavaにはなさそうだ。 >>393 もちろん@が正解。ただそのコードじゃコンパイル通らないはずだよ。TestClassAはきっとabstractなクラスだ。
397 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:05:35 ] >>391 少しだけOO的に書くのであれば、DBから取得してきたデータをBeanクラスに詰め、Writerで1行ずつ書き出すとベター DBから取得してきたデータをいきなりCSVの1行にするくらいならば、データ量にもよるけど、SQLで組んじゃう方が楽じゃね?
398 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:34:28 ] >>387 セキュリティマネージャ差し換えるんだよ。 >>392 ActiveDirectoryというかLDAPなら。
399 名前:デフォルトの名無しさん [2007/06/10(日) 20:38:21 ] >>396 問題はないけど ちょいとアナログなやり方なので 他に方法があるのなら参考にしたかった
400 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 21:04:14 ] >>393 常にTestClassBを示す
401 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 21:17:10 ] >>399 == >>391 それを言うなら アナログ じゃなくて アナクロ
402 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 21:48:39 ] 超初心者失礼します enumを使おうと思って調べたんですが、よくわかりません とりあえずJ2SE5.0なので言語レベルで実装されてるとは思うのですが enum hoge{ oerjao, idos; }; てな感じじゃだめなんでしょうか、Eclipseだと無理っぽいんですが…
403 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 22:03:54 ] >>402 普通に使えるはず。 使えないなら以下をチェック ・eclipseのバージョン ・プロジェクトのプロパティ -> Javaコンパイラ -> Javaのビルドパス -> ライブラリ
404 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 22:29:46 ] >>398 System#setSecurityManager()でセキュリティを設定するとスクリプトは安全だけど、 アプリケーション全体に制限が加わってしまってそれ以外のファイルアクセスなんかが 出来なくなっちゃうよね?やっぱりわからん…
405 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 22:36:18 ] >>403 よくわからんのですが、コンパイラの準拠レベルとやらを5.0に上げたら通るようになりました ありがとうございました
406 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 00:12:16 ] >>398 その手のスクリプトってパッケージとか持ってないと思うし、 コードベースで動作制限もできないようなきがするから、 SecurityManager でやるにしても、あんまし便利には出来んと思うけど。
407 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 01:11:43 ] >>375 とかセキュリティマネージャとか言ってる奴は馬鹿だろ。 言語レベルのセキュリティとスクリプトエンジンの実装のセキュリティは別問題。 組み込みエンジンのセキュリティ確保は組み込む人間が全部自分で必要なものを1から実装する。 これは>>375 の仕事。 何を何処までどうするか、それをどうやって実現するか全て自分でやる。用意されてるものを使うんじゃなくて自分で用意する。 具体例でいえば"ブラウザは外部の入力は汚染されたものと仮定してセキュリティ制限下で処理してる" ""でくくった部分を>>375 が全部やる部分。 実装例だせば、ecma-262ではトップレベルコンテキストは常に一つで一切操作出来ないのが仕様だが、 ブラウザでそれやると文書間でトップレベルコンテキストが共有されてしまうから動作変更して文書毎にトップレベル生成してる。 javaの実装であるrhinoはセキュアであることは実装対象外だから一切配慮されてなくて、 セキュアな実行環境がほしい場合は組み込む者が適切に実装しろとrhinoのドキュメントにご丁寧に書いてある。 これだけ言ってわからんならノウハウ本か他のソース読め。
408 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 02:09:41 ] バカ避けのために作られた言語なのに どうしてバカばっかり集まってくるのはなぜ?
409 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 03:06:49 ] それはおまいが一番よく知ってるんだぜ?
410 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 09:25:56 ] >>407 sun.org.mozilla.javascript.internal.Context#setClassShutter() で Javaのクラスを遮断することができることがわかった。 さすがにRhinoがセキュリティについて一切配慮されてないなんてことはなさそう。 sun.org.mozilla.javascript.internal.SecurityController もセキュリティ関連だからもっと調べてみる
411 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:05:20 ] JDBCドライバを実装するのにオススメのサイトや書籍(できれば日本語) を教えていただけませんか?
412 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:46:39 ] >>411 JDBCドライバを実装するの? JDBCドライバを使用してDBアクセスを試すんじゃなくて。 後者ならば、「JDBCによるJavaデータベースプログラミング」あたり。 やさしいのがいいってならば、どれでもいい気がする。 ドライバの実装は・・・少なくとも初心者質問スレじゃスレ違い
413 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 13:13:02 ] >>412 ドライバの使用じゃなくて実装です。 使用法の情報は多くあるのですが実装についてはあまりみないもので。 スレ違いですか… どこが適切なんだろうか
414 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 13:34:49 ] >>410 そこら辺は最近追加された新しいAPIだよ。 sunのrhinoは元とは別モンの劣化品だからただ実行する以上の用途はmozilaのパッケージ使った方が良いぞ。 ドキュメントもすべて揃ってるから組み込みチュートリアルとかもあるし。 (javadocはサンプルjsコードの一部をコピペしただけ。) 悪いことは言ってないぞ?
415 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 14:29:36 ] >>413 情報無いよな、そもそも必要に迫られるもんじゃないし。 公開されていソースが一番の情報源では? スレは作成したいドライバのDBベンダのスレのがいいかも。
416 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 16:02:29 ] 初歩的で申し訳ないのですが、下のプログラムがコンパイルで通りません。 シンボルを見つけれませんと出るのですが、どういうことなのでしょうか? //Info.java public class Info { public void Info(){ int num[][]; num = new int [10][10]; System.out.print("test\n"); } } //Main.java import java.io.*; public class Main { public static void main(String args[]) { int i, j; Info a = new Info(); for(i=0; i<10; i++) { for(j=0; j<10; j++) { System.out.print(a.num[i][j]); } System.out.println(); } } }
417 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 16:07:28 ] >>416 //Info.java public class Info { public int num[][]; public void Info(){ num = new int [10][10]; System.out.print("test\n"); } }
418 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 16:13:50 ] >>417 ありがとうございます。しかし、コンパイルは通ったのですが、 System.out.print(a.num[i][j]); のところでエラーが出てしまいます。どうしてなのでしょうか?
419 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 16:15:17 ] というよりも、今気付いたのですが、コンストラクタの中の"test"って文字が表示されてないってことは、 まず、コンストラクタの中に入ってないってことですね。それはエラーも出るはず・・・;;
420 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 16:18:29 ] public void Info()はコンストラクタではない。 ただのメソッド。 ヒント:void
421 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 16:24:11 ] もし>>417 のままにしたいなら Info a = new Info(); a.Info(); でnumを初期化
422 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 18:05:00 ] >>420-421 ありがとうございます。voidを除いたら正常に動作しました。 調べてみると、コンストラクタは返り値を持たないので型の宣言は指定したらダメっぽいんですね・・。 勉強になりました。
423 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 19:35:30 ] 一昨日くらいにJAVAを始めたのですが、いまいちクラスとかメソッドとかの良さが分かりません。 まだあまりプログラミング量が少ないからなのかもしれませんが、オブジェクト指向の利点というものを 活かしきれていないような気がします。どうやってもC言語のような感じでプログラムを書いてしまいます。 そこで相談なのですが、何かこういうプログラムを作ってみるといいよって感じのはないでしょうか? こういうプログラム作ったら、クラスの凄さがよくわかるとか・・・。
424 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 19:50:17 ] >>423 システム設計するようになると良くわかるよ
425 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 20:02:01 ] >>424 具体的にはどのようなプログラムを作ればいいのでしょうか? 良く分かるために貪欲に何でも作ろうかと思うのですが。
426 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 20:12:46 ] >>425 俺はTECHSCOREのデザインパターンのページ読んだら結構納得できた
427 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 20:45:57 ] >>425 ステップ数で300くらいの処理を3−4程度のクラスに分割してみる。 自分の経験からだと、CSVの読み書きクラスとかほど良いボリューム
428 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 20:49:30 ] よくわからないので質問させてください。 class Example1{ public static void main(String args[]){ for(int i = 0; i < 10000; i++) System.out.println("teswt"); } } というプログラムをjarにまとめてダブルクリックで実行できるようにしました。 ところがダブルクリックしても出力されません タスクマネージャーでプロセスを見ると一瞬javaw.exeが出るので実行はされていると思うのですが、 コマンドプロンプトが自動で起動されたりはしないのでしょうか? もし自動で起動させる方法があるのなら教えてください。
429 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 21:06:22 ] >>428 それは実行されて、プログラムも終了しただけかと。 CUIならコマンドプロンプトから実行したら?
430 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 21:10:30 ] >>429 やはりコマンドプロンプトから実行するしかありませんか。 実はIRC用のBOTを作っていて友人に配布することになりダブルクリックだけで実行できたほうが便利かなと思ったのです。 がんばってGUIをつけることにします。 質問に答えていただきありがとうございました。
431 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 22:26:29 ] class Example1{ public static void main(String args[]){ for(int i = 0; i < 10000; i++) System.out.println("teswt"); } Thread.sleep( 10000 ); }