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

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

■ このスレッドは過去ログ倉庫に格納されています
00011NGNG
JAVA初心者の方はこちらのスレで質問をしましょう。そして誰か教えてあげてください。

なお、ソースを貼るときには、半角空白が消える仕様のため、タブ1つを全角空白2つに
置換してから投稿しましょう。雑誌や宿題などの疑問を質問するときは出展を明記した
ほうが解決が早いです。

関連情報は >>2-10 あたりにあります。 (一部 dat落ちやHTML化待ち)


JavaScriptの質問はWeb製作板へどうぞ。
web制作管理
http://pc.2ch.net/hp/

パソコンの基本操作に関しては、PC初心者板や、各OS板などで質問しましょう。
パソコン初心者@2ch掲示板
http://pc.2ch.net/pcqa/

上級者の方で教える技術が無い方は下記スレでダベりましょう。
初心者無視! Java相談室 その9
http://pc.2ch.net/test/read.cgi/tech/1021555964/


基本的にsage進行でおねがいします。
0751デフォルトの名無しさんNGNG
class arraylength {
public static void main(String args[])
{
    double[][] array = new double[2][3];
 System.out.println(array.length);
 System.out.println(array[0].length);
}
}
をやってみますた。array.lengthだと前のほうに入っている
値がでるのですね。つまりここでは2ですね。
array[0].lengthで後ろの3ですね。なるほど!
ありがとうございました。
0752デフォルトの名無しさんNGNG
>>750
ふむ、なるほど、だからarray[0].lengthという書き方になるのですね(想像)
理解が深まりすた。皆様いろいろありがとうございます。
0753デフォルトの名無しさんNGNG
>>752
そういうこと。array[0] と array[1] では配列の長さ違うかも知れない。

double[][] array = new double[2][];
array[0] = new double[5];
array[1] = new double[10];
System.out.println(array[0].length);
System.out.println(array[1].length);
0754デフォルトの名無しさんNGNG
class arraylength2 {
public static void main(String args[])
{
double[][] array = new double[2][];
array[0] = new double[5];
array[1] = new double[10];
System.out.println(array[0].length);
System.out.println(array[1].length);
}
}
をやってみますた。5と10がでました。
かなり混乱してきますた。これはarray[0]とarray[1]の長さでしか?
つまり、array[2][]で配列が2本用意されて、そのarray1本ずつに対して、
さらにarrayが一本ずつ、array[0]には5個はいる配列と、だから配列の配列。

つまり配列は行列ではないのですね!!すごい発見をした気分。
平面ではなくて立体ですね!!ビルが2本、5階建てのビル、10階建てのビル
ですね!!
0755デフォルトの名無しさんNGNG
>>722
どうもありがとうございました。
参考にしていろいろやってみます。

Rinaさんもありがとございました。
0756if_tomorrow_comesNGNG
えっと、またバカみたいな質問ですけど・・・

javaで、CのatoiやVBのvalに相当する命令を出すには、
どのように書けば良いのでしょうか。
0757デフォルトの名無しさんNGNG
String num = "100";
int i = Integer.parseInt(num);
0758デフォルトの名無しさんNGNG
>>756みたいな人は
まず
>>2-6あたりのリンクを
読む
0759if_tomorrow_comesNGNG
757さん
出来ました。お手数かけてすいませんでした。

758さん
そうですね。
この調子で質問してたら、キリが無いですよね。
一応、javaのページは軽く目を通したんですけど、もっと詳しく勉強してから
それでも分からない時に質問したいと思います。
0760デフォルトの名無しさんNGNG
JavaのGUIプログラムからFortranの計算プログラムを実行させるにはどのようにすれば良いのですか?
0761Rina ◆tI333vNE NGNG
これじゃ駄目かな?
http://userweb.elec.gla.ac.uk/i/iainw/jni/
0762Rina ◆tI333vNE NGNG
http://donald.phast.umass.edu/~fardal/jfpage/javafortran.shtml
あとここ.
0763デフォルトの名無しさんNGNG
Rinaたん萌え〜
0764725NGNG
>>729
アドバイスありがとうございます。

