- ベストアンサー
コンパイル時のクラス生成について
コンパイルしてクラスファイルが出来上がって実行して、ちょっとプログラムを変えてまたコンパイルして、実行したのですが、元のプログラムのままで何も変わらないのです。もちろん保存もきちんとしています。 ためしに、出来上がっているクラスファイルを全て捨てて、再度コンパイルしてみたらクラスファイルが出来ていて、プログラムを変えた実行結果が出ました。 つまり、クラスファイルへの上書きがされないのです。 これっていったいなぜなのでしょう?? 簡単に、表示文字だけを変えて再度コンパイル実行としてみても、変える前の結果がでて、またファイル処分してからコンパイルして実行したら、きちんと変わりました。 このクラスファイルがあるときに、新たに上書きされない現象ってどんなところから来る問題なのでしょうか?? 今までこの様なことはぜんぜんなかったのですが・・。現状のプログラムはパッケージ分けして、メインは C→my javaに。 他のクラスは全部sub2に入ってます。クラスファイルは6つくらい。 C→my java →sub→sub2に。 一度はコンパイルして求める結果がでてるので、プログラム上のミスは無いはずです。 なぜ書き換わらないのかまったくわかりません。 現状はJDK1.5.0_06を使っています。 短いプログラムですと書き換えられない問題は起きたことありません。 コンパイルは通るけど、実行時にクラスがファイルが見つからないとエラーが出たときがあり、ファイルが作られていないという現象も起きた事もあります。 (これは新たに保存しなおすと言う事で解決しました。) これが今までの経験なのですが、今回のは経験した事をためしてみたのですが、わからなくて・・ どうか、ご存知の方がいらっしゃいましたらお教えください。質問がわかりづらければ補足させていただきます。問題が問題だけにお返事いただけないかもと不安ですが、お待ちいたしております。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
「平凡なミス」のような気がしますが…。 --- (1)非常によくあるのが、 「修正したソースファイルの保存(※上書き)し忘れ」 です。 あたりまえのことですが、 ソースコードを修正した"すべての"ソースファイルは、 コンパイルの前に、 「保存(※上書き)」しなくてはなりません。 ※1つでも「修正後、保存しなおし忘れたソースファイル」がある場合は、 当然ながら、その分の修正は、 ソースファイルに反映されてないことになります。 (2)コンパイル時のコマンド(javac)、実行時のコマンド(java)は、 コマンドプロンプト(DOS窓)から毎回直接打つのではなく、 「バッチファイル」に用意しておきましょう。 (※理由は、コマンドプロンプトから毎回直接に打つと、 打ち間違えやすいし、 「今、自分はどんなコマンドを打ったのか」の証拠が残らない。 それに、「ある1つのアプリケーション」をつくっている最中は、 コンパイルコマンド、実行コマンドは"そうそう変化しないはず"なので、 その意味でも「(修正がまず生じない)一定のバッチファイル」として用意するべき) --- (1)(2)の具体的なやり方には言及しませんが、 なんにせよ、このへんの「基礎的な手順」を確実に固めることです。 今後、「修正がクラスファイルに反映されない」という現象に遭遇したら、 まず上記(1)(2)を確認してみてください。
その他の回答 (4)
- kacchann
- ベストアンサー率58% (347/594)
>簡単に、表示文字だけを変えて再度コンパイル実行としてみても、 >変える前の結果がでて その現象が再現する、 「完全」かつ「コンパイル可能」な「ごく短い」ソースコードを 自分でつくってみて それをここに掲示しましょう。
お礼
そうですよね・・、私、漠然とした説明だけしかしてなくて申し訳ないです。 その現象が起こるのって短いのはあまりなく、いくつもパッケージ分けした時に起こりやすいのです。 プログラム自体はコンパイルは通るのに、クラスファイルが出来上がらないので、消しちゃいました・・。 申しわけございません・・。 また、この様な現象が起こると思うのですが、そのときは kacchannさんのおっしゃられるようにソースも載せさせていただきます。お返事ありがとうございました^^
- fortranxp
- ベストアンサー率26% (181/684)
ここの作業が少し解らないです。 >ただ、関連しているクラスは、sub2に置いたまま >my javaにあるメインをjavacして結果を見ています。 ここは C:\my java>javac sub\sub2\hogehoge.java のようにやっていないという意味でしょうか? また 関連しているクラスとは package sub.sub2; としていますか?
お礼
説明不足でごめんなさい。 package してますです。 Arrayとかでのクラスは単体で動かなかったので、ということでしたので、深い意味ではなかったのです。 ごめんなさい^^; でも、やっぱり、私がしなくてもいいことをしてしまってPCに負担をかけてるから起こる問題なのでしょうか・・。 わけのわからない質問してしまってごめんなさい。 度々のお返事ありがとうございました^^
- fortranxp
- ベストアンサー率26% (181/684)
メイン以外のコンパイル時には C:\my java>javac sub\sub2\hogehoge.java のようにしてますか?
お礼
お返事ありがとうございます。 メイン以外はおっしゃられる通りにしています。 ただ、関連しているクラスは、sub2に置いたまま my javaにあるメインをjavacして結果を見ています。 つまり、単体でのコンパイルはしてるものとしてないものがあるです^^; もしかして、この様な私の行い方が悪かったのでしょうか・・。
- adaypajimy
- ベストアンサー率20% (201/964)
開発環境の、実行のされかた考え方になんらかの問題があるのだと思います。何の開発環境を使用しているのかわかりませんが…例えばVBとかだと、コンパイルを、ビルドとリビルドがあって、考え方が異なります。 前にコンパイルしたモノが、メモリに残っているなりして、一度コンパイルしても、開発環境の実行ボタンだと、コンパイルした最新のファイルを読み込まないで実行されたりします。また、コンパイル時にファイルを上書きする考え方に、使いづらいバグがあるのだと思います。 プログラミング言語によくあることだと思いますので、そういう方向性で考えてみてください。安っぽいエディタでJavaをやっていてそういうような現象に悩んだ事があります。Eclipseでも、たしか使い方や考え方を間違えると、同じような現象になりました。 あまり深く考えないで、開発環境を変えるか、コンパイルごとに削除する方法で使いこなす方がいいですよ。
お礼
開発環境・・・、そういえばsakuraエディタに変えてから起こってるようなきがします・・・。 簡単なものはメモ帳とかで練習してたので、長くなってきたらsakuraに変えました。 でも、これもきちんとしたエディタだと思うので、私の何かミスと言うか、気が付かない内にダメな事をしてるのかもですね・・。 以前他のエディタもご紹介いただいたのですが、ダウンロードの仕方がわからなくて・・、始まらないというのでしょうか^^; 何か他の使い勝手がよくてこの様な現象が起きたことないって言うものを探してみます。 お返事ありがとうございました^^
お礼
何度もお返事ありがとうございます やはり基礎的なことなのでしょうか・・・ 持続的に画面をみているとおっしゃられる様なことを知らず知らずに忘れているかもですね。 また、専門家のkacchannさんからこの様にアドバイスいただけると言う事は、私の今回の問題は起こりにくい、もしくは基礎的な手順を固めれば普通は起こらないと言うことですね。 大切なお時間、いろいろとありがとうございました^^