08/07/09 12:32:42
**** 関連スレッド案内 ****
■ AWT と Swing は --
Java低速GUI Swing 7
スレリンク(tech板)l50
■ SWT は --
Java 高速GUI SWT 3
スレリンク(tech板)l50
■ NTT DoCoMo の iモード携帯電話用 Java (iアプリ) は --
iモード携帯電話用Java(iアプリ) Part18
スレリンク(tech板)l50
■ DoCoMo 以外は --
CLDC+MIDP+携帯電話用Javaスレッド part 8
スレリンク(tech板)l50
■ 課題・宿題は --
★★ Java の宿題ここで答えます Part 65 ★★
スレリンク(tech板)l50
**** 開発環境が必要の場合は ****
■ J2SE 1.4.0
URLリンク(sdc.sun.co.jp)
■ J2SE 5.0 (1.5.0)
URLリンク(java.sun.com)
■ Java SE 6
URLリンク(java.sun.com)
**** 実行環境だけが必要の場合は ****
■ Java ソフトウェアのダウンロード
URLリンク(www.java.com)
3:デフォルトの名無しさん
08/07/09 13:28:24
初心者質問ですいませんが本に書いていないので教えてください。
C:\Users\Documents\Hoge\src\pkgcui\Cui.java
こういう階層にパッケージpkgcuiに入ったCui.javaがあるとします。
この時カレントディレクトリがC:\Users\Documents\Hoge\srcだとすると
javac pkgcui\Cui.java
java pkgcui.Cuiで実行できますが、
カレントディレクトリが
C:\Users\Documentsだとすると
javac Hoge\src\pkgcui\Cui.javaで、
javaコマンドの方の指定の仕方はどうしたら良いのでしょうか?
4:デフォルトの名無しさん
08/07/09 13:34:36
java -classpath Hoge\src pkgcui.Cui
5:デフォルトの名無しさん
08/07/09 13:45:29
前スレ999さんへ
これはアドベンチャー用のプログラムなんでswicthは必須です。
前すれ998さんへ
while(true){
int pa = s.nextInt();
のsはどこからもってきましたから?
できればこれらのプログラムをサープレットで書いて欲しいのですが。
6:デフォルトの名無しさん
08/07/09 13:50:16
>>5
> のsはどこからもってきましたから?
ブラウザでも、テキストエディタでも、検索してみたら?
7:デフォルトの名無しさん
08/07/09 13:56:47
>>4
てっきりclasspathってmain以外のクラスを探すためのもので
mainはjava .\Hoge\src\pkgcui.Cuiとか出来るのかと思ってました…。
ありがとうございます、本当に感謝です!
8:デフォルトの名無しさん
08/07/09 14:38:50
教えてくれ五飛!
俺はJAVAをあと何回実行かければスイッチを使った引き算ができるようになるんだ!
教えてくれ五飛!
俺はあと何日で
死ぬんだろうか。
9:デフォルトの名無しさん
08/07/09 14:58:16
トムキャットプロジェクトだとcontext.xmlがプロジェクトごとに生成されないのですが、自分で追加すれば動作してくれるのでしょうか?
それともserver.xmlに記述しなければいけないのでしょうか?
10:デフォルトの名無しさん
08/07/09 15:25:06
やはり2週間弱でJAVAでアドベンチャーが作れるのにどこも雇ってくれないのは、勤務地のせいか。
おい福田、さっさと横須賀の方にプログラムの会社を作りやがれ!
サミットばかりやってないで自分の国民を防衛しろ!
いざとなった時国民の信頼が無いと日本潰れてしまうよ。
11:デフォルトの名無しさん
08/07/09 15:48:58
既に手遅れですから次々世代くらいに期待しましょう
敗者復活は王道
12:デフォルトの名無しさん
08/07/09 18:59:39
Threadクラスを継承したクラスA内のrunメソッドでsleep(1000)で1秒ほどスレッドをとめている間に、
そのAの他メソッドを使うとInterruptedExceptionとかの例外が出ますか?
13:デフォルトの名無しさん
08/07/09 19:07:49
>>12
InterruptedExceptionのマニュアルを読みなさい。
14:デフォルトの名無しさん
08/07/09 19:59:22
>>12
interruptメソッドを使うとInterruptedExceptionが出ます
15:デフォルトの名無しさん
08/07/09 23:43:42
ArrayListの中身に意図しない書き換えが起こり、困っております。
APIを見たところ、同期化されないから注意しろ、的な文章を見つけたのですが
複数スレッドを使うようなプログラムを意図的に書いてはいません。
ためしにAPIに書いてあった
List list = Collections.synchronizedList(new ArrayList(...));
の形で定義してみても、結果は変わりませんでした。
言葉だけだと説明が難しいので、サンプルのソースを次に記入します。
データベースから取得した口座の残高に100円追加するソースです。
16:15
08/07/09 23:44:23
private void zandaka_keisan(){
ArrayList<Koza> KozaList_before = new ArrayList<Koza>(4000);
ArrayList<Koza> KozaList_after = new ArrayList<Koza>(4000);
//データベースから配列の形状で口座たちを取得します
KozaList_before =dba.selectKoza("条件");
Koza kz = new Koza();
int zandaka = 0;
//取得件数分繰り返し
for(int j=0 ; j<KozaList_before.size() ; j++){
kz = KozaList_before.get(j);
zandaka = kz.getZandaka() + 100;
koza.setZandaka();
//↑この行が終了すると、KozaList_beforeの中身のkozaに100円足されてしまいます。
//本当は、KozaList_afterにだけ計算結果を格納したいです。
KozaList_after.add(j, kz);
}
}
17:15
08/07/09 23:45:03
インスタンス化する口座クラス。単にゲッターとセッターがあるだけです。
public class Koza {
private int zandaka;
koza(int zandaka){
this.zandaka = zandaka;
}
public void setZandaka(int zandaka){
this.zandaka = zandaka;
}
public int getZandaka(){
return zandaka();
}
}
18:15
08/07/09 23:47:58
インデントが解除され見がたくなり申し訳ないです。
何か、根本的な勘違いをしているのかも知れません。
ヒント等分かる方、よろしくお願いいたします。
19:デフォルトの名無しさん
08/07/09 23:53:48
>>18
>koza.setZandaka();
の行が通らなくね?
20:デフォルトの名無しさん
08/07/09 23:54:06
>>16
まて。それは本当にコンパイルが通ってるコードのコピペなのか?
いろいろとおかしいだろう。
> Koza kz = new Koza();
これに何か意味があるのか? ループの中で潰されてるが。
> koza.setZandaka();
kozaなんて変数は定義されてないぞ。
あと、setterなのに何で引数がないんだ。
21:15
08/07/09 23:58:36
大変失礼致しました。
ソースは目視のみの確認でしたので、出直してきます。
22:15
08/07/10 00:16:15
コンパイルしました。(dba.selectKoza("条件");は質問用なのでエラーになりますが・・・)
import java.util.*;
public class Sitsumon {
private void zandaka_keisan(){
ArrayList<Koza> KozaList_before = new ArrayList<Koza>(4000);
ArrayList<Koza> KozaList_after = new ArrayList<Koza>(4000);
DbAccess dba = new DbAccess();
//データベースから配列の形状で口座たちを取得します
KozaList_before =dba.selectKoza("条件");
Koza kz = new Koza();
int zandaka = 0;
//取得件数分繰り返し
for(int j=0 ; j<KozaList_before.size() ; j++){
kz = KozaList_before.get(j);
zandaka = kz.getZandaka() + 100;
kz.setZandaka(zandaka);
//↑この行が終了すると、KozaList_beforeの中身のkozaに100円足されてしまいます。
//本当は、KozaList_afterにだけ計算結果を格納したいです。
KozaList_after.add(j, kz);
}
}
}
23:15
08/07/10 00:16:55
public class Koza {
private int zandaka;
Koza(int zandaka){
this.zandaka = zandaka;
}
Koza(){
this.zandaka = 0;
}
public void setZandaka(int zandaka){
this.zandaka = zandaka;
}
public int getZandaka(){
return zandaka;
}
}
24:デフォルトの名無しさん
08/07/10 00:17:18
KozaList_beforeに入っているKozaインスタンスが、どこでもコピーされ
てなさそう。KozaList_before.get()で取り出したインスタンスと
KozaList_after.add()で追加したインスタンスは同じものだよ。
25:デフォルトの名無しさん
08/07/10 00:18:53
>>20
解読ありがとうございます。
> Koza kz = new Koza();
これに何か意味があるのか? ループの中で潰されてるが。
ループの前に、kozaのインスタンスを用意したつもりです。
26:デフォルトの名無しさん
08/07/10 00:22:21
>25
Kozaインスタンスは倍の数に増えて欲しいのに、newが1回だけし
かないことを疑おう。
27:デフォルトの名無しさん
08/07/10 00:27:59
>>24
>>25
アドバイスありがとうございます!
計算前のKozaインスタンスと、計算後のKozaインスタンスを
それぞれ別に用意してあげる必要があるという事ですね。
Java・・・難しいです・・・・。
28:デフォルトの名無しさん
08/07/10 00:29:10
27訂正
>>24
>>26
です。
29:デフォルトの名無しさん
08/07/10 00:53:22
前スレの982です。
>>983
懇意にさせていただいているお客さんから、とある小システムを
ベンダが手を引くから引き継いでくれ。良い悪いを評価して、
悪い部分は直す良い提案をして貰えれば、悪いようにはしない。
(儲けが出るように発注する)
と言われています。
規模が小さいのでウチとしては絶対取りたいとかそういう
訳ではないですけど(営業サイドの思惑から)、今まで/今後の
つきあいもありますので、無碍には出来ないし、というところです。
>>982
FingBugといのは使ったことが無いので、ちょっと調べてみます。
情報ありがとうございます。
他にこういうのはどうよ、というのが有れば教えていただけると
助かります。
30:デフォルトの名無しさん
08/07/10 00:57:44
「JCEのSecretKeyって、外部的に同期化する必要はありますか?」
Web系で、全リクエストで共通の鍵を使用します。
オンライン中にパスワードは通常変更されません。
暗号化の目的は、ブラウザに保存されるCookieをユーザから不可視にするためです。
JDKは1.4.2です。
現在↓こんな感じでSecretKeyを作成しています。
#記憶を元に書いているので間違ってたらスミマセン
##全角スペースでインデントしているのは御愛嬌
参考にしているのはこの辺りです。
URLリンク(www.trustss.co.jp)
private static SecretKey generateSecretKey(String password) {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(password.getBytes());
byte[] passwordDigest = messageDigest.digest();
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
return secretKeyFactory.generateSecret(new DESKeySpec(passwordDigest));
}
続きます
31:デフォルトの名無しさん
08/07/10 00:58:15
続きです
暗号化/復号化はこんな感じです。
this.passwordはコンストラクタで初期化されています。
public String encrypt(String plain) {
byte[] bytes = plain.getBytes();
SecretKey secretKey = generateSecretKey(this.password); // XXX 毎回作るの?
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return encode(cipher.doFinal(bytes)); // Cookieに保存するためBase64でエンコードして戻す
}
public String decrypt(String crypted) {
byte[] bytes = decode(crypted); // さっきのBase64をデコードする
SecretKey secretKey = generateSecretKey(this.password); // XXX synchronizedにすれば毎回作る必要はないけどね…
Cipher cipher = Cipher.getInstance("DES");
chiper.init(Cipher.DECRYPT_MODE, secretKey);
return new String(chiper.doFinal(bytes));
}
Cipherはともかく、変更されない鍵までリクエストのたびに作るor同期化するっていうのは
イマイチ感が漂うのですが…
そもそもインスタンスが不変であれば同期は要らない気もしています。
どちらにせよ言及している文書が探しきれていないので、「ここ読め」とかでも結構です。
よろしくお願いします。
32:デフォルトの名無しさん
08/07/10 01:07:37
>>30-31
何を聞きたいのかわからない。「外部的に同期化」て意味不明。
33:デフォルトの名無しさん
08/07/10 01:20:22
>>32
うう~ん、あまり一般的な言い方ではないんですかね。
Sunのドキュメントとか見てると結構出てくる表現なんですが…
URLリンク(www.google.co.jp)
要はライブラリなんかが複数スレッドから同時に呼ばれるときに、
ライブラリ側でマルチスレッド環境を考慮していない場合なんかだと
内部的に保持しているメンバ変数の値が不整合になっちゃう場合があって、
だから呼び出し元がsynchronizedで呼んでやることで単一スレッドのみからの
アクセスを保障するようにプログラムを書くことです。 >「外部的に同期化」
さっきのサンプルでいうと、encryptやdecrptのメソッドをsynchronized宣言してやることで、
「外部的に同期化する」対応を行うことになります。
ただ、ライブラリ側で対応していたり、>>31で言及したようにそもそもインスタンスが不変であれば、
内部変数の値が不整合となることもないのでsynchronizedがいらないのではないかと思い、
それについてのドキュメントはありませんか?という意味で質問しました。
34:デフォルトの名無しさん
08/07/10 01:22:12
>>25
そのインスタンスが使われることなく、
> kz = KozaList_before.get(j);
で捨てられていることは理解しているか?
35:30
08/07/10 01:25:40
>>32
ごめんなさい。
こっちのリンクのほうがよかったですね。
URLリンク(www.google.co.jp)
わかりにくくて申し訳ありません。
36:デフォルトの名無しさん
08/07/10 01:43:15
>>33
10年以上Javaを触ってるけど、「外部的に同期化」って初めて聞いたよ。
で、1つのSecretKeyを複数のスレッドのCipherから利用したことあるけ
ど、問題が出たことないです。ドキュメントがあったわけじゃないから、
問題が起きないという保証はないですね。本質的に内部状態を持つよう
なインスタンスじゃないから、大丈夫だと思うけど。
もしそういうドキュメントを見付けられなくて、パフォーマンスを上げ
たいなら、SecretKeyとCipherのペアを貸し出し&返却するようなキャッ
シュ機構を作ればかなり効果があるです。
37:デフォルトの名無しさん
08/07/10 02:30:52
お聞きしたいことがあります。
アプリケーション組み込み向け(もしくは組み込み可能な)のJVMというのはあるのでしょうか?
以前に見た Unity という3D Game Engineがmonoを使って.NETをスクリプトエンジンとして使っていました。
UNITY: Overview
URLリンク(unity3d.com)
これのJavaVM版のようなことがしたいと考えております。
主にWindowsで動作ができればと考えております。
38:デフォルトの名無しさん
08/07/10 02:34:37
>>36
ありがとうございます。
# 不特定多数の場所では用語の使い方には注意しなければいけませんね。今後は気をつけます。
> ドキュメントがあったわけじゃないから、問題が起きないという保証はないですね。
> 本質的に内部状態を持つようなインスタンスじゃないから、大丈夫だと思うけど。
正にその辺りが問題で、イケそうでイケないもどかしさが元となって質問に至った次第です。
「JCEは結局インターフェースの規定であって、SecretKeyについてのマルチスレッド環境下での
動作はドキュメント化されていない。故にその動作は実装依存であり、たとえSUNから提供されているJARが
スレッドセーフであった(ことをリバースコンパイル等の手段を用いて実証した)としても、
仕様化されていない以上、将来のリリースでは変更される可能性がある。」
ということがハッキリしているのであれば、防御的にsynchronizedに倒すという結論に至れるのですが、
現在は、そのための判断の材料を探している段階です。
(SUNからJREと一緒に配布されているJARは、あくまでJCEの規格の一実装という位置づけですよね?)
当然、本当にそこまで仕様に対する厳密な判断が必要なのかという議論も別にあると思います。
また、性能に対してどれだけのペナルティがあるのかによっても、結論は変わると思っています。
# まあ面倒だから同期化にして終了としたい自分もいる訳ですがwww
> SecretKeyとCipherのペアを貸し出し&返却するようなキャッシュ機構
・ペアを幾つか作っておき、貸し出し・返却動作のみを同期処理とする
・ペアが全て貸し出しになった場合のみ、新たなペアを作成して貸し出す
ようなイメージで合ってますか?
確かに、これならば同期、鍵の生成部分は最小限で済むかもしれませんね。
サーブレットのスレッド数とあわせておけば、新たなペアの作成も不要となるような気もします。
ありがたく参考にさせて頂きます。
39:デフォルトの名無しさん
08/07/10 08:19:54
質問です。
例えば、クラスXでクラスYのインスタンスを生成したとして、
クラスY内のフィールドの変化をクラスXで監視する方法って無いでしょうか?
(フィールドの値を取得するのではなく、actionListenerのように変化に反応するような仕組みということです)
あるいはクラスXかYでstaticフィールドを作り、それの変化を監視するという方法は無いでしょうか?
40:デフォルトの名無しさん
08/07/10 10:34:31
JAVAの乱数についての質問です。
int ran = rnd.nextInt() % 100;
で0~100までの値をranに数字をランダムで入れるまではわかるのですが、
50~100までの値をranに数字をランダム入れるが分かりません。
ご提示お願いします。
41:デフォルトの名無しさん
08/07/10 10:41:37
0~50までの乱数を出してそれに50足した値をranに入れればいいよね。
42:デフォルトの名無しさん
08/07/10 10:42:38
>>39
PropertyChangeListener とか、Observer と Observrable とか
>>40
ran = rnd.nextInt(50) + 50;
で、50 <= ran && ran < 100 になる。
43:デフォルトの名無しさん
08/07/10 10:50:07
最低値足せば良いだろ。算数の問題だ。
44:デフォルトの名無しさん
08/07/10 10:52:38
>>39
Yが監視できるように作られてないとだめ。
クラスYを自前で実装するなら、
変更時にイベント通知するように実装する。
Observerパターン。
Observableとか、PropertyChangeSupportとか使えばすぐ実装できる。
Yが誰かが作ったいじれないクラスで、通知機能がない場合、
フィールド操作がセッタでしっかり実装されてるなら、
セッタをオーバーライドしてなんとかできる。
ソース見れないとか、セッターなしでいろんなタイミングで操作されてるとかなら、
どうにもならない。非同期でいいなら、一定時刻毎に値をチェックする。(ポーリング)
45:デフォルトの名無しさん
08/07/10 11:06:51
>>43
足したら除々に足されていくのがプログラム。
46:デフォルトの名無しさん
08/07/10 11:13:49
>>45
昨日いたな。そんなバカ。
47:デフォルトの名無しさん
08/07/10 11:43:55
質問です
Windowsでjava6でJDBC使うアプリ作ってます。
通常、整数データは何も考えずintにしてましたが、
DBのデータ容量を考えると、不必要な桁数をもつカラムは、SMALLINTやTYNYINTで
定義した方がよさげかな、と思いました。
で、Java側のソースは、数値の取りうる範囲は自前でチェックしているので
別にintのまま、setInt()でも動くのですが、どうせJDBC側でキャストなどして
時間が掛かるだろうと思い、shortやbyteを使う事を検討しています。
shortにしてsetShortを使えばキャストは必要なくなりますので速いと思うのですが、
しかし、通常のjava側の計算処理において、shortでの計算などをがりがりやる事になりますが
暗黙の型変換などがあるので、ここでかえって時間が掛かるのではないかと危惧しています。
性能論議は実測が基本というのは分かっていますが、変更箇所も膨大ですので、変更前に
short化は意味があるかどうか、多少でもアドバイス頂ければと思います。
よろしくお願いします。
48:デフォルトの名無しさん
08/07/10 11:57:30
普段はintで計算して、setするときだけshortやbyteにキャスト、でいいんじゃないか
49:デフォルトの名無しさん
08/07/10 12:30:24
>>48
すみません!目から鱗でした!それで行きます
でも、考えるとますます、Javaにおけるshortなどの存在意義が無いですよね
なぜ暗黙の型変換でintにするような仕様を入れたのでしょうかね
50:デフォルトの名無しさん
08/07/10 12:55:46
log4jですみません。infoとerrorで別ファイルにログを出力したいのですが
log4j.xmlの設定がわかりません。
下記のように設定しているのですが両方infoのほうに出てしまいます。
どこを修正すればよいでしょうか?
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='URLリンク(jakarta.apache.org)'>
<appender name="ERROR" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="c:\\hoge\\log\\hoge_error.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy/MM/dd HH:mm:ss} %p:%c:%m:%n" />
</layout>
</appender>
<appender name="TRACE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="c:\\hoge\\log\\hoge_trace.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy/MM/dd HH:mm:ss} %m%n" />
</layout>
</appender>
<category name="common">
<priority value="error" />
<appender-ref ref="ERROR" />
</category>
<category name="common">
<priority value="info" />
<appender-ref ref="TRACE" />
</category>
</log4j:configuration>
51:デフォルトの名無しさん
08/07/10 12:56:42
>>46
それは障害者の人を軽蔑することになるぞ。
その件はインポでnullを宣言したら普通に足せました。
52:デフォルトの名無しさん
08/07/10 13:08:35
>>51
まさか本人は恥ずかしくて二度と顔を出せまい
53:デフォルトの名無しさん
08/07/10 14:35:41
>>52
本人ですが何か?
ってかネット上で『羞恥心』はねえだろ。
54:デフォルトの名無しさん
08/07/10 14:52:01
>>53
( ´,_ゝ`)プッ
55:デフォルトの名無しさん
08/07/10 15:28:21
>>50
フィルタをかけるらしい
URLリンク(rg550.hp.infoseek.co.jp)
56:デフォルトの名無しさん
08/07/10 17:13:25
宿題スレから誘導されてきました。
現在、swingを利用したGUIプログラムを作成しています。
catchブロックで例外を捕らえた場合は、
そのエラー内容を表示しろとのことなのですが、
これはJOptionPane.showMessageDialogで表示したほうがよいのか、
System.out.printlnで表示したほうがよいのか、
一体どちらなのでしょうか。
System.out.printlnだと、開発環境から起動しなかった場合に、
内容を確認できないと思っています。
57:デフォルトの名無しさん
08/07/10 17:35:10
どっちでもいい
仕様、案件、状況などに応じて適当なのを選べ
あとエラーはSystem.outよりSystem.err
58:デフォルトの名無しさん
08/07/10 17:43:09
了解しました。
ありがとうございます。
59:デフォルトの名無しさん
08/07/10 22:47:33
InetAddress ia=InetAddress.getAllByName("www.yahoo.co.jp");
System.out.println(ia.getHostAddress());
これを現時点で実行すると13個のIPアドレスが表示されますが、
これはwww.yahoo.co.jpのホスト名を13台のPCが持っているということなのか、
www.yahoo.co.jpのホスト名を持つ一台のPCが13個のIPアドレスを持っているということなのかどちらなのでしょうか?
またこのような1ホスト名:複数IPというのは前者の場合は分散化によるメリットが考えられますが、
後者のように一台のPCが複数のIPアドレスを持つことは何の意味があるのでしょうか?
60:59
08/07/10 22:49:01
意味不明なこと書いてしまった…。
こっちです。
InetAddress ia[]=InetAddress.getAllByName("www.yahoo.co.jp");
for(int i=0;i<ia.length;i++)
System.out.println(ia[i].getHostAddress());
61:デフォルトの名無しさん
08/07/11 00:14:14
Linux環境でJavaMailを使ってメール送信機能を実装したいのですが
JavaMailってSendMailが立ち上がってる必要があるのでしょうか?
それともSendMailなしでも単体で送信可能なのでしょうか?
62:デフォルトの名無しさん
08/07/11 00:19:40
>>59
javaと関係なく、DNS 関係を知ることを進める。
一台が複数のアドレスを持てれば、IP毎にマシンを用意しなくてすむ。
63:デフォルトの名無しさん
08/07/11 00:24:47
>>61
必ずしも *SendMail は* 必要無いが、*SendMail に代わるもの* が
動いている必要がある。
でなければそもそもメールが流れないことになるだろう。
64:デフォルトの名無しさん
08/07/11 00:33:29
どうもです、
>>63
試しにプロバイダのSTMPサーバーをメールサーバーに指定して
プログラムを動かしてみたのですがなぜか/var/log/maillogに
ログが出力されているのですがSendMailを使っていなくても
SendMailに中継されてたりするのでしょうか?
65:デフォルトの名無しさん
08/07/11 01:23:55
初めまして、インクリメントにつて質問なのですが
class Sample4_6
{
public static void main(String args[])
{
int a = 0;
int b = 0;
b = ++a;
System.out.println("代入前にインクリメントしたもので、bの値は、" + b + "です。");
}
}
結果が、”代入後にインクリメントしたもので、bの値は、1です。”
次に
class Sample4_6
{
public static void main(String args[])
{
int a = 0;
int b = 0;
b = ++a;
System.out.println("代入後にインクリメントしたもので、bの値は、" + b + "です。");
}
}
結果が、”代入後にインクリメントしたもので、bの値は、0です。”
66:デフォルトの名無しさん
08/07/11 01:24:56
訂正
後者は、”b = a++; ”です
67:65-66
08/07/11 01:28:14
ここで、疑問なのですが
結果的には、"1"になるはずなのに
どうして、後者が"0"なのか理解できません
出力される前に値がインクリメントされていないからでしょうか?
68:デフォルトの名無しさん
08/07/11 01:34:18
>>67
sysoutで言ってるじゃマイカ
>代入後にインクリメントしたもので、bの値は、0です。
結果的に 1 になるのは代入した b じゃなくインクリメントした a だろう
69:デフォルトの名無しさん
08/07/11 01:36:09
>>67
nt a = 0;
int b = 0;
b = a++;
これのbがなんで0かってこと?
>代入後にインクリメントしたもので
それなら理由は自分で書いてるとおりだけど。
70:デフォルトの名無しさん
08/07/11 01:46:41
int a = 0;
if ( ++a == 1 ) 適当な表示
if ( ++a == 2 ) 適当な表示
71:デフォルトの名無しさん
08/07/11 01:48:28
if ( ++a == 1 ) 適当な表示
if ( a++ == 2 ) 適当な表示
72:デフォルトの名無しさん
08/07/11 01:55:13
int a=0;
System.out.println(a);
System.out.println(a++);
System.out.println(a);
System.out.println("---");
a=0;
System.out.println(a);
System.out.println(++a);
System.out.println(a);
73:65-66
08/07/11 02:11:57
ひ~難しい。。。
考えても混乱します・・・・
74:デフォルトの名無しさん
08/07/11 07:20:15
b = a++;
は
b = a;
a++;
と等しい
75:デフォルトの名無しさん
08/07/11 09:13:03
>>74
インクリメントを使わずに書いた方がより分かり易くならないか?
b=a++; → b=a; a=a+1;
b=++a; → a=a+1; b=a;
76:デフォルトの名無しさん
08/07/11 09:44:07
Eclipseにあるプログラムをもってきて、
インポートすると、
Classはraw型です。総称型Class<T>への参照は、
パラメータ化する必要があります。
という警告がでます。
警告は
java.lang.Class hoge;
のような宣言部分で出てます。
とりあえず、よく分からず適当に、
java.lang.Class<?> hoge;
としたら、警告は無くなったんですが、
こんな対応でいいか教えてください。
77:デフォルトの名無しさん
08/07/11 11:11:56
いいんじゃないの
78:デフォルトの名無しさん
08/07/11 15:47:00
JDBCを利用したプログラミングで苦戦しています。
insert文の実行にて、
stmt.executeUpdate("INSERT INTO mytable VALUES(10, 20)");
のようにするのではなく、
stmt.executeUpdate("INSERT INTO mytable VALUES(a, b)");
のように変数の値を追加したいのですが指定の方法がわからない状態です。
いろいろと調べてみたところ、${}でいけるような情報があったのですが、
それでも上手くいかない状態です。
変数の値を反映させるには、どうすればよいのでしょうか。
79:デフォルトの名無しさん
08/07/11 16:33:46
変数の前でダブルクウォーテーションをきればいい
普通の文みたいに+でつなげばよろし
80:デフォルトの名無しさん
08/07/11 16:39:08
補足
stmt.executeUpdate("INSERT INTO mytable VALUES(a, b)");
じゃなくて
String str="INSERT INTO mytable VALUES("+a+","+ b")";
stmt.executeUpdate(str);
にしてみては
携帯で急いで打ったからどっかちがうかも
81:デフォルトの名無しさん
08/07/11 16:55:44
IF文の条件を以下のようにしたいのですが書き方がわかりません。
教えてください。
String型のaのときは
int型のaを返す
82:デフォルトの名無しさん
08/07/11 16:58:32
教えていただいた方法でうまくいきました。
79,80さん、ありがとうございました。
83:デフォルトの名無しさん
08/07/11 17:04:28
>>82
SQL injectionとかあるからプリペアードステートメントがいいよ
URLリンク(www.atmarkit.co.jp)
84:デフォルトの名無しさん
08/07/11 17:15:31
>>81
aは変数? そのaの型は何なんだ?
85:デフォルトの名無しさん
08/07/11 17:24:12
プリペアードステートメントを使うと、SQL文の解析を毎回行わずに済むようですね。
変数の値が固定である場合には、利用できそうです。
参考になる情報、ありがとうございました。
86:デフォルトの名無しさん
08/07/11 17:28:49
今夜分かるSQLインジェクション対策
URLリンク(www.atmarkit.co.jp)
87:デフォルトの名無しさん
08/07/11 17:32:12
>>85
> 変数の値が固定である場合には、利用できそうです。
?
どう言うこと?
88:デフォルトの名無しさん
08/07/11 17:38:26
まあ、今時SQL文を+でつないでるようじゃ
プロ失格でしょ。
89:デフォルトの名無しさん
08/07/11 18:05:06
どうだろ。
ユーザによる検索なんかも、幾つも作っておくもの?
項目の組み合わせの変わる場合も?
90:デフォルトの名無しさん
08/07/11 18:13:44
>>85
違う。変数で渡す場合はプリペアードステートメント必須。
もし使ってないコードが納品されたら問答無用で突っ返す。
91:デフォルトの名無しさん
08/07/11 18:18:51
>>89
SQL自体は動的に組替えても、その中に外部から来るデータは含めない。
要は、プリペアードステートメントを含むSQLを組み立てて、それに外部
から来るデータを渡す。
DBやDBコネクタにバグがある可能性もある(特にマルチバイト文字)から、
100%安心できるわけではないが、少なくとも自分の担当範囲で脆弱性を
埋め込む可能性は減らせる。
92:デフォルトの名無しさん
08/07/11 18:24:38
プレースフォルダのパラメータは使いたいがPrepareしないという選択肢はなかったんだっけ?
JDBCじかは最近やってないから忘れてしまってる。
93:デフォルトの名無しさん
08/07/11 18:41:09
切実に困ってます…
メニューのボタンに触れるとサブナビゲーションが横にスクロールして出てきて、
マウスをボタンから離すとサブナビゲーションが元に戻る、というスクリプトはどのようにすればいいのでしょうか。
超初心者で、探してみたんですが、そういった方法の名称もわからないので見つけることができませんでした。
どなたか教えて頂けませんでしょうか。
94:デフォルトの名無しさん
08/07/11 18:46:24
>>93
>スクリプト
javascript? だったらすれ違い。
95:デフォルトの名無しさん
08/07/11 18:49:54
>>94
そうでしたか。
それではそっちで聞いてみます。
ありがとうございました
96:デフォルトの名無しさん
08/07/11 18:53:28
>>91
なるほどね
97:デフォルトの名無しさん
08/07/11 22:40:56
質問です。
Windowsをメインに考えているのですが、javaの暗黙の型変換にはやはりコストが
掛かるものと考えておいたほうが良いのでしょうか?
たとえばメソッドの、boolean method(int i){return i >10;} とboolean method(short i){return i >10;} は
全く同じバイトコードにコンパイルされますが、これでもやはり実行時にJVM内部で変換のコストが
発生しているのでしょうか?
98:デフォルトの名無しさん
08/07/11 22:44:05
言葉足らずですみません。
バイトコードの1行目が、
0 iload_1 [i]
なのですが、つまり、ここにshortの変数をぶち込んだ時に、
内部でintへの変換が発生すると思うのですが
そういう認識であってますでしょうか?
99:デフォルトの名無しさん
08/07/11 22:52:51
>>97-98
コストはかかっているのかもしれないが、1つインスタンスをnewするコ
ストに比べたら何十万分の一とかそういうレベル。
100:デフォルトの名無しさん
08/07/12 00:18:57
質問です
"if
else if
else if
else"
と
"if
if
else
else
else"
は、同じ意味なのでしょうか?
101:デフォルトの名無しさん
08/07/12 00:20:45
>>100
2つ目はコンパイルエラーなんじゃ。 if () { } 括弧をつけてきちんと書いてみなされ。
102:100
08/07/12 00:30:18
レス、ありがとうございますが・・・
????
103:デフォルトの名無しさん
08/07/12 00:33:06
if と else は一対
104:デフォルトの名無しさん
08/07/12 00:35:25
>>100の質問の意味はかりかねる。実は文字列の比較をしたいだけでは " とか付いてるし。
105:100
08/07/12 00:37:33
>>103->>104
はい、この二つの文法は意味が同じか訊きたいのです。
106:デフォルトの名無しさん
08/07/12 00:40:56
どう考えたら同じに思えるんだ。
107:101
08/07/12 00:42:11
if () {
} else if {
} else if {
} else {
}
と
if () {
if () {
} else {
}
else // なんだよこれ
} else {
}
108:デフォルトの名無しさん
08/07/12 00:45:39
FileFilterについて質問します。
ファイルを開くときにフィルタを適用して、拡張子による選別は実現できたのですが、
保存のときにフィルタを適用することができません。
例えばメモ帳などでデータを保存するときに、ファイルの種類をテキストタイプに指定すれば
ファイル名にわざわざ拡張子.txtを入力せずともテキストファイルの保存ができると思いますが、
このような機能を実現するには、自分で処理部分を実装するしかないのでしょうか?
109:デフォルトの名無しさん
08/07/12 01:11:18
>>108
FileFilterと何が関係あるのかわからない。
ユーザにファイル名を入力してもらったら、filename + ".txt" ってや
るだけでは?
110:デフォルトの名無しさん
08/07/12 01:17:58
>>109
既に".txt"ってついている場合を分けなきゃな
111:108
08/07/12 01:25:53
メモ帳で保存した場合、ファイルの種類にテキストタイプを選択したあと、
ファイル名に"test.java"と入力して保存すると、javaファイルとして保存されるんです。
ファイル名から拡張子を抜き出すことは可能なのですが、条件分けに戸惑ってまして…
FileFilterを利用すれば面倒なことは勝手に処理してくれるのかな、と思ったのですが、
どうやらそうじゃないみたいですね。
112:100
08/07/12 01:40:29
>>106>>107
はぁーなるほど、訂正ありがとうございます。
学校の資料見ると、上記の二つの文は書き方が違うだけで
同じと書いてありましたので・・・・
113:デフォルトの名無しさん
08/07/12 01:43:35
>>112
学校の資料が間違っていたか間違って覚えてきたのか。
短いプログラムを書けば実証できるんだからナゼやってみない?
114:100
08/07/12 01:59:36
>>113
はい、やってみます。
サンクスですた。。。
115:デフォルトの名無しさん
08/07/12 02:07:40
>>111
何かを勘違いしていると思われる。
保存するファイル名がtest.txtだろうがtest.javaだろうが、ファイルの
中身は同じだよ? Windowsのエクスプローラがファイル名を見て「テキ
スト ドキュメント」とか種類を表示しているだけ。
116:115
08/07/12 02:11:54
あ、メモ帳の例が悪いだけかな。
たとえば画像処理するプログラムで、test.jpgならJPEGで保存、
test.bmpならBMPで保存、という感じに保存されるデータ自体が変わるケー
スもあるね。
そういうのは自分でコードを書かなきゃダメだ、もちろん。
117:108
08/07/12 03:08:51
無事解決しました。
意見していただいた方、ありがとうございました。
118:デフォルトの名無しさん
08/07/12 04:12:21
import java.io.*;
class Sample5_6
{
public static void main(String args[]) throws IOException
{
System.out.println("苗字を入力してください。");
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String str1 = "山田";
String str2 = "伊藤";
if(str1 == "山田"){
System.out.println("太郎が入力されました。");
}
else if(str2 == "伊藤"){
System.out.println("次郎が入力されました。");
}
else{
System.out.println("1と2を入力して下さい。");
}
}
}
119:118
08/07/12 04:15:18
これが、思い通りになりません
出力が
”山田”を入力したら”太郎”に
”伊藤”を入力したら”次郎”に
なるようにしたいのですが、
後者が、どうしても、”伊藤”と入力すると”太郎”が
出力されてしまいます
120:デフォルトの名無しさん
08/07/12 04:35:18
>>118
equals
つか、Javaで真っ先に習うことの一つのような気がするが……。
121:デフォルトの名無しさん
08/07/12 04:44:49
慣れるまでは結構やると思うけどね
122:118
08/07/12 04:48:57
equals
は、まだ習っていません・・・
できたら、ソースを訂正していただけないでしょうか・・・?
123:デフォルトの名無しさん
08/07/12 05:01:51
ていうかあれだな、strにキーボードで打った文字入れてるのに
if文で使ってないのは比較以前の問題だな。。。
とりあえずequalsは「java 文字列比較」で調べればいいよ
124:118
08/07/12 05:58:04
ありがとうございました
125:デフォルトの名無しさん
08/07/12 07:58:43
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import org.apache.struts.Globals;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.MappingDispatchAction;
public ActionForward select (ActionMapping map,
ActionForm form,
HttpServletRequest req,
HttpServletResponse res ) throws Exception{
DBManagement dbManager = new DBManagement();
ArrayList alTask = new ArrayList();
ServletContext scContext = servlet.getServletContext();
DataSource dsSource =(DataSource) scContext.getAttribute(Globals.DATA_SOURCE_KEY);
alTask = dbManager.selectData(dsSource);
req.setAttribute("input", alTask.toArray());
return map.findForward("index");
}
上記のコードがあります。selectメソッドの5行目や6行目では、newを使ってインスタンスを生成しています
が、次の行のservlet.getServletContext();ではインスタンスを生成しなくてもいきなり
servlet.getServletContext();という風にgetServletContext() メソッドを使えています。これは何故でしょうか?
ぐぐってもわからなかったので、ご教授いただければ幸いです。 どうぞ宜しくお願い致します。
126:デフォルトの名無しさん
08/07/12 08:35:06
>>125
select メソッドがあるクラスに servlet という フィールドは無いか?
もしくはそのクラスが extends しているクラスに servlet という protected か public なフィールドは無いか?
127:デフォルトの名無しさん
08/07/12 10:18:07
>>126
早速のレス有難う御座います。
私が見た限りでは、どちらもありませんでした。
なお、エクリプスで上記のコードを見ると、servlet.getServletContext() のservletだけ
青文字になっていたのでマウスのカーソルを当ててみたところ、
ActionServlet org.apache.struts.action.Action.servlet
Note: This element neither has attached source nor attached Javadoc and hence no Javadoc could be found.
と出ました。何かしらご教授いただければ幸いです。どうぞ宜しくお願い致します。
128:デフォルトの名無しさん
08/07/12 10:21:57
ActionServlet org.apache.struts.action.Action.servlet
org.apache.struts.action.Actionのservletだろ
129:デフォルトの名無しさん
08/07/12 12:45:37
>>99
ありがとうございました
130:デフォルトの名無しさん
08/07/12 13:09:30
>>128
レス有難う御座います。
ということは、インポートしたパッケージに含まれるオブジェクトは、newで
インスタンスを生成しなくてもいきなり使える、ということでしょうか?
131:デフォルトの名無しさん
08/07/12 13:29:27
>>130
public class LoginAction extends Action {
とかしてるんじゃないの?
132:デフォルトの名無しさん
08/07/12 13:38:41
>>131
レス有難う御座います。
いえ、public class ~Action extends MappingDispatchAction {
になっています。なにかご教授いただければ幸いです。どうぞ宜しく
お願い致します。
133:デフォルトの名無しさん
08/07/12 13:48:21
>>132
MappingDispatchActionは、Actionのサブクラスなのでは?
134:デフォルトの名無しさん
08/07/12 14:10:05
>>130
インスタンス変数と継承の関係について理解が足りない。
135:デフォルトの名無しさん
08/07/12 15:39:11
最近Javaを始めたものですが、以前にC++を扱っていた人が
「JavaでGUIを作る気になれない」
といっていたのを思い出しました。
どちらが優れてるか等の議論はしませんが、それぞれのメリット、デメリットを教えていただけないでしょうか?
136:デフォルトの名無しさん
08/07/12 15:59:38
JAVAで二重起動を検出する標準的な方法などは、あるものでしょうか。
URLリンク(oshiete1.goo.ne.jp)
この手順のような、解放処理を登録せずに実装できる方法を探しています。
137:デフォルトの名無しさん
08/07/12 16:09:38
>>136
そこに書いてある、解法処理を登録する奴が一番標準的
138:デフォルトの名無しさん
08/07/12 16:23:20
なるほど、そうでしたか。
この解放処理をWindowAdapterクラスを継承したクラスの
windowClosingで処理するという方法はありでしょうか。
試した限りでは、上手く動作しているのですが。
139:デフォルトの名無しさん
08/07/12 16:32:20
>>138
java.lang.Runtime#addShutdownHook(java.lang.Thread) 使ったほうが、
異常終了(例えば Windows の ctrl-c による強制終了とか)でも終了を捕捉できる可能性が高くなる。
必要ないならアリだと思う。
140:デフォルトの名無しさん
08/07/12 16:35:48
>>135
Java *だけで* ある簡単な GUI を作ってみて、
C++ *だけで* 同じ GUI を作ってみて、
比較してみたら何か分かるんじゃないか?
141:デフォルトの名無しさん
08/07/12 16:49:56
>>139
レスありがとうございます。
もう一度、検討しなおします。
142:デフォルトの名無しさん
08/07/12 17:25:47
>>135
OS
143:デフォルトの名無しさん
08/07/12 19:56:54
テキストエリア内の現在のキャレットの位置を(X行,Y列)で取得するにはどうしたらいいんでしょうか?
getCaretPosition()でオフセットを取得して、そこから(X行,Y列)への変換を試みたのですが、
うまくいきませんでした。
どなたか、御教示下さい。
144:デフォルトの名無しさん
08/07/12 22:14:08
>>143
やったこと無いけど、
getCaretPosition() を使った方法じゃダメなの?
145:デフォルトの名無しさん
08/07/12 22:14:37
swingでウィンドウを作ってみたんですがうまく行きません
OSはVistaの32bit、javaのヴァージョンはVersion 6 Update 7です。
コンパイルしたものを実行するとウィンドウは出てくるんですが
ボタンやテキストエリア等の中身が一切表示されません。
ウィンドウサイズを手動で変えると表示されます。
別のウィンドウをアクティブにしてから戻ると、
その別のウィンドウと重なった部分が消えてしまいます。
解決策はありますでしょうか。よろしくお願いします。
146:デフォルトの名無しさん
08/07/12 22:22:55
>>145
バリデートツリーとかリペイントとか?
Java低速GUI Swing 7
スレリンク(tech板)
147:デフォルトの名無しさん
08/07/12 22:32:14
>>145
ソースをこちらへ
URLリンク(rg550.hp.infoseek.co.jp)
148:デフォルトの名無しさん
08/07/12 22:33:26
>>145
swingの描画ぶっこわしてるんじゃない?
paintComponent()で描画してる?
149:143
08/07/12 22:34:43
>>144
getCaretPosition()でオフセットを取得したあと、値から
現在のキャレットの行と列の位置を判断する方法が思い浮かばないんです。
Hello|(←キャレット)
World
例えばこの位置でのオフセットの値は5になるんですが、この値から
行と列の位置(1,6)を判断する方法が思い浮かばなくて…
150:デフォルトの名無しさん
08/07/12 22:44:56
>>146-148
早々のレスありがとうございます。
スレ違いだったようで失礼しました。
paintComponent()というのを使っていないので
調べてみようと思います。解決しなければswingのスレか
ソースうpしてまた質問させてください。
ありがとうございました。
151:デフォルトの名無しさん
08/07/12 22:46:19
>>149
JTextArea ta;
として、
こんな?
int y =0;
int x =1;
int cnt = ta.getCaretPosition();
for(String s:ta.getText().split("\n")){
if(cnt<=s.length()){
y=cnt+1;
break;
}else{
cnt=cnt-s.length()-1;
x++;
}
}
152:143
08/07/12 23:09:48
>>151
ありがとうございます!
無事解決しました。
153:デフォルトの名無しさん
08/07/12 23:45:31
GUIおぼえなくちゃだめ?
154:デフォルトの名無しさん
08/07/13 00:01:05
netbeans使えば?
155:デフォルトの名無しさん
08/07/13 00:52:58
>>135
正直どっちでもいいよ。JavaでGUI作ってもC++で作っても
パフォーマンスの違いなんて昨今じゃそこまで広がらない
けど個人的にはC++のほうがなんかいいんだよなぁ~。。。なんでだろw
156:デフォルトの名無しさん
08/07/13 09:07:56
まぁ見た目ぐらいだな
157:デフォルトの名無しさん
08/07/13 09:28:55
GUIなんてプログラムの本質ではない
158:デフォルトの名無しさん
08/07/13 10:13:07
数年前、いらないMMX Penとか河童celの入ったPCでtomcatの実験をしてみたら
遅くて使い物にならなかったのでjavaの利用を諦めていたのですが
最近話題の激安鯖などはそこそこ使えますか?
159:デフォルトの名無しさん
08/07/13 10:45:02
CPUよりは、どっちかってーとメモリの問題だね。128MB程度では遅すぎる。
512MBくらいあればXPでも遊べるよ。
DBもリッチなIDEも全部入れるとなると、1GBくらいないときついけど。
160:デフォルトの名無しさん
08/07/13 12:31:49
私も初心者です。
やねう企画代表者やねうらお(本名・磯崎元洋)が
・ソフトウェアの不正コピーを行っていた
・労働契約上の違反をしていた
・他は不正コピーしていないことを証明しようとしてエロゲーのパッケージを発見し、
写真に撮ってアップロードしようとした。
URLリンク(d.hatena.ne.jp)
やねう企画の裏側(競馬の詐欺ソフトの製作現場)
URLリンク(d.hatena.ne.jp)
URLリンク(d.hatena.ne.jp)
URLリンク(d.hatena.ne.jp)
有限会社やねう企画(所在地・大阪府八尾市末広町2-1-2)が計画倒産
URLリンク(www.sia.go.jp)
やねうらおプロフィール
性格:友達から「チンピラ」「ヤクザ」と呼ばれている。前世で殺人鬼だった宿業を背負っているという妄想(自覚)あり。
最終学歴:専門学校卒
主な職歴:有限会社センキ(凌辱系アダルトゲームの製作会社)を経て独立、有限会社やねう企画を設立、2006年に計画倒産
代表作:『夜這いマニア』『盗撮マニア』『お楽しみCDシリーズ』『競馬詐欺ソフト』『BM98』
やねうらお語録
>「ワシのほうが潔癖やと思うんやけどな。
>絶対に違法コピーのソフトしか使わんし。
>たとえば強盗に入ったときに、ちょっとかわいそうになって
>十万円だけ残してったら、おかしいやろ?
>自分の『強盗する』という意思に対して矛盾やろ?
>だからワシは、一個も買ったソフトを使ったことがない!!」
161:デフォルトの名無しさん
08/07/13 12:35:16
substring(0,0)って使えるんですか
最初の一文字だけを取り出すケースが出てしまうものを作ろうとしているのですが・・・・・・
162:デフォルトの名無しさん
08/07/13 12:49:46
>>161
それは0文字じゃね
最初の1文字なら substring(0, 1)
163:デフォルトの名無しさん
08/07/13 13:23:55
普通にcharAtでよくね?
164:デフォルトの名無しさん
08/07/13 13:28:34
最近、やねうらおは弓月(>>160)とか言う真性のキチガイに絡まれている
【自作自演】弓月城太郎氏に関するまとめ【神秘体験】
URLリンク(d.hatena.ne.jp)
165:デフォルトの名無しさん
08/07/13 13:56:23
コピペ君って馬鹿だな、まで読んだ。
166:デフォルトの名無しさん
08/07/13 14:13:29
>>163
codePointAt
167:デフォルトの名無しさん
08/07/13 15:26:06
クラスの継承を使ったときに
スーパークラスではpublicなメソッドをサブクラスではprivateとして隠蔽したいときはどうすればいいですか?
例えばHashtableクラスを継承したMyHashtableを作って、#get(Object key)を使わせたくない、等です。
168:デフォルトの名無しさん
08/07/13 15:29:07
PS
継承ではなく委譲にして必要なメソッドだけ実装する
という方法はNGです
169:デフォルトの名無しさん
08/07/13 15:32:42
無理です
サブクラスはいつでもスーパークラスにキャストできるので、どっちみち無駄です
使わせたくないだけなら、オーバーライドして例外を投げる方法がなくもない
public Object get(Object key) {
throw new UnsupportedOperationException();
}
しかし継承より委譲の方が良いのではないか
170:デフォルトの名無しさん
08/07/13 15:37:56
しかしgetだけ封じても、iterator使えば列挙できるし、putやremoveすれば元の値が返ってくるし、
完全に値を取得できなくするのはなかなか面倒い気がする
171:デフォルトの名無しさん
08/07/13 15:43:33
継承でのアクセス修飾子の変更は特権を広げる方向だけなのでだめ。
隠したいメソッドを抜いたインターフェイスを準備して実装、
そのインターフェイスを通して操作するのはどう。
172:デフォルトの名無しさん
08/07/13 16:00:35
うーむ、やはり委譲ですかね・・・
どうもありがとうございました
173:デフォルトの名無しさん
08/07/13 16:25:29
>>167
そんなリスコフの置換原則を全力でぶっちするような設計は却下。
174:デフォルトの名無しさん
08/07/13 21:51:52
大人の事情で、仕方なくJavaの実装を行うことになりました
深入りしたくないので、C/C++で実装したDLLを使いたいのですが
可能でしょうか?
VS2005、C/C++職歴6年生です。
175:デフォルトの名無しさん
08/07/13 22:00:05
可能ですが、その大人の事情とやらが使わせてくれないかも
Javaアプリケーションは100%Javaで完結していることが好まれることがある
使っていいことになったら、JNIでぐぐれ
176:デフォルトの名無しさん
08/07/13 22:06:21
>>174
原理的にはやればできる。
お勧めはしないがするのはアンタだ。やりたいようにすればいい。
JNI使えば、Java側からC/C++の関数を呼び出したり
逆にC/C++側からJavaのオブジェクトにアクセスできたりできるので、
やりたいことは多分できるはず。
177:デフォルトの名無しさん
08/07/13 22:21:33
>>175
>>176
Thx
JNIまたは、DLLをJavaで書き直すか、今晩ゆっくりトレードオフを考慮し
月曜の朝決めます
178:デフォルトの名無しさん
08/07/14 00:06:23
少し前に二重起動に関して質問した者です。
二重起動の確認にFileOutputStreamを利用するのが一般的
ということなのですが、
この方法を使用するとロック用に使用しているファイルが
普通にWindowsファイルシステム上で確認できてしまいます。
これを確認できないようにするには、どうしたらよいのでしょうか。
179:デフォルトの名無しさん
08/07/14 00:09:23
普段あんまり確認しないような場所 (C:\Documents and Settings\username\Local Settings\Temp とか) を使えばいいのでは
180:デフォルトの名無しさん
08/07/14 00:27:48
レスありがとうございます。
確かにそうなのですが、ユーザーからすれば、
やはり気持ちのよいものではないと思い、
何か策はないかと考えてしまう次第です。
また、一時ファイルのパスのDocuments...の部分が、
vistaとxpで違うのが、厄介なところです。
う~ん...。
181:デフォルトの名無しさん
08/07/14 00:34:08
環境変数のtempから取る
182:デフォルトの名無しさん
08/07/14 00:39:24
レスありがとうございます。
早速、調べてきます。
183:デフォルトの名無しさん
08/07/14 00:58:32
次のようなコードで問題なく動作しました。
色々とありがとうございました。
stream = new FileOutputStream(new File(System.getenv("TEMP") + "\\lock"));
184:デフォルトの名無しさん
08/07/14 03:35:16
class SwitchSample
{
public static void main(String args[])
{
int cal = 100;
for(int i = 1; i<=5; i++){
switch(i){
case 1:
case 2:
cal = cal + i;
break;
case 3:
cal = cal - i;
break;
case 5:
cal = cal / 2;
break;
default:
cal = cal * 10;
}
System.out.println("カウント数は、" + i + "です。" );
}
System.out.println("計算結果は、" + cal + "です。" );
}
}
185:184
08/07/14 03:36:02
どうして、結果が500になるのかわかりません・・・
解説お願いします。
186:デフォルトの名無しさん
08/07/14 03:39:02
>>185
どうして結果が500にならないと思うのか分かりません。
187:デフォルトの名無しさん
08/07/14 03:41:27
どんな結果になると予想したのさ
i=1の時にswitch節はcase 1: に一致して、
breakが無いからcase 2: に書いてある cal = cal + i; が実行されるって分かってる?
188:184
08/07/14 03:45:47
cse1が、一回目の繰り返しですよね?100 + 1 = 101ですよね?
で、cse2が、二回目の繰り返しで、100 + 2 = 102
で・・・・・????????????
189:デフォルトの名無しさん
08/07/14 03:52:25
中級の本おしえて
190:デフォルトの名無しさん
08/07/14 04:02:07
>>184
初期値: 100
i=1: case 1 → 100+1=101
i=2: case 2 → 101+2=103
i=3: case 3 → 103-3=100
i=4: default → 100*10=1000
i=5: case 5 → 1000/2=500
結果: 500
191:184
08/07/14 04:41:16
>>190
レス、ありがとうございます。
疑問がまだあります、Breakで一旦抜けているのに
i=1: case 1 → 100+1=101
i=2: case 2 → 101+2=103
のように、case2で103になったのを、それ以外にあたいする
case 4に、103という数値をいれてもいいのでしょうか?
192:184
08/07/14 04:48:22
なんとなく、わかりましたが、
たとえば、こうなるとき
for(int i = 1; i<=5; i++){
for(int i = 1; i<=4; i++){
for(int i = 1; i<=3; i++){
for(int i = 1; i<=2; i++){
で、i<=3なら此処で抜けて
以前、まで(3以下まで)の処理がされる継承されてるからですね?
そして、case 3でブレイクということでしょうか?
193:184
08/07/14 04:49:15
簡単に言いますと、途中に(3にいくまで)Breakがあるから
ぬけだされないのかと・・・?
194:デフォルトの名無しさん
08/07/14 04:50:57
javaでWeb上のXMLを取得するプログラムを組みたいのですが
取得部分のやり方を教えていただけませんか。
できればSAXでお願いします。
195:デフォルトの名無しさん
08/07/14 04:51:29
>>191>>192
日本語を先に勉強しろ
196:デフォルトの名無しさん
08/07/14 04:51:52
>>191
>>192
なにを言ってるのかさっぱりわからん。
switch - case の break を for の break と勘違いしてるか?
両者は別のもの、というか、case にある break では for は終わらないぞ
197:デフォルトの名無しさん
08/07/14 04:57:06
>>194
WebからXMLを取得することとSAXを使うことは直接は関係ない。
まずWebからHTMLを取得することを勉強しなさい。
198:184
08/07/14 05:01:31
出直してきまふ
むじぃ
199:デフォルトの名無しさん
08/07/14 05:05:45
>>198
まるっきり勘違いを積み重ねてるようだから、出直して分かるか怪しいな
先のコードに行番号つけて、処理されると思っている順番に番号を書き出してみるのがいいだろう
200:デフォルトの名無しさん
08/07/14 05:07:01
>>197
Htmlを取得してそのXMLを読み込んで利用という認識でOKですか?
201:197
08/07/14 05:15:39
>>200
OKじゃない。
Webから何かを取得するという処理は、それがXMLだろーが
HTMLだろーが画像だろーが動画だろーが関係ない。
取得した後、XMLだったらSAXなりDOMなりXSLTなり
なんでも使って処理すればいい。
202:デフォルトの名無しさん
08/07/14 08:01:02
URLオブジェクトをつくり、ConnectURでゲット要求だして取り敢えずやってみ
203:130
08/07/14 08:53:46
>>132
>>134
亀レスで申し訳ないです。色々調べてみたら、
java.lang.Object
org.apache.struts.action.Action
org.apache.struts.actions.DispatchAction
org.apache.struts.actions.MappingDispatchAction
で、
204:130
08/07/14 08:56:41
org.apache.struts.action.Action
にservletというフィールドがありました。
有難う御座いました!!
205:デフォルトの名無しさん
08/07/14 11:16:38
JSPで1つのテキスト欄に対して複数の送信ボタンを作って処理を分けたいのですが、
それぞれの送信ボタンに異なるnameの値を設定してそれをサーブレットでどのボタンが押されたか判断し、その後の処理を分岐させようとしてもうまくいきません。
JSPで
<form method="POST" action="サーブレットのURL">
<input type="submit" name = "1" value="追加" />
<method="POST">
<input type="submit" name = "2" value="更新" />
(省略)
</form>
サーブレットで
String name = req.getParameter("name");
out.println("name="+name);
とやってもname=nullとしか表示されずnameの値を取得することが出来ません。
どこが間違っているのでしょうか?また、他に良い方法はあるのでしょうか?
206:デフォルトの名無しさん
08/07/14 11:24:12
>>205
String name = req.getParameter("1");
取るならこうだろ
207:デフォルトの名無しさん
08/07/14 11:48:13
>>206
出来ました。ありがとうございます。
208:デフォルトの名無しさん
08/07/14 13:07:41
実行可能なjarファイルを起動すると、
JDBCドライバが見つからないというエラーが出て困っています。
eclipceだと起動するけど、jarファイルにすると起動しないというパターンです。
マニフェストファイルにclass-pathとJDBCドライバのフルパスを書いて、
そのパスにJDBCドライバを置いているのですが、
何故か思うようにいきません。
どこに問題があるのでしょうか。
209:デフォルトの名無しさん
08/07/14 13:08:19
すいません。またnameの事でエラーが出てしまいました。
name = req.getParameter("1");
とやるとnameが1の送信ボタンの時は問題ないのですが
nameが2の送信ボタンのときは
nameを表示したりnameで判断させようとしたときにエラーが出てしまいます。
受け取るものがなくてnameに何も入っていないのが問題だと思うのですが、
あらかじめnameに"null"などどいてれもやはり同じエラーが出ます。
どうか解決策をお願いします。
210:デフォルトの名無しさん
08/07/14 13:18:34
>>209
ぬるぽ
211:デフォルトの名無しさん
08/07/14 13:19:08
>>209
どっちも name="buttonname" にして
String value = req.getParameter("buttonname");
で value.equals("追加") か value.equals("更新") かで見るとか?
212:デフォルトの名無しさん
08/07/14 13:29:28
>211
出来ました。ありがとうございます。
nameはこんな使い方も出来るんですね。
213:デフォルトの名無しさん
08/07/14 13:38:53
>>212
ぬるぽもちゃんと理解しないと今後つまずくと思うのだが
214:デフォルトの名無しさん
08/07/14 13:39:50
>>212
たぶん勘違いがあると思うが。
req.getParameter() で返されるのは <input name="A" value="B"> の
value の方("B")だ。
name = req.getParameter() という書き方から推測すると name の方("A")が
返されると思っているのではないか。
215:デフォルトの名無しさん
08/07/14 13:41:16
208です。
試しに、System.getProperty("java.class.path")を実行してみると、
どうやらクラスパスが通っていないようです。
ただし、マニフェストファイルには確かに次のように書いています。
Class-Path: C:/mysql-connector-java-5.1.6-bin.jar
このようなフルパスの指定に何か問題があるのでしょうか。
216:デフォルトの名無しさん
08/07/14 13:43:35
>>213
スレ的にはそっちがネタだなw
217:デフォルトの名無しさん
08/07/14 13:51:59
メモ帳にdoubleで生成した乱数が40万個あります。
そのデータをあるプログラムで読み込み計算し、上書きするという作業をしています
しかし、乱数、及び配列の数を40万個から50万個に変えたとき
outofmemoryerrorと表示されてしまいます。環境はNetBeans6.0.1です。
PCのメモリは1GBあります。
218:デフォルトの名無しさん
08/07/14 14:02:35
>>217
それで?
質問文を書け。
219:デフォルトの名無しさん
08/07/14 14:06:17
>>217
そのプログラムをもっとメモリを使わないで済むように改良するんだ!
220:デフォルトの名無しさん
08/07/14 14:12:48
java7になってBigDecimalを言語的にサポートされるので
BigDecimalをつかうプログラミングをするのはjava7になってから始めた方がいいですか?
221:217
08/07/14 14:25:41
失礼しました。
質問内容は、乱数、配列が50万個でもOutOfMemoryerrorを出さず、
プログラムを動くものにしたいのですが、どのようにしればいいでしょうか
222:デフォルトの名無しさん
08/07/14 14:29:14
メモリーを2ギガにする
223:115
08/07/14 14:33:15
>>221
javaのコマンドラインフラグで使用するメモリを増やす。
224:デフォルトの名無しさん
08/07/14 14:43:09
>>213
根本的な原因を理解しないといけないということですね。
String name = req.getParameter("2"); とするとnameが1の送信ボタンが押された場合、nameが2の値が存在しないので
それをnameに入れるとnameが何も入ってない状態(null)になるので、nameを判断しようとした場合、値がないのでエラーになるものだと思いました。
>>211の解決策はnameを統一し、nameの値(送信スイッチごとのvalue)で判断する。
こうすればどのスイッチがおされても必ずnameに値が入るのでnullにならない。というものだと解釈しました。
>>214
最初(>>205)はnameに'A'が入ったものが返ってくると思い、nameと書いていましたが、
アドバイスを頂き、今は理解できたと思います。
ありがとうございました。
225:デフォルトの名無しさん
08/07/14 14:52:11
>>215
たしかこうでは
Class-Path: C:/mysql-connector-java-5.1.6-bin.jar;.
226:デフォルトの名無しさん
08/07/14 14:54:13
>>224
if (name.equals("追加") {
}
だけだとエラーになるけど
if (name != null && name.equals("追加") {
}
とすればエラーにならないでしょ。
227:デフォルトの名無しさん
08/07/14 15:02:20
if (name != null && name.equals("追加") {
これって左が先か右が先かって順番決まってたっけな?
228:デフォルトの名無しさん
08/07/14 15:03:57
>>227
左が先
229:デフォルトの名無しさん
08/07/14 15:04:07
決まってる
左が先
230:デフォルトの名無しさん
08/07/14 15:08:01
クローンを自動で作る方法ありませんか?
231:デフォルトの名無しさん
08/07/14 15:17:41
implements Cloneable すればいいだけでは
232:デフォルトの名無しさん
08/07/14 15:17:50
>>225
レスありがとうございます。
試してみたのですが、やはりうまく動いてくれません。
もう、よくわからないので、jre/lib/extにドライバを置こうと思っています。
233:217
08/07/14 15:21:49
>>222
仮想メモリを2Gにしましたが、うまくいきませんでした。
>>223
コマンドラインフラグを調べましたが、良くわかりませんでした。
プログラム中で宣言するのですか?それとも、javaの設定を変えるのですか?
234:デフォルトの名無しさん
08/07/14 15:37:32
>>226
試してみたところ確かに下のはエラーになりませんでした。
上のはnameと比較しようとするとnameがnullなのでエラーになる。
下のはnameがnullかどうかチェックし、nullじゃなかったら比較に入るのでnullでもエラーが出ない。ということですね。
235:デフォルトの名無しさん
08/07/14 15:47:40
>>234
∧_∧
( ´∀`)< ぬるぽ
236:デフォルトの名無しさん
08/07/14 15:49:57
>>224
改良してみよう。
二つのボタン <input name="1" value="追加"><input name="2" value="更新"> の場合、
value の値は表示にも使われることもあって、プログラム内で判断に使うには向かない。
そこで value を見なくて済むように、それぞれが押された場合に req.getParameter() が
何を返すかもう一度見てみる。
追加ボタン押下時:
req.getParameter("1") = "追加"
req.getParameter("2") = null
更新ボタン押下時:
req.getParameter("1") = null
req.getParameter("2") = "更新"
ということは、押されたほうの req.getParameter() の返値は *nullでは無い* と
一般化できる。
だから
if(req.getParameter("1") != null) {
// 追加が押された場合の処理
} else if(req.getParameter("2") != null) {
// 更新が押された場合の処理
}
と書くことも出来、これなら value の値が例えば"追加"が"ついか"と変更されても
プログラム側は修正しなくて済むことになる。
237:デフォルトの名無しさん
08/07/14 15:58:52
>>233
メモリの割り当てはこの辺だけど、プログラムを見直したほうが良いんじゃね?
URLリンク(sdc.sun.co.jp)
238:デフォルトの名無しさん
08/07/14 16:15:50
>>236
そういう考え方も出来るんですね。勉強になります。
239:デフォルトの名無しさん
08/07/14 18:34:52
>>208
JDBCドライバのフルパスの場所に、ドライバのjar置いてあるだけ、とか言う落ち?
240:デフォルトの名無しさん
08/07/14 19:15:17
>208
マニフェストファイルにクラスパス以外にフルパスを記述、って具体的に何をしたんだか
URLリンク(java.sun.com)
# Class-Path:
この属性の値には、このアプリケーションまたは拡張機能に必要な拡張機能
またはライブラリの相対 URL を指定する。URL は 1 つ以上の空白で区切る。
241:デフォルトの名無しさん
08/07/14 21:18:27
>>8 >>10は一体何何だ?
福田やすおチンパン総理のことかと思った
242:デフォルトの名無しさん
08/07/14 21:36:57
2週間弱でアドベンチャー作るっていまいちよくわからんな
243:デフォルトの名無しさん
08/07/14 22:43:33
すみません、板違いになるかと思いますが、教えていただけますか。
<form mothed="post" action="./Result">
<input type="submit" name="id" value="hello" />
</form>
フォームから送信した値を、request.getString("id")で取得して、これを、下記例URLのように表示できますか?
URLリンク(example.com)
ではなくて、このような形で↓
URLリンク(example.com)
web.xmlをいじる必要はありますか?
よろしくお願いします。
244:243
08/07/14 22:47:12
すみません
メソッドまちがえました。
request.getParameter()
でしたorz
245:デフォルトの名無しさん
08/07/14 23:03:40
javaでGUIでゲームを作ろうとしています。
制限時間30秒のゲームを作ろうと思うんですが、
どうやって時間をカウントダウンさせればいいかわかんないです…
たぶんそういうコンポーネント?があるのかなと予想してるんですが…
246:デフォルトの名無しさん
08/07/14 23:08:19
>>243
filter
247:デフォルトの名無しさん
08/07/14 23:15:08
>>245
Timer
248:デフォルトの名無しさん
08/07/14 23:16:10
>>245
java.util.Timerないしはjava.util.concurrent.ScheduledExecutorService
後者はJava SE 5.0以降のみ
あとjavax.swing.Timerなんてのもあったな
249:デフォルトの名無しさん
08/07/15 00:47:30
やはりコンカレント工学
250:デフォルトの名無しさん
08/07/15 10:52:22
すいません、質問お願いします。
Fileクラスのコンストラクタを作るのに
"File(String parent,String child)"でつくると、
mkdirsは実行できるcreateNewFileのところで実行エラーになります。
フォルダを見るとParentフォルダの中にchildフォルダができています。
たとえばString childに"test.txt"と入れても"test.txt"というフォルダが作られてしまいます。
はじめに"File(String pathname)"でmkdirsでディレクトリを作っておいて、
"File(File parent,String child)"だとうまくファイルが作成されるのですが。
APIを見てもわからなく本当に困っています。
よろしく、お願いいたします。
251:デフォルトの名無しさん
08/07/15 10:55:43
>>250
何がわからないんですか?
両方とも、その動作で正しいですよ。
252:デフォルトの名無しさん
08/07/15 11:32:17
mkdirsは、parentまでではなく、自分自身のところまでディレクトリを作る
new File("c:\\foo\\bar\\test.txt").mkdirs() なら、c:\foo\bar\test.txt というディレクトリを作る
ちなみに new File("c:\\foo\\bar\\test.txt") と new File("c:\\foo\\bar", "test.txt") は同じ
253:217
08/07/15 12:31:06
アドバイスしてくれた方々、ありがとうございました。
いろいろ調べ、改良も考えたのですが、うまくいきません。
以下は私の作成したソースです。改良できそうなところをご指摘ください。
package javaapplication2;
import java.io.*;
import java.util.*;
public class LoadtoSave {
public static void main(String[] args) {
//データ格納用Listの準備
List<String[]> list = new ArrayList<String[]>();
double WAh[] = new double [600000];
try {
FileReader fr =new FileReader("WA.txt");
BufferedReader bf = new BufferedReader(fr);
String st = null;
254:217
08/07/15 12:31:38
while ((st = bf.readLine()) != null) {
String[] line = st.split(",");
list.add(line);//ファイル上1行の各数値を文字列として格納
}
bf.close();
int i=0;
for(String[] values: list){
for(String value: values){
double num = Double.parseDouble(value);//文字列を数値型に変換
WAh[i]= num;
i=i+1;
}}}
catch(IOException e) {
e.printStackTrace(); }
//ここでWAhについて大量の計算(並列的)
try {
File outFile = new File("WA.txt");
FileWriter out = new FileWriter(outFile);
PrintWriter pw = new PrintWriter("WA.txt"); //(8)書き込むデータがなくなるまで書き込み
for(int j=0;j<600000;j++){
pw.print(WAh[j]);
pw.print(",");
}
pw.close();}
catch(IOException e){
}}}
255:デフォルトの名無しさん
08/07/15 12:37:15
package pkgweb;
class Test {
private String str;
Test(String s){str=s;}
public String getStr() {return str;}
public void setStr(String str) {this.str = str;}
}
このファイルに対してjavac pkgweb\Test.java -d ..\WEB-INF\classesを実行してWEB-INF\classes以下にクラスファイルを作成し、jspから使用したいのですが
pkgweb.Test cannot be resolved to a typeとエラーが出ます。
jspの中身は以下のものです。
<%@ page contentType="text/html; charset=Windows-31J"%>
<html lang="ja"><head></head>
<body>
<%pkgweb.Test a=new pkgweb.Test("hoge");%>
<%=a.getStr()%>
</body></html>
色々ググったりしたのですが解決方法が分かりません。
どうしたら良いのか教えてください。
256:デフォルトの名無しさん
08/07/15 12:52:23
>>255
まず、貼り付けずに、どこかへアップするべきだったな。
URLリンク(rg550.hp.infoseek.co.jp)
とか
257:256
08/07/15 12:59:27
>>255
ごめん。
253-254から繋がってるかと思った。
258:デフォルトの名無しさん
08/07/15 13:02:52
>>253
1レスに入りきらないようなコードを貼られても見づらいし、
並列か並行か知らないけど、分けられるなら、一辺にやらなければよいのでは?
259:デフォルトの名無しさん
08/07/15 13:13:21
>>253,254
入力で、ファイル内容を全部Stringに入れてからdoubleに変換してる所と、
出力で、改行入れないで1行に出力してる所が少し気になった。
260:デフォルトの名無しさん
08/07/15 13:17:46
>>253
250 で書いているような個所が見当たらないぞ。
>>250
あるファイルを示すパス path があるとして、その親ディレクトリを含めてファイルを作成したいなら
File file = new File(path);
file.getAbsoluteFile().getParentFile().mkdirs();
file.createNewFile();
としたらどうだろうか。
261:デフォルトの名無しさん
08/07/15 13:58:35
Windows環境でProcessBuilderでコマンドをバックグラウンドで実行して放置しておきたいのですが、
コマンドが標準出力メッセージを多量に出し、別スレッドでInputStreamを適宜読み込まないと
コマンドがバッファ一杯で途中で止まってしまいます。
標準出力・エラー出力がたまらない方法ありましたら教えてください。
262:デフォルトの名無しさん
08/07/15 14:11:35
コマンドを標準出力に出力しないオプション付けて実行
nullにリダイレクトw
263:250
08/07/15 14:17:16
>>250です。
皆様、ありがとうございました。
>>252 様
>>new File("c:\\foo\\bar\\test.txt") と new File("c:\\foo\\bar", "test.txt")
後者のようにコンストラクタを作って、
そのあとmkdirsとcleatefileしたらファイルを作るところでエラーで
確認すると
foo/bar/test.txt/というようなすべてがフォルダでできていたのです。
>>260 様
>>253は私の書いたものではありません。
教えていただいた方法試してみます。
ありがとうございます。
ただ、疑問なのですが、普通は
>>new File("c:\\foo\\bar", "test.txt")
ではbarの中にtest.txtという「ファイル」ができるはずですよね?
264:デフォルトの名無しさん
08/07/15 14:25:02
>>263
いいえ
barの中にtest.txtというディレクトリを作ります
mkdirsはディレクトリを作るメソッドです
265:260
08/07/15 15:00:08
>>263 >>253
すまない、名前ちゃんと見ていなかった。
恥かし隠しに話題を変えるかw
>コンストラクタを作って
という表現は変だ。
コンストラクタはクラスのインスタンスを作るためのメソッドの名前みたいなもんで、
new クラス名(~) というのはインスタンスを実際に作っている。
なので「コンストラクトしている」とかならまだいいかもれないが、
「コンストラクタを作って」はいない。
また、Fileクラスは(その名前に反して)ファイルだけを処理するわけじゃない。
基本はパス名を処理するものであって、パスの最後の部分がファイルかどうかは気にしない。
”この名前のディレクトリを作れ”と指示(mkdirs())されたら(指示したほうは
最後の部分はファイルのつもりでも)Fileクラスはディレクトリとして作ってくれてしまうし、
それが仕様となってる。
266:デフォルトの名無しさん
08/07/15 15:29:32
>>255
public class Test {
にして
public Test(String s){str=s;}
にすれば、どう?
267:デフォルトの名無しさん
08/07/15 15:51:31
>>253
package javaapplication2;
import java.io.*;
public class LoadtoSave {
public static void main(String[] args) throws IOException {
double WAh[] = new double[600000];
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("WA.txt"));
String line;
for(int i=0; (line=br.readLine())!=null; ) {
for(String value : line.split(",")) WAh[i++]= Double.parseDouble(value);
}
} finally {
if(br != null) try { br.close(); } catch(IOException e) { /*無視*/ }
}
// ここでWAhについて大量の計算(並列的)
PrintWriter pw = null;
try {
pw = new PrintWriter("WA.txt"); //(8)書き込むデータがなくなるまで書き込み
for(double v : WAh) pw.print(v+",");
} finally {
if(pw != null) pw.close();
}}}
動かしてないがこんな感じには纏まるだろう。後はその多量の計算というところを
例えば10万件ずつ6回の処理に分けられないかとかだな。
268:217
08/07/15 16:05:35
>>259
>入力で、ファイル内容を全部Stringに入れてからdoubleに変換してる所と、
その他のやり方というか、王道的なものがありましたら、
教えて貰えると助かります。
>出力で、改行入れないで1行に出力してる所が少し気になった。
csv形式で書き込み、読み込むのを目的としてそうしました。
>>267
具体的なソースありがとうございます。
私の書いたソースと大きく変わったところは私には分かりませんが、
それを用いたときOutOfMemoryとならないか試してみます。
269:255
08/07/15 19:32:12
>>266
レスありがとうございます。
今public修飾詞に変更してコンパイルしてみましたがやっぱりダメでした。
270:デフォルトの名無しさん
08/07/15 19:33:11
ところで最大ヒープサイズの設定はしたのかね
大量の計算何してるのかしらないけど
40~50万で64m使い切るなら256mにすりゃ160~200万くらいまでいけるんじゃないのか?
とりあえず動かすだけだったら.
271:デフォルトの名無しさん
08/07/15 19:52:34
>>269
WEB-INF以下のパスはあってる?
\WEB-INF\classes\pkgweb\Test.class
272:デフォルトの名無しさん
08/07/15 20:05:58
プログラムって大変だな。学期末のレポート提出のために頑張ってるけど
だるすぎる。内容は初歩中の初歩なのに。
273:デフォルトの名無しさん
08/07/15 20:29:46
>>271
今各デプロイを見直したところ、
Tomcat 5.5\conf\Catalina\localhost以下の
web.xmlのdocBaseに書いたパスが一階層間違っていました!
/webをアプリケーションフォルダに設定したつもりが/web/jspになっていて
WEB-INFディレクトリを/web以下に置いていたための間違いだったようです。
レス頂き構成を見直したことが発見に繋がりました、ありがとうございます!
274:デフォルトの名無しさん
08/07/15 22:13:16
>>217
20桁くらいの数字が40万もあれば10Mくらいいきそうだな。
まぁどうすればいいかは知らんけど
275:デフォルトの名無しさん
08/07/15 23:37:04
質問させて下さい。
全角半角の混ざった文字列の先頭から10byte分切り出したいのですが、
もし、10byteの切れ目が全角文字の1byte目だった場合、
9byteで切り出したいというような処理ってどうやって書けばいいでしょうか?
276:デフォルトの名無しさん
08/07/15 23:46:22
NIOでバイト単位で扱うとか
277:デフォルトの名無しさん
08/07/16 00:01:24
>>275
結果文字列=""
合計バイト数=0
取出文字位置=0
while(取出文字位置 < 文字列の文字数) {
文字=文字列[取出文字位置++]
合計バイト数+=文字のバイト数
if(合計バイト数 > 10) break
結果文字列=結果文字列+文字
}
278:デフォルトの名無しさん
08/07/16 00:10:11
>>275
そのデータはどのような形式で保持してるの? byte[]? エンコーディングは?
279:デフォルトの名無しさん
08/07/16 00:26:24
全角が堂のこうの言ってるんだからwindows-31Jじゃね?
280:250
08/07/16 09:23:50
>>250です。
>>246様>>247様、どうもありがとうございました。
インスタンスを作成する、ですね。
ここでご指摘いただけてよかったです。
そしてわかりました!
どうもありがとうございました。
281:デフォルトの名無しさん
08/07/16 11:17:10
J2EEの日本語APIリファレンスを
探してるのですが
SUNのページを探しても見つかりません
どこでダウンロード可能でしょうか
282:デフォルトの名無しさん
08/07/16 11:54:50
byte[] b = {(byte)0x01, (byte)0x02};
これをキャストせずにきれいに書くことはできませんか?
283:デフォルトの名無しさん
08/07/16 11:59:12
16進で表現したいので
byte[] b = {(byte)0xFE, (byte)0xFF};
のように書きたいです。
10進でしたら
byte[] b = {254, 255};でよいのですが。
284:デフォルトの名無しさん
08/07/16 12:02:51
数値は数値でしかないし、その表現方法(文字で)が変わるだけでしょ
285:デフォルトの名無しさん
08/07/16 13:52:27
>>283
キャストしたくないだけなら
byte[] array = { 0xFFFFFFFE, 0xFFFFFFFF };
286:デフォルトの名無しさん
08/07/16 14:17:38
コストが掛かるがこんなん使うとか
static byte[] b(int...is) {
byte[] bs = new byte[is.length];
for(int i=0; i<is.length; i++) bs[i] = (byte) is[i];
return bs;
}
// byte[] b = b(0x01, 0x02, 0xFE, 0xFF); // {1, 2, -2, -1}
287:デフォルトの名無しさん
08/07/16 14:47:02
>>275
相手がShift_JIS系なら、
boolean isSJISLeadingByte(byte val) {
int b = val & 0xFF;
return (0x81 <= b && b <= 0x9F) || (0xE0 <= b && b <= 0xFC);
}
みたいのを書いて分岐した方が楽。
NIO charsetはライブラリ書く人向けの作りなので、異常系の状態拾おうとすると
真面目にエラー処理させられるような作りになってて面倒くさい。
無理矢理使うとこんな感じか。
byte[] array = .....
CharBuffer buf = CharBuffer.allocate(array.length); //文字数≦バイト数と仮定
CharsetDecoder decoder = Charset.forName("windows-31j").newDecoder();
decoder.onMalformedInput(CodingErrorAction.REPORT);
decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
int trim_bytes = 0;
CoderResult result;
do{
buf.clear();
result = decoder.decode(ByteBuffer.wrap(array, 0, array.length - trim_bytes++), buf, true);
}while(result.isError());
System.out.println(result + " : " + buf.flip());
288:デフォルトの名無しさん
08/07/16 14:50:22
>>285
JAVAではintが基本だから32ビットの16進で書けばよかったということですか。
上位24ビットが0でなくてFFFFFFなのはなぜですか?
289:デフォルトの名無しさん
08/07/16 14:54:17
>>288
> JAVAではintが基本だから32ビットの16進で書けばよかったということですか。
真面目に取らんでいいよ。
> 上位24ビットが0でなくてFFFFFFなのはなぜですか?
byte であらわせるのは -128~127まで。
なので -128~127 の定数値はキャストなしで byte に代入可能。
上位24ビットを 0 にすると 0~255 になって、0x80 以上はキャストしないと代入できなくなる。
290:デフォルトの名無しさん
08/07/16 14:54:52
>>288
0~127 byte表現 0x00~0x7F → int表現 0x00000000~0x0000007F
-128~-1 byte表現 0x80~0xFF → int表現 0xFFFFFF80~0xFFFFFFFF
291:デフォルトの名無しさん
08/07/16 15:46:42
>>281
J2EEは今はJava EEという名前
Java EEでさがせ
Java SEの近くにある
292:デフォルトの名無しさん
08/07/16 19:43:16
>>290
0x7Fまでなら0x000000を付けて、
0x80以上なら0xFFFFFFを付けるんですね。
16進を書くには、(byte)でキャストするか、場合分けの8ニブルの16進で書くか
というどちらにしても、長いソースになってしまいますね。
293:デフォルトの名無しさん
08/07/16 19:46:49
>>292
短くしたいだけなら>>286で良いんじゃね?
294:デフォルトの名無しさん
08/07/16 22:08:52
CPUをいじめるのが好きなのでAckermann関数の値を求めるのを作ったんですが、以下のソースのを実行すると
at Ackermann.ackermann(Ackermann.java:12)
というメッセージが、ばーっと出てきます。どこがおかしいのでしょうか?
public class Ackermann{
public static void main(String args[]){
long i=Long.parseLong(args[0]);
long j=Long.parseLong(args[1]);
System.out.println(ackermann(i,j));
}
public static long ackermann(long m,long n){
if(m==0)return n+1;
else{
if(n==0)return ackermann(m-1,1);
else return ackermann(m-1,ackermann(m,n-1));
}
}
}
295:デフォルトの名無しさん
08/07/16 22:15:05
ごめんなさい
第1引数を4以上にすると出ます
296:デフォルトの名無しさん
08/07/16 22:20:39
コンパイル通らないはずだけど
if elseの対応が合ってない
297:デフォルトの名無しさん
08/07/16 22:30:44
うちのではコンパイル通りました。
if(m==0)return n+1;
else{
if(n==0)return ackermann(m-1,1);
else return ackermann(m-1,ackermann(m,n-1));
}
if elseの対応は上のような感じです。
298:デフォルトの名無しさん
08/07/16 22:31:07
普通にスタックオーバーフローだわ・・
299:デフォルトの名無しさん
08/07/16 22:34:02
再帰が深すぎてスタックオーバーフローを起こしてるんじゃ
300:デフォルトの名無しさん
08/07/16 22:39:18
なんかそうっぽいです・・・
別の方法でCPUをいじめます・・・
301:デフォルトの名無しさん
08/07/17 00:11:50
>>292
>8ニブルの16進で書くか
何だこれ?
302:デフォルトの名無しさん
08/07/17 01:06:43
>>301
ニブルでぐぐってみれば?
303:デフォルトの名無しさん
08/07/17 02:38:05
>>293
286を見落としていました。286を使ってみたいです。
でもコンパイルできませんでした。
JDK1.3では無理ですか?
b(int...is) { が可変長の引数に対応するものに見えましたが。
304:デフォルトの名無しさん
08/07/17 09:50:26
>>262
ありがとうございます。
ではjavaレベルでストリームをパイプしないで実行はサポートされていないのですね。
ようはNULLリダイレクトしても、結局意味のないそのストリームは生成してしまう、ということですか?
もちろん何もわたってこないのでreadする意味もないですが。
305:デフォルトの名無しさん
08/07/17 10:07:11
>>293
1.3じゃ286は無理だな…
さらに呼び出しコスト上がるがこんなんでどう?
1.3のJDKで試してないからエラー出るかもしれないが。
static byte[] b(String str) {
StringTokenizer st = new StringTokenizer(str, ", \t");
byte[] bs = new byte[st.countTokens()];
for(int i=0; i<bs.length; i++) {
bs[i] = Integer.decode(st.nextToken()).byteValue();
}
return bs;
}
// b("0x01, 0x02, 0xFE, 0xFF");
// b(" 1, 2, 254, 255"):
// b(" 1 2 -2 -1"):
// 以上全てnew byte[]{ 1, 2, -2, -1 } と同じバイト配列を返す
306:305
08/07/17 10:09:05
アンカミス
293 → >>303
307:デフォルトの名無しさん
08/07/17 10:27:55
>>304
コマンドが出力してくる以上、ストリームには貯まるもんだ。
だから >>262 はまず「そのコマンドに"出力しない"オプションがあるなら
それを指定してやれ」と言ってるのじゃないか。
そして、そんなオプションが無い、もしくは指定できない何か理由があるのなら、
シェルの機能を使ってnullデバイスにリダイレクトしとけ、と言ってるんだと思うぞ。
シェルも使えないのなら、>>261 が自分でやったように「ひたすら読み込んで捨てる」と
いうnullストリームをjavaで作って食わせるしかないかもな。
308:デフォルトの名無しさん
08/07/17 10:47:46
>>304
process.getInputStream().close();
process.getErrorStream().close();
して黙らせるのじゃいかんのか?
309:デフォルトの名無しさん
08/07/17 12:02:59
hashcodeってオーバーライドしなくても、MAPのキーに使っても正しい値って取れますよね。
それはhashcode()で値が同じでも、最終的にequalsで判断するから、と考えてよろしいでしょうか?
310:デフォルトの名無しさん
08/07/17 12:09:00
近藤よしゆき著のJavaプログラマのためのアルゴリズムとデータ構造をお持ちの方に質問があります。
95~96ページの待ち行列の出力サンプルで、
MyQueue[a b c] front=0 rear=3
aを取り出した
bを取り出した
MyQueue[c ] front=2 rear=3
dを入れた
eを入れた
cを取り出した
MyQueue[d e ] front=3 rear=0
とあるのですが、
なぜ、rearは0になってしまったのでしょうか?
311:デフォルトの名無しさん
08/07/17 12:13:52
>>309
一般的には、ダメ。
equals()がtrueなのにhashCode()が違う値、の場合にうまく動かない。
hashCode()が常に同じ値を返したりすると、HashMapなどの効率がものす
ごく悪くなる。
312:デフォルトの名無しさん
08/07/17 12:44:26
お尋ねします。
現在JAVAでGUIを使った簡単なゲームを作っています。(具体的には、5目並べです)
ゲーム自体は既にできあがって、きちんと動作もしているのですが、
どうも初心者なためクラスをどのように構成すればよいのかがよくわかりません。
いまのところ、windowクラスとpaintクラス、それとThinkクラスの3つになっています。
windowクラスはウィンドウ及びボタンなどのクラス、
paintクラスは盤上の勝敗判定等のほかpaintComponentメソッドを含む描画用のクラス、
Thinkクラスはコンピュータが次の手を決定する思考ルーチンのクラスです。
このようなゲームの場合、どういったクラスをいくつ定義するのがソースコードとして美しいのでしょうか?
今の状態はなんだかクラスごとの役割分担がごっちゃになっているような気がして・・・
どうすれば「オブジェクト指向」の概念がきちんと活かされていることになるでしょうか?
313:デフォルトの名無しさん
08/07/17 12:54:22
>>312
結城浩たんのJava言語で学ぶデザインパターン入門とか読んでみるとか。
314:デフォルトの名無しさん
08/07/17 13:16:06
>>310
その本は持っていないが、長さ5の配列でキューを実装している例では?
front が読み口のインデックス、
rear が書き口のインデックスなのだろう。
4番まで書き込んだから、次は0番を再利用するのでは?
315:デフォルトの名無しさん
08/07/17 13:50:02
>>311
ということは、hasecode()とequals()をオーバーライドしなくても全然OKって事ですよね。
しかもデフォルトのhasecode()はアドレス値的なものが入るので、大抵がユニークになっています。
しかもデフォルトではequals()がtrueなら同じインスタンスのhashCode()なので、もちろん同じ値で問題なし。
そう考えると、この2つはオーバーライドしない方がいいのではと思っちゃいます。あくまでMAPのキーとして使うだけを考えていますが。
316:デフォルトの名無しさん
08/07/17 13:50:50
>>308
たぶんコマンド側がパイプエラーになると思います。
317:デフォルトの名無しさん
08/07/17 13:58:54
>>315
同じ値を持つ異なるインスタンス、というものがなければ、別に問題ない
318:デフォルトの名無しさん
08/07/17 14:10:27
>>315
>>317の言うとおり。
たとえば、StringはhashCode()とequals()をきちんと定義しないといけないケース。
319:デフォルトの名無しさん
08/07/17 14:22:19
>>310
双方向キューじゃない?