トップページ⇒tech
1001コメント306KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/06/09(火) 19:17:03
プログラミング言語Javaに関する質問スレです。
JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作管理    http://pc11.2ch.net/hp/
Webプログラミング http://pc11.2ch.net/php/
をご利用下さい。

よくある質問
・「コマンドまたはファイル名が違います」
 「'javac' は、内部コマンドまたは外部コマンド、
 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
 「Exception in thread "main" java.lang.NoClassDefFoundError: 」
 http://www.wikiroom.com/java/?path,classpath
・String に == は使うな。equals() を使え。
・「\12288 は不正な文字です。」
文字リテラル以外で全角スペースは使えません。半角スペースに。
・その他の質問→「APIのjavadoc見ろ」

前スレッド
【初心者】Java質問・相談スレッド126【歓迎】
http://pc12.2ch.net/test/read.cgi/tech/1242152793/
次スレは>>990あたりで。

過去ログ、関連スレッド、よくある質問とその回答など、
質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
http://www.wikiroom.com/java/
0153デフォルトの名無しさん2009/06/12(金) 14:40:55
151ですけど。本では分けて記述していまして、
一番最初のFileOutputStreamの参照変数に対してcloseしています。
繋げて書いた場合はPrintStreamのメソッドのcloseを使ってOKと
いうことは、closeは、どの段階のものでもいいのでしょうか。
それとも最初か最後のどれとか決まっているのでしょうか。
0154デフォルトの名無しさん2009/06/12(金) 14:53:42
>>153
どのcloseを呼び出すのかは、使用するライブラリの実装次第。

java.io.Closeable#close() では、
> このストリームを閉じ、関連付けられているすべてのシステムリソースを解放します。
とあり、一番外側を close すれば、ラップされていても全て解放する仕様、と読み取れる。
0155デフォルトの名無しさん2009/06/12(金) 15:02:37
>>152 >>154 ありがとうございました。
0156デフォルトの名無しさん2009/06/12(金) 15:29:24
一つの想定される作業群が終了した段階でStreamはまめに閉じるようにしたほうが良いよね
01571022009/06/12(金) 15:32:19
>>110
ありがとうございます。
おとなしく普通のループ使います。
0158デフォルトの名無しさん2009/06/12(金) 18:03:36
>>135
ニート死ね
0159デフォルトの名無しさん2009/06/12(金) 20:06:55
String filelist[] = cdirectory.list( new MyFilter() );
・・・
static class MyFilter implements FilenameFilter {
public boolean accept(File dir, String name) {
return name.endsWith(".TXT") || name.endsWith(".txt");} }
見たこともない仕組みが登場しました。
acceptメソッドとか記述もしてないのに、これでちゃんと動くのですけど
これは特殊な仕組みなのでしょうか。
0160デフォルトの名無しさん2009/06/12(金) 20:19:49
>>159
俺にはacceptメソッドを記述しているように見える罠。
0161デフォルトの名無しさん2009/06/12(金) 20:23:06
>>160
使う側の、String filelist[] = cdirectory.list( new MyFilter() ); で
呼ばれてないんですよね。読んでいるところが見当たらないんです。
0162デフォルトの名無しさん2009/06/12(金) 20:26:16
>>161
cdirectory.list()メソッドの中で呼ばれてると思うが
0163デフォルトの名無しさん2009/06/12(金) 20:36:36
class Sample1
{
public static void main(String args[])
{
try{
int test[];
test = new int[5];
System.out.println("test[10]に値を代入します。");
test[5]=【?】;
System.out.println("test[10]に80を代入します。");
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("配列の要素を超えています。");
System.out.println( e +"という例外が発生しました。");
}
finally{
System.out.println("終わりました。");
}
System.out.println("無事終了しました。");
}
}
例外が出ないような値を【?】に入れたいんだけど5以上にしても5以下にしても例外に当てはまってしまう。
いったい何を入れればいいのかな?それともどこか変えなければいけないのかな?
0164デフォルトの名無しさん2009/06/12(金) 20:46:33
new MyFilter() でオブジェクト生成はしてますけど、
acceptメソッドは、いつ呼ばれるんでしょうか