すいません、よかったらもう一つ教えてください。
JTableで行を選択するとき、デフォルトの設定だと、
 1)複数行を選択してマウスから指を離す。
 2)選択された複数行のうちの1行をマウスでクリックする。
という操作をすると他の行の選択が解除されてしまいますよね。

単に、複数行をドラッグ&ドロップするアプリを作りたいだけなんですが・・。
複数行を選択してそのままドラッグ、だとうまくいきますが、ちょっと
使いにくいので、一度複数行を選択してマウスを離してから再びドラッグする、
ということはできないものかと考えています。

マウスイベントを拾ってシコシコやるしかないでしょうかねえ。
もし簡単なやり方をご存知でしたらアドバイスお願いします。
0765デフォルトの名無しさんNGNG
ファイルを読むとき

BufferedReader reader = new BufferedReader(new FileReader("Filename"));
String line = reader.readLine();

で読むのはわかったのですが、

BufferedWriter writer = new BufferedWriter(new FileWriter("Filename"));

で書く場合にはどうすればよいのでしょう?

PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter("Filename")));

書くときはこうするべきなんですか?
0766デフォルトの名無しさんNGNG
>>765
すべきということはない。PrintWriter を使うと少々のオーバーヘッドがかかるし、
出力エラーが発生した場合ちゃんと通知してほしい、行末シーケンス (LF/CRLF) に
システムデフォルトのコードを使ってほしくない場合などは使わないだろう。要は
楽なコードを書きたいかどうかなんだが。
0767デフォルトの名無しさんNGNG
>764
自前の ListSelectionModel を作る
0768765NGNG
>>766
その場合は、どうやって書き込むのでしょうか?

PrintWriter の場合は、 writer.println(writer); で書きますけど、BufferedWriterの場合の書き方がわかりません。

0769デフォルトの名無しさんNGNG
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("hoge.txt")));
out.println("hello, world");
out.close();

上記は↓のコードとほぼ等価:

Writer out = new BufferedWriter(new FileWriter("hoge.txt"));
try{
  out.write("hello, world");
  out.write(System.getProperty("line.separator"));
} catch(IOException ex){/* */}
out.close();

ってか、PrintWriter クラスのソースを読め。
0770765NGNG
hoge.write を使うんですね。ありがとうございます。

> ってか、PrintWriter クラスのソースを読め。

BufferedWriter のほう一生懸命読んでいました。
0771デフォルトの名無しさんNGNG
>>769
あっ BufferedWriter 型じゃなくて Writer 型なんですね。
0772デフォルトの名無しさんNGNG
> } catch(IOException ex){/* */}

これは良くないなぁ・・・
0773デフォルトの名無しさんNGNG
>>772
ex.printStackTrace() ぐらい呼べという意味?
それとも、IOException 以外の例外をトラップできないから Exception で
受けるべきという意味?
はっきりと書かないと意味が通じないよ。
0774デフォルトの名無しさんNGNG
Fortranの入力が見にくいので、JavaでGUI形式の入力を作成しようと思っています。
その際にFortranとJavaを連動させるにはどしたら良いのですか??
Visual Fortran を使っています。
0775デフォルトの名無しさんNGNG
>>772
PrintWriter は内部で IOException 発生しても何も言わないでしょ。
その意味も込めて {/* */} にしたんだってば。
0776デフォルトの名無しさんNGNG
と言ってみたが初心者に行間読めっていうのも酷な話だな。
0777Rina ◆tI333vNE NGNG
printStackTrace()を呼ばないんなら,

try {
hogehoge();
} catch (FooException e) {
// do nothing.
}

…とかの方がよくない?
もしくは,

try {
hogehoge();
} catch (FooException e) {
throw new InternalError(e.toString());
}
0778デフォルトの名無しさんNGNG
何か話が脱線気味ですが、当初の話は PrintWriter と普通の Writer の動作特性の
違いです。catch した例外の取り扱いこうあるべきってのはまた別の話なのでよろしこ。
0779Rina ◆tI333vNE NGNG
>>764
亀レスすまそ.
えっと結論から言うと,JTableあんまし使ったことないから分からんw
力になれなくて申し訳ない….
APIドキュメント見てみても使えそうなメソッドとかがなかったら, 自前で
イベント拾ってやるしかないんじゃないかなぁ….

>>763
どこら辺に萌え? 教えて,今後の参考にするからw
0780デフォルトの名無しさんNGNG
>>776っていうよね 初心者が初心者を隠すときって
0781デフォルトの名無しさんNGNG
>>773
>>775
なんか、必死だね。

772がなにを言いたいかわからないが、私はコメントの使い方は良いとは思わない。
0782デフォルトの名無しさんNGNG
>>781
たしかに。
0783デフォルトの名無しさんNGNG
初心者と言われて顔を真っ赤にしている人がいらっしゃいます。
0784デフォルトの名無しさんNGNG
>>781
頭悪そうだなおまえ。
0785765NGNG
荒れているところすいませんが

>>769
Writer out = new BufferedWriter(new FileWriter("hoge.txt"));
が try からはずれておりますけど、なぜ、tryの中にいれて例外を受け取らないのでしょうか?
それはプログラムの作り方によって変えればいいってだけですか?

ファイルが作れないこともあると思うので、中に入れたほうがいいんですよね?
入れないほうがいい理由があったら知りたいです。
0786デフォルトの名無しさんNGNG
>>784
逆ギレしてないで黙ってなさい。
0787名前NGNG
フレームを画面中心にするにはどうすればよい?
もしくは、画面サイズを取得する方法を教えて頂戴
0788デフォルトの名無しさんNGNG
>>785
入れたほうが良いって言うか、ちゃんと書くなら普通こんな感じ:

Writer out = null;
try{
  out = new BufferedWriter(new FileWriter("hoge.txt"));
  // …
} catch(IOException ex){
  // エラー処理
} finally {
  try{ if(out != null) out.close(); }catch(IOException ex){/* */}
}

メソッドが IOException をスローすると宣言されていても、最後の finally で
close する必要があるのでどの道 try-catch は必要。
0789デフォルトの名無しさんNGNG
>>787 それ、過去スレで答えたなぁ。
ttp://java.sun.com/j2se/1.4/ja/docs/ja/api/java/awt/Window.html#setLocationRelativeTo(java.awt.Component)
0790デフォルトの名無しさんNGNG
>>871
コメントの使い方が気に食わなかったのか?
C/C++ から来た人なら DO NOTHING の意味で使ってる人結構いると思うけど。
0791765NGNG
>>788
ありがとうございます。
宣言は try の外がいいんですね。勉強になります。

0792デフォルトの名無しさんNGNG
>>791
そう、ファイルクローズの保証のために finally の中で close() を
呼び出したいから、try ブロックの外で宣言しておかないとまずい。
0793名前NGNG
>>789
ありがとSUN