0165デフォルトの名無しさん2009/06/12(金) 20:51:05
test[5]=【?】; 0〜4までじゃないですか。
0166デフォルトの名無しさん2009/06/12(金) 20:55:49
>>163
書いてることがよく分からんが、というか配列を勘違いしてるっぽいが
test = new int[5]; でtest[0]〜test[4] までを確保しているので
test[5] は存在しない。
よって、【?】にどんな値を入れようとしてもエラーになる。

>>164
内部で自動的に呼ばれる
0167デフォルトの名無しさん2009/06/12(金) 21:01:12
>内部で自動的に呼ばれる
そうなりますと、listメソッドの中で記述されているということですね。
こういうのが沢山あると、使うほうはわかりにくいですねえ。
出てくるたびに考え込まないといけないですね。
ありがとうございました。
0168デフォルトの名無しさん2009/06/12(金) 21:03:56
>>166
基本的なことを忘れてました。
ありがとう
0169デフォルトの名無しさん2009/06/12(金) 21:27:38
>>167
考え込みません。
使い方は APIdoc に書いてある。
それが何を意味するのか、を考え込むかもしれないが。
0170デフォルトの名無しさん2009/06/12(金) 21:55:18
searchするのも大変だしfinalだからOOP的に継承できないし、なんでこんなにジャバの正規表現は使いにくいんですか?
0171デフォルトの名無しさん2009/06/12(金) 22:08:11
クラスライブラリを「正しく」使うのは、言語とかアルゴリズムとかの
知識だけじゃなくそれなりの「教養」も必要かもな
0172デフォルトの名無しさん2009/06/12(金) 22:11:01
年寄りだと「コールバック」とか「関数オブジェクト」で通じるんだけどなぁ。
0173デフォルトの名無しさん2009/06/12(金) 22:22:30
>>170
RegexpとかOROとか諸々の正規表現ルーチンを開発する楽しみを残すためです。
0174デフォルトの名無しさん2009/06/12(金) 22:26:17
コールバックと正規表現は関係ないと思うが、もしかしてビギナー?
0175デフォルトの名無しさん2009/06/12(金) 22:43:48
>>174
acceptメソッドに対するレスだろう。
0176デフォルトの名無しさん2009/06/12(金) 23:15:03
いや関数オブジェクトは誤解されるかもよ?
0177デフォルトの名無しさん2009/06/13(土) 00:28:54
>>176
むー、純粋な関数オブジェクトと誤解されるか。そこまで意識してなかった。
Javaで関数オブジェクトって厳密には実現できなくて、同様の手段としてストラテジ
パターン使ってる別物か。

import java.io.*;
public class Main {
public static void main(String[] args) {
File cdirectory = new File("c:\\usr");
String filelist[] = cdirectory.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".TXT") || name.endsWith(".txt");
}
});
for (String name : filelist) {
System.out.println(name);
}
}
}
0178デフォルトの名無しさん2009/06/13(土) 00:47:35
ストラテジパターンとかコールバックとか言ってるけど結局ちゃんとわかってないんじゃんw
最近さ、ブログでもデザインパターンの用語ばかり散りばめて自分によってる奴多いんだよね・・・
0179デフォルトの名無しさん2009/06/13(土) 10:21:12
人をこき下ろして済む生徒さんはいいでちゅね。
0180デフォルトの名無しさん2009/06/13(土) 10:47:04
拡張子tXtやTxTはダメなんですね
0181デフォルトの名無しさん2009/06/13(土) 11:32:04
>>180
実装次第。toLowercase()して比較。前スレの914あたりからの話を参照。
0182デフォルトの名無しさん2009/06/13(土) 17:54:58
コンポジットパターンだったか、ファイルとディレクトリが典型アレ、
なんか設計というかファイルとデレクトリで使うには適してないと思うですけどどうですか?
ファイルの方は抽象クラスで宣言されてるメソッドを使わないから、例外発生とかですよね。せんせ!
0183デフォルトの名無しさん2009/06/13(土) 18:00:36
if (args.length != 1 || args.length == 1 && args[0] == "/?") {
引数のチェックなんですけど、"/?" とは何を入力したときなんでしょうか。
0184デフォルトの名無しさん2009/06/13(土) 18:05:37
/?です。
0185デフォルトの名無しさん2009/06/13(土) 18:05:42
ヘルプコマンドの定型文だろ

dir /?

みたいな
0186デフォルトの名無しさん2009/06/13(土) 18:07:51
引数に、/?を指定しても、このチェックに引っ掛からないんです。
0187デフォルトの名無しさん2009/06/13(土) 18:08:57
そりゃ当然だ。
0188デフォルトの名無しさん2009/06/13(土) 18:11:12
args = new String[]{ "/?" };

↑じゃ↓が偽になって弾かれるからだろ

args.length != 1
0189デフォルトの名無しさん2009/06/13(土) 18:14:20
それじゃ判定文の優先順位がわかんねえだろ
つーか、またStringで==とかの論争が始まるのか、勘弁してくれ
0190デフォルトの名無しさん2009/06/13(土) 18:16:35
if (args.length != 1 || args.length == 1 && args[0].equals("/?")) {
0191デフォルトの名無しさん2009/06/13(土) 18:19:12
それじゃ判定文の優先順位がわかんねえだろ
0192デフォルトの名無しさん2009/06/13(土) 18:21:08
/?については、そのまま/?と入力するので正しいんでしょうか?
0193デフォルトの名無しさん2009/06/13(土) 18:28:07
判定文を>>190にしてみ
0194デフォルトの名無しさん2009/06/13(土) 18:33:38
&&は||より優先されるが、まあ括弧で囲むのが妥当だろうな
0195デフォルトの名無しさん2009/06/13(土) 18:37:04
>>193
190に変更したら、引数に/?を指定してチェックに引っ掛かりました。
よく考えたらStringは==駄目でしたね。本の通り打ったんですけど、
本が間違えているんですね。それから、/?を引数に入れることに
どんな意味があるんでしょうか。
0196デフォルトの名無しさん2009/06/13(土) 18:37:38
>>195
>本の通り打ったんですけど
出版社とタイトル、ページ数を教えて欲しい
0197デフォルトの名無しさん2009/06/13(土) 18:43:41
ISBNでいいんじゃね
あと版数な
0198デフォルトの名無しさん2009/06/13(土) 18:46:46
while ((n = bistream.read()) != EOF) {
System.out.print(convHex((n & 0xf0) >> 4)); //ココ1
System.out.print(convHex(n & 0x0f)); } //ココ2
それから、これはヘキサダンプ作成のコードなんですけど、
文字を4ビットずつ表示してると思うんですけど、
ココ1ではn & 0xf0をしなくても左4ビットに0が埋まるのではないかと
思うんですけど。どうなんでしょうか。
それから本のタイトル等は差し控えたいと思います。
0199デフォルトの名無しさん2009/06/13(土) 18:49:42
著者に聞けタコ
0200デフォルトの名無しさん2009/06/13(土) 18:51:38
何百回も言われてると思うけど、

情報出さない連中がまともな回答を期待するのが間違い
0201デフォルトの名無しさん2009/06/13(土) 18:52:50
どうせあれだろ、自分で書いて動かなくて、
それを突っつかれたくないから「本の通りに書きました><」とか言ってんだろ
0202デフォルトの名無しさん2009/06/13(土) 19:22:57
このスレの内容が既に初心者の域を超えている気がする
本当のjava初心者が質問しづらい空気だから、他スレでやって欲しいわ
0203デフォルトの名無しさん2009/06/13(土) 19:25:05
202が初心者ブログでも開いてろアフォ
0204デフォルトの名無しさん2009/06/13(土) 19:35:29
>>202が勘違いしているのかもしれんが、
【初心者】【歓迎】と書いてあり、初心者が来ること自体は何の問題も無いが、
別に初心者用のスレというわけでもない

初心者専用ならこっちに行ったらどうだろう

Javaやらないか(超初心者向け)
ttp://pc12.2ch.net/test/read.cgi/tech/1228452306/
0205デフォルトの名無しさん2009/06/13(土) 19:36:20
すげえ過疎ってるな
0206デフォルトの名無しさん2009/06/13(土) 20:20:50
>>198
エスパーしなければならない点
1. bistreamの型
2. nの型
3. ENDの値
4. convHex()の引数の型
・・・情報出してると言えないよね、その聞き方じゃ?

1. BufferdInputStreamとエスパー
2. 1からint
3. 1から-1
4. キャストしていないから、nの型からint
とエスパーすると、BufferdInputStream#read() が返すのはバイト値か-1だけ
だから必要は無いね。
でもSystem.out.print(convHex(n & 0x0f));の行と並べた時に意図が明白になる
から意味はある。個人的シュミだと
System.out.print(convHex((n>>>4) & 0x0f));
System.out.print(convHex((n>>>0) & 0x0f));
とするかな。そんなことまで聞いてない?スマンな、エスパーだからな。

>>202
人のレスに一々ケチつけてるヒマがあるなら、キミが答えてやればいいじゃないか。
それで解決。
0207デフォルトの名無しさん2009/06/13(土) 20:29:38
それで先生方は>>182について疑問に思わなかったんですか?
設計(例題)がおかしいんですよ!?
0208デフォルトの名無しさん2009/06/13(土) 20:34:05
おそらく日本語がおかしくなけりゃ相手にしてるだろう
0209デフォルトの名無しさん2009/06/13(土) 20:35:13
そんなこと言わず、食わず嫌いはいけませんよ!?
0210デフォルトの名無しさん2009/06/13(土) 20:39:19
人工無能と会話していることに気が付くと恥ずかしいよね
0211デフォルトの名無しさん2009/06/13(土) 20:40:10
>>206
>でもSystem.out.print(convHex(n & 0x0f));の行と並べた時に
>意図が明白になるから意味はある。
すごくよく分かりました。質問ももっと情報を書かないといけないことも
分かりました。ありがとうございました。
0212デフォルトの名無しさん2009/06/13(土) 20:40:40
ム板マ板にだけ変なのを仕込んでるんだな
0213デフォルトの名無しさん2009/06/13(土) 22:10:37
>198
See JLS 5.6.1
0214デフォルトの名無しさん2009/06/13(土) 22:17:28
floatを小数点第一位まで表示したStringにしたいんですが、
一番簡単な方法はなんでしょうか?

こんな感じです。
0.16 → "0.2" (四捨五入)
1 → "1.0"(小数にならない数も.0をつける)
0215デフォルトの名無しさん2009/06/13(土) 22:25:50
多分String#format。それがだめならjava.text.NumberFormat。あとはしらね。
02162142009/06/13(土) 22:34:09
どうもありがとうございます。
ググったらDecimalFormatというのがありました。
DecimalFormat pattern = new DecimalFormat("0.0");
String str = pattern.format(0.51);
0217デフォルトの名無しさん2009/06/13(土) 23:42:03
>>198はやさしいjavaかhead first javaだった気がする。
0218デフォルトの名無しさん2009/06/14(日) 04:16:57
既存のJavaクラスを継承したクラスの、
インスタンスを作るにはどうすればいいですか?

例えば、Stringに追加メソッドが欲しいと思い、
class StringEx extends java.lang.String {
  public void addABC() {
    this += "ABC";
  }
}
こういうクラスを作った場合、
StringExのインスタンスはどうやって作ればいいのでしょうか。
0219デフォルトの名無しさん2009/06/14(日) 06:27:39
>>218
String は final宣言されてるから継承できないよ
0220デフォルトの名無しさん2009/06/14(日) 09:33:21
サーティファイのjava言語能力検定試験3級を取得する為に勉強中です。
過去問を見ていると分からない記述があったので質問させて下さい。

下記mainクラス内の宣言部に記載されている、
「int a = 0x0f , b = 0x0f」の初期値"0x0f"が何を指しているのか分かりません。
�@と�Aでは15が出力され、�Bでは31が出力されました。
インクリメントされたaをxに代入しているにも関わらず、
なぜ�Aでも15が出力されるのですか?
どなたか教えて下さい。

class Increment{
public static void main(String args[]){
int a = 0x0f, b = 0x0f ,x = 10, y = 10;


System.out.println(a); //�@

x = a++;

System.out.println(x); //�A

y = x + ++b;

System.out.println(y); //�B

}
}
0221デフォルトの名無しさん2009/06/14(日) 09:43:47
>>220
ヒント
インクリメントにはa++と++aがある
0222デフォルトの名無しさん2009/06/14(日) 10:24:28
>>220
ヒント 式の評価順序
0223デフォルトの名無しさん2009/06/14(日) 10:43:46
0x0f に関しては3.10.1。
++に関しては15.14.2ならびに15.15.1。
評価順序に関しては15.7全般。

http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html
0224デフォルトの名無しさん2009/06/14(日) 11:01:31
16進も知らずに試験とな?
0225デフォルトの名無しさん2009/06/14(日) 11:28:27
正規表現にマッチしたら、文字列の一部を抜きだしたいんだけど
どうすればいいの?
0226デフォルトの名無しさん2009/06/14(日) 11:37:24
class Kyutuu {
public synchronized void buy() { 〜}
public synchronized void seisan() { 〜}

class Ko1 extends Thread {
void buy() //ココ
void seisan()

class Ko2 extends Thread {
void buy() //コレ
このような感じの場合に、synchronizedを指定すれば
同期が取れるとあるのですけど、synchronizedなメソッドを
呼び出して終わればロックは自動解除されるとあるので、
ココが終わった瞬間に、コレが先に動いて同期が
取れなくなる場合があるように思うんですけど、
どうなのでしょうか。
0227デフォルトの名無しさん2009/06/14(日) 11:37:59
>>225
Matcherのgroupでいい
0228デフォルトの名無しさん2009/06/14(日) 11:44:37
>>226
何を守って同期したいのか不明。
Kyoutuu は可哀想な子
0229デフォルトの名無しさん2009/06/14(日) 11:45:49
>>220
0x0fは0xが16進ですよを表して、一文字(8バイト)を表して、
ofは4ビットずつを、前半4ビットが0000、後半4ビットが1111で、
15になります。x = a++; は、x = a; a = a + 1 と同じ意味です。
0230デフォルトの名無しさん2009/06/14(日) 11:47:51
>>228
buy()は金額加算です。同期とれませんよね?
0231デフォルトの名無しさん2009/06/14(日) 11:52:13
>>226
synchronized void buy() { /* hoge */ } は
void buy() { synchronized(this) { /* hoge */ } } と同じ。

第二版 8.4.3.6 synchronizedメソッド
ttp://www.y-adagio.com/public/standards/tr_javalang2/classes.doc.html#260369
0232デフォルトの名無しさん2009/06/14(日) 11:55:22
>>230
特に同期を取る必要の無いものだろうから、別に問題ないだろ。
0233デフォルトの名無しさん2009/06/14(日) 12:23:49
>>225
Pattern pat = Pattern.compile("a.*?b");
Matcher mat = pat.matcher("abaabbcbacb");
while (mat.find()) {
System.out.print(mat.start());
System.out.print(", ");
System.out.println(mat.end());
System.out.println(mat.group());
}
0234デフォルトの名無しさん2009/06/14(日) 13:09:00
226です。テストしたらやっぱり同期は取れませんでした。
ありがとうございました。
02352252009/06/14(日) 16:37:46
>>227,>>233
ありがとう
02362202009/06/14(日) 16:44:44
>>221
>>222
返信ありがとうございます。
a++は処理が行われた後にインクリメントする、
++aは処理前にインクリメントするという認識でした。
この認識が既に誤っているのでしょうか?
なぜ、�Aで出力結果が16にならないのかが分からないのです。

>>223
返信ありがとうございます。
リンクを貼っていただいたサイトを拝見しました。
16進数については勉強していたのですが、
お恥かしいことに0x0から始まる形式を見たことが無く、16進数と分かりませんでした。
大変勉強になりました。

>>224
上記の通り、私の勉強が足りませんでした。
試験まであと2週間しかないのですが、精一杯勉強して頑張ってみます。
返信ありがとうございました。
0237デフォルトの名無しさん2009/06/14(日) 16:45:35
Javaのリフレクションとは、デバックをする手段と考えても良いのでしょうか?
02382202009/06/14(日) 16:55:28
>>229
解説ありがとうございます。
0xという表記が16進数を意味しているんですね。

返信を下さった皆様、ありがとうございました。
私のバカな勘違いで、�Aでaの中身を出力しているつもりで結果を見ていました。
本当に申し訳ありません。0x…の記述については大変勉強になりました。
お世話になりました。
0239デフォルトの名無しさん2009/06/14(日) 16:58:03
>>237
否。

java-APIソースでjava.lang.reflectをgrepしてみるといい。
かなり積極的に利用されてる。
0240デフォルトの名無しさん2009/06/14(日) 17:27:21
>>236
>�Aで出力結果が16にならないのかが分からないのです。

int a = 0x0f // ここでaには15が格納されます
x = a++; // ここでxにaの値(15)が格納されて aに1が+されます。

System.out.println(x); //�A つまりここの段階でa=16 x=15となります。

0241デフォルトの名無しさん2009/06/14(日) 17:32:36
>>239
ありがとうございます
0242220&2402009/06/14(日) 17:33:06
>>236
>>238で自己解決してましたね。失礼。
0243デフォルトの名無しさん2009/06/14(日) 17:53:16
>>241
パフォーマンスに激しく影響するし、
バグを実行時まで遅延させることになるから
積極的には使わない方がいいよ。
0244デフォルトの名無しさん2009/06/14(日) 18:03:23
private メソッドを実行できたり、色々問題はあるけど、必要になったら使えば良い。
リスクを判ってるなら無理して使わない理由は特に無い。
0245デフォルトの名無しさん2009/06/14(日) 18:34:40
Maven 使ってると、コレ関係あるのか?っていうライブラリだけで数十MBとか。
かといって、うかつに除外しちゃうと、動いている途中に大コケ。

これってもう、諦めて全部配備するしかない?
0246デフォルトの名無しさん2009/06/15(月) 02:03:33
mavenをまったく理解してないとしか思えない
0247デフォルトの名無しさん2009/06/15(月) 08:18:32
使いこなせないのをツールのせいにするのはよくないな。
依存関係も最近はマシになっている

で数十MBを節約しなきゃいけないってどんな過酷な環境なんだw
0248デフォルトの名無しさん2009/06/15(月) 08:27:57
>>245
普通に考えて要らないものを入れるような設定書くかな。
というわけで基本は全部入れる。

もちろん例外も有るけど、そこを考えて判断するのは基盤部分に携わる専門技術者の仕事だね。
自分が一般的な開発者の役割なら用意されたものを全部入れるべき。
0249デフォルトの名無しさん2009/06/15(月) 13:20:31
Arrays.sortでComparatorインターフェイスを実装して降順にソートする
というのがあるんですけど全然意味がわかりません。o1,o2には何が
渡っているんでしょうか。

String animal[] = {"lion","sai","buta","hyo","kirin","chiita"};
Arrays.sort(animal, new Mysort());
class Mysort implements Comparator<Object> {
public int compare(Object o1, Object o2) {
return -((String)o1).compareTo((String)o2);
}
}
これで降順になるらしいのですが、何と何を比較しているのでしょうか。
解説していただけないでしょうか。
0250デフォルトの名無しさん2009/06/15(月) 14:15:34
compare内に↓を書いてコンソールでも見てみ

System.out.println("o1 : "+(string)o1)
System.out.println("o2 : "+(string)o2)
0251デフォルトの名無しさん2009/06/15(月) 14:48:02
JPanelの表示・非表示を切り替えるにはどうしたらいいですか?

JFrameのようにsetVisibleというメソッドはなかったし
setOpaqueだと背景色を透明にするだけで駄目でした
0252デフォルトの名無しさん2009/06/15(月) 14:55:00
>>250
sortメソッドの中でオブジェクトを参照して比較してるんですね。
returnがマイナスならそのまま、プラスなら左右入れ替えているんですね。
よくわかりました。ありがとうございました。5時間くらい悩んでました。
■ このスレッドは過去ログ倉庫に格納されています