0794デフォルトの名無しさんNGNG
public class Hoge {/* */}
0795sageNGNG
どーも
0796デフォルトの名無しさんNGNG
>>779
2ch語使わないともっと萌えます。
0797デフォルトの名無しさんNGNG
765って普通?よく見るコードではあるけど、頭悪そうで嫌い。
try {
 BufferedWriter out = new BufferedWriter(new FileWriter("hoge.txt"));
 try {
  out.write("hoge");
 } finally {
  out.close();
 }
} catch (IOException e) {
 //エラー処理
 e.printStackTrace();
}
ぐらいしないの?
ちゃんと考えないとネストが深くなりすぎるが。
0798デフォルトの名無しさんNGNG
↑間違えた。788ね。
0799デフォルトの名無しさんNGNG
>>797
好き好き。ってか無駄に try 重ねると白痴に見える。
0800デフォルトの名無しさんNGNG
全く無駄ではないが?788にしたって結局2回tryしてるしな。
0801デフォルトの名無しさんNGNG
アタマが悪い人は放置しなさい。
0802765NGNG
>>792
再びありがとうございます。
0803765NGNG
>>799
うん、その点だけ>>788は気になりますね。
0804デフォルトの名無しさんNGNG
>>801
誰がアタマが悪い人なの? あなたの中で・・・ なんかあなたの考え間違っていそう。
0805732NGNG
すいません、質問の仕方が悪かったんですね。 
昨日、Javaを初心者用テキストで勉強し始めて、JDKをC:\jdk1.3のフォルダにインストール。
パスを通すということでC:のAutoexec.batにPATH C:\jdk1.3\bin;%PATH%と入力。
MS−DOSプロンプトで2数の和を求めるプログラムSample1を入力。
コンパイルして、.CLASSファイルが作られたことを確認。
しかしJavaコマンドを実行すると、
Exception in thread "main" java.lang.NoClassDefFoundError: Sample1
とエラーがでるのです。何度テキストを見ても間違った操作をしているようには思えないのですが…。
どなたか対応策を教えていただけないでしょうか。
0806デフォルトの名無しさんNGNG
>>804
必死だな(藁
0807デフォルトの名無しさんNGNG
>>797
out.write() で例外が発生して、その影響で out.close() からも例外が
発生した場合、障害の大本の原因であろう out.write() 側の例外情報が
報告されないな、そのコードだと。JDBC の Connection 関係で同じよう
なコード書いてくれるなよ。
0808デフォルトの名無しさんNGNG
>>805
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/NoClassDefFoundError.html
0809765NGNG
>>805
> パスを通すということでC:のAutoexec.batにPATH C:\jdk1.3\bin;%PATH%と入力。

OSはなにつかってます? OSによってパスを通す方法が異なりますよ。

> Exception in thread "main" java.lang.NoClassDefFoundError: Sample1

実行するときは、クラスのあるディレクトリで

java Sample1

ですよね?




0810デフォルトの名無しさんNGNG
>805は
java Sample1.class
とでもしてるのか
大文字小文字を区別してないかだろうな・・・
0811デフォルトの名無しさんNGNG
>>806
答えられないのなら いちいち >>801 のようなこと書くなよ。
あっごめん >>801 = >>806 のような馬鹿は放置でしたね。
0812797NGNG
俺には
} catch(IOException e) {
 //エラー処理
 e.printStackTrace();
} finally {
 if (out != null) {
  try {
   out.close();
  } catch(IOException e) {
   //またエラー処理
   e.printStackTrace();
  }
 }
}
の方がよっぽど白痴に思えるがな。
807の問題は確かにある。あともうひとつ穴があるんだがこれはまだ指摘されてないな。

801は807を以って797を頭悪いと評しているのか?俺も興味あるな。
0813デフォルトの名無しさんNGNG
>>810
> java Sample1.class
> とでもしてるのか

その場合は

Exception in thread "main" java.lang.NoClassDefFoundError: Sample1/class

になりますね。
0814デフォルトの名無しさんNGNG
粘着野郎のコードが無駄に邪魔なんですけど・・・
0815デフォルトの名無しさんNGNG
なんだ、穴だらけか。
0816っていうかウザいよおめーが!!NGNG
>>814
>>815

上級者の方で教える技術が無い方は下記スレでダベりましょう。
初心者無視! Java相談室 その9
http://pc.2ch.net/test/read.cgi/tech/1021555964/

0817デフォルトの名無しさんNGNG
>>814
なにに大して邪魔なんですか?どう邪魔されたのか教えて下さい。
0818デフォルトの名無しさんNGNG
大して× 対して○
0819デフォルトの名無しさんNGNG
>>814
どっちかていうとお前が粘着です。残念ですが・・・
0820デフォルトの名無しさんNGNG
初心者が釣られて困っています。
だれか口に綿を詰めて黙らせてあげて!!
0821デフォルトの名無しさんNGNG
>>814 でもそのおかげで、/* */ってコメントの書き方がよくない理由が実例を使って
説明できるね。788では最終的にファイルをclose()できないときは
ほっておくという意図を伝えたくて/* */と書いたはずなのに、797はそれを読み取れずに
またエラー処理してprintStackTraceするコードに/* */があった部分を書き換えてる。
#まあもしかしたら悪意があって、わざわざ冗長なものにしているのかもしれんけど。
0822デフォルトの名無しさんNGNG
>>819
しつこっ!!!(藁
0823デフォルトの名無しさんNGNG
粘着な上に口調を変えて自演かよ
おめでてーな
0824デフォルトの名無しさんNGNG
とりあえず、Javaの質問や相談以外は放置願います。 
0825デフォルトの名無しさんNGNG
で、どのアフォが言ったコードが正解なんですか?
0826デフォルトの名無しさんNGNG
>>807
>out.write() で例外が発生して、その影響で out.close() からも例外が
>発生した場合、

てのは具体的にどんなときだ?
out.write()で例外Aが発生して、out.close()でも例外Bが発生するような状況なら
例外Aも例外Bも発生した原因は大概同じではないか?
同じならout.close()で発生した例外Bが報告されれば十分ということになる。
JDBCでも同じ。
0827797NGNG
あぁすまん。797=826だ。
0828765NGNG
>>826
同じ catch で受けるんですね?
0829デフォルトの名無しさんNGNG
>>826
あるんだよ、データベースで。「クローズできません」「トランザクションエラー」の
エラーコードで済まされているのが。もともとの例外なら「DB のヒープがいっぱい」
「トランザクションログがいっぱい」などのエラーコードが入ってるんだけど。

ファイルシステムの障害は運良くぶち当たったことが無いので何とも。でも inode が
おかしくなったりしたらこういう状況で出るかも。
0830デフォルトの名無しさんNGNG
僕は788の方が好きかな。
理由はout.close()が例外を出し得るって事がコードから伝わってくるから。
それにwriteに失敗した時のエラー処理とcloseに失敗した時の処理は
分けて考えなければ成らないかも知れないし。
0831デフォルトの名無しさんNGNG
732=805 はとりあえず
クラスパスの設定
http://java.sun.com/j2se/1.4/ja/docs/ja/tooldocs/win32/classpath.html
を読んでください。あと、参考書を使っててそのサンプルソースが
インターネット上で読めるときには署名とURLを示しとくと、ひまな人が読んでくれるかも。
0832デフォルトの名無しさんNGNG
粘着が恥かくほど恥ずかしいことはないよな〜。いとあはれ。
0833831NGNG
ごめん、間違えた。
ttp://java.sun.com/j2se/1.4/ja/docs/ja/tooldocs/findingclasses.html#userclass
のほうがいいかな。
0834デフォルトの名無しさんNGNG
>>829 の続き
普通システムってのは多重障害は想定しない、つまりある障害が原因で発生した
別の障害までは追求しないという考えがある (データ壊れたとかは別だが)。
で、最初に発生した障害 (それこそトランザクションログがいっぱいになった
とか) が原因で close() に失敗した場合、close() の例外じゃなくて最初の
例外を通知すべき、とあれこれ考えて最終的に >>788 になったわけ (このため
通知方法が無ければ close() の失敗は切り捨てるようになった)。最初は俺も
汚いコードだと思ったんだがな、もう慣れた。

ってか >>797 って Web 基○だか WA○s だか作ってない? どこかで見た
記憶があるぞ、そのコード。
0835デフォルトの名無しさんNGNG
前スレでも、 try が2段重なる程度は仕方がない ような話あったね。
0836797NGNG
>>829
>あるんだよ、データベースで。「クローズできません」「トランザクションエラー」の
>エラーコードで済まされているのが。もともとの例外なら「DB のヒープがいっぱい」
>「トランザクションログがいっぱい」などのエラーコードが入ってるんだけど。

つまり、2つの例外が発生した原因は同じものだが現実としてJDBCドライバが
正確な報告をしないから別に処理しなければならない、ということか。

>>830
>理由はout.close()が例外を出し得るって事がコードから伝わってくるから。
>それにwriteに失敗した時のエラー処理とcloseに失敗した時の処理は
>分けて考えなければ成らないかも知れないし。

797でも十分伝わってくると思うが。というか、例外発生の原因が同じなら
writeとcloseの失敗をStackTrace以外で区別する意味はないはず。
0837732NGNG
>>809
OSはWINDOWS98です。クラスがあるレジストリで間違いなく Java Sample1 と入力しています。
大文字小文字の区別も何度も確認しました。なんでうまく行かないんだろう…。
Autoexec.batに@SET CLASSPATH=C:\PROGRA~1\PHOTOD~1.0\ADOBEC~1 とかあるんですが
こういうのが影響してるってことは無いですよねー…。
0838デフォルトの名無しさんNGNG
>>837
>>833を読んでわからなかったら、コマンドラインから

dir

と

set

を実行してくれる?
0839831NGNG
>>837
それ。832のリンク先を読んでくれているのならわかりますが、
環境変数CLASSPATHを設定していると、ユーザクラスパスのデフォルト値
であるカレントディレクトリをオーバーライドします。
0840831NGNG
まちがえた。「832のリンク先」じゃなくて「833のリンク先」ね。
0841デフォルトの名無しさんNGNG
>>837
java -classpath . Sample1
とやってみてください。
0842797NGNG
>>834
>普通システムってのは多重障害は想定しない、つまりある障害が原因で発生した
>別の障害までは追求しないという考えがある (データ壊れたとかは別だが)。

なるほど。堅固性が要求される場合には現実に合わせて別に処理する、と。
しかしまだ引っかかるな。JDBCドライバの実装に足を引っ張られている気がする。
プログラマは >>769 >>812 のような冗長なコードを書かなければならんのか。

そこまでシビアな状況でない時はやっぱり797のコードを書くだろう。

>ってか >>797 って Web 基○だか WA○s だか作ってない? どこかで見た

いや。別人だ。
0843732NGNG
>>831
833読んでみましたがまだ理解するには難しいです…。setを実行してみたところ
C:\Java1\chap2>set
TMP=c:\windows\TEMP
TEMP=C:\windows\TEMP
PROMPT=$p$g
winbootdir=C:\WINDOWS
COMSPEC=C:\WINDOWS\COMMAND.COM
CLASSPATH=C:\PROGRA~1\PHOTOD~1.0\ADOBEC~1
PATH=C:\JDK1.3\BIN;C:\WINDOWS;C:\WINDOWS;C:\WINDOWS\COMMAND;C:\PROGRA~1\NETWOR~1
\MCAFEE~1;C:\PROGRA~1\GRISOFT\AVG6
windir=C:\WINDOWS
BLASTER=A220 I5 D1 T4 P330
と表示されました。
他のプログラムで設定されている環境変数CLASSPATH?が影響しているということでしょうか。
0844デフォルトの名無しさんNGNG
>>843
そうですね。それをはずせばいい。

たぶん、

java -classpath . Sample1

でもいいと思いますけど。 Sample1 の前のどっとを忘れずにね
0845831NGNG
にしても、adobeが設定するその環境変数CLASSPATHって過去スレでも
出てきましたね。個人的には環境変数CLASSPATHを設定するのって反対
なんだけど。あと、lib/extをユーザアプリが使うのとか。
0846732NGNG
>>844
! ホントですね。java -classpath . Sample1で実行されました。
「それをはずす」というのはただ消す、というわけにはいかないのでしょうね。
当面は −classpath を足した方法で進めていこうと思います。
みなさん本当にありがとうございました! 最初から挫折しないですみました。



0847デフォルトの名無しさんNGNG
>>846
がんばれ〜
0848デフォルトの名無しさんNGNG
>>846
なんでこんなに空行を入れるんだろう…
0849デフォルトの名無しさんNGNG
JavaでCのprintfのように書式を指定して出力するにはどうすればよいのですか?
例えばCのprintf("%02d", i);と同等なコードはJavaではどう書きますか?
0850797NGNG
Javaでなくて悪いが、C#には using という構文があって
BufferedWriter out = new BufferedWriter(new FileWriter("hoge.txt"));
try {
 out.write("hoge");
} finally {
 out.close();
}
を
using (BufferedWriter out = new BufferedWriter(new FileWriter("hoge.txt"))) {
 out.write("hoge");
}
のように書ける。
これから見て取れるのは、途中で例外を投げる場合は、「closeでは失敗しない」か
「closeで発生させる例外でも同じ情報を提供すべき」という思想だと思ってるが、
ドライバによってはそういう考えが欠けているということなんだろう。
※C#は触ったことないから少し違うかも。

>>846
autoexec.batに
set CLASSPATH=%CLASSPATH%;.
で、再起動、でもいけると思うよ。738でも書いたけど
■ このスレッドは過去ログ倉庫に格納されています