• ベストアンサー

コンパイル時のクラス生成について

コンパイルしてクラスファイルが出来上がって実行して、ちょっとプログラムを変えてまたコンパイルして、実行したのですが、元のプログラムのままで何も変わらないのです。もちろん保存もきちんとしています。 ためしに、出来上がっているクラスファイルを全て捨てて、再度コンパイルしてみたらクラスファイルが出来ていて、プログラムを変えた実行結果が出ました。 つまり、クラスファイルへの上書きがされないのです。 これっていったいなぜなのでしょう?? 簡単に、表示文字だけを変えて再度コンパイル実行としてみても、変える前の結果がでて、またファイル処分してからコンパイルして実行したら、きちんと変わりました。 このクラスファイルがあるときに、新たに上書きされない現象ってどんなところから来る問題なのでしょうか?? 今までこの様なことはぜんぜんなかったのですが・・。現状のプログラムはパッケージ分けして、メインは C→my javaに。 他のクラスは全部sub2に入ってます。クラスファイルは6つくらい。  C→my java →sub→sub2に。 一度はコンパイルして求める結果がでてるので、プログラム上のミスは無いはずです。 なぜ書き換わらないのかまったくわかりません。 現状はJDK1.5.0_06を使っています。 短いプログラムですと書き換えられない問題は起きたことありません。 コンパイルは通るけど、実行時にクラスがファイルが見つからないとエラーが出たときがあり、ファイルが作られていないという現象も起きた事もあります。 (これは新たに保存しなおすと言う事で解決しました。) これが今までの経験なのですが、今回のは経験した事をためしてみたのですが、わからなくて・・ どうか、ご存知の方がいらっしゃいましたらお教えください。質問がわかりづらければ補足させていただきます。問題が問題だけにお返事いただけないかもと不安ですが、お待ちいたしております。

  • yuki22
  • お礼率83% (159/190)
  • Java
  • 回答数5
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.5

「平凡なミス」のような気がしますが…。 --- (1)非常によくあるのが、 「修正したソースファイルの保存(※上書き)し忘れ」 です。 あたりまえのことですが、 ソースコードを修正した"すべての"ソースファイルは、 コンパイルの前に、 「保存(※上書き)」しなくてはなりません。 ※1つでも「修正後、保存しなおし忘れたソースファイル」がある場合は、 当然ながら、その分の修正は、 ソースファイルに反映されてないことになります。 (2)コンパイル時のコマンド(javac)、実行時のコマンド(java)は、 コマンドプロンプト(DOS窓)から毎回直接打つのではなく、 「バッチファイル」に用意しておきましょう。 (※理由は、コマンドプロンプトから毎回直接に打つと、 打ち間違えやすいし、 「今、自分はどんなコマンドを打ったのか」の証拠が残らない。 それに、「ある1つのアプリケーション」をつくっている最中は、 コンパイルコマンド、実行コマンドは"そうそう変化しないはず"なので、 その意味でも「(修正がまず生じない)一定のバッチファイル」として用意するべき) --- (1)(2)の具体的なやり方には言及しませんが、 なんにせよ、このへんの「基礎的な手順」を確実に固めることです。 今後、「修正がクラスファイルに反映されない」という現象に遭遇したら、 まず上記(1)(2)を確認してみてください。

yuki22
質問者

お礼

何度もお返事ありがとうございます やはり基礎的なことなのでしょうか・・・ 持続的に画面をみているとおっしゃられる様なことを知らず知らずに忘れているかもですね。 また、専門家のkacchannさんからこの様にアドバイスいただけると言う事は、私の今回の問題は起こりにくい、もしくは基礎的な手順を固めれば普通は起こらないと言うことですね。 大切なお時間、いろいろとありがとうございました^^

その他の回答 (4)

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.4

>簡単に、表示文字だけを変えて再度コンパイル実行としてみても、 >変える前の結果がでて その現象が再現する、 「完全」かつ「コンパイル可能」な「ごく短い」ソースコードを 自分でつくってみて それをここに掲示しましょう。

yuki22
質問者

お礼

そうですよね・・、私、漠然とした説明だけしかしてなくて申し訳ないです。 その現象が起こるのって短いのはあまりなく、いくつもパッケージ分けした時に起こりやすいのです。 プログラム自体はコンパイルは通るのに、クラスファイルが出来上がらないので、消しちゃいました・・。 申しわけございません・・。 また、この様な現象が起こると思うのですが、そのときは kacchannさんのおっしゃられるようにソースも載せさせていただきます。お返事ありがとうございました^^

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.3

ここの作業が少し解らないです。 >ただ、関連しているクラスは、sub2に置いたまま >my javaにあるメインをjavacして結果を見ています。 ここは C:\my java>javac sub\sub2\hogehoge.java のようにやっていないという意味でしょうか? また 関連しているクラスとは package sub.sub2; としていますか?

yuki22
質問者

お礼

説明不足でごめんなさい。 package してますです。 Arrayとかでのクラスは単体で動かなかったので、ということでしたので、深い意味ではなかったのです。 ごめんなさい^^; でも、やっぱり、私がしなくてもいいことをしてしまってPCに負担をかけてるから起こる問題なのでしょうか・・。 わけのわからない質問してしまってごめんなさい。 度々のお返事ありがとうございました^^

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.2

メイン以外のコンパイル時には C:\my java>javac sub\sub2\hogehoge.java のようにしてますか?

yuki22
質問者

お礼

お返事ありがとうございます。 メイン以外はおっしゃられる通りにしています。 ただ、関連しているクラスは、sub2に置いたまま my javaにあるメインをjavacして結果を見ています。 つまり、単体でのコンパイルはしてるものとしてないものがあるです^^; もしかして、この様な私の行い方が悪かったのでしょうか・・。

回答No.1

開発環境の、実行のされかた考え方になんらかの問題があるのだと思います。何の開発環境を使用しているのかわかりませんが…例えばVBとかだと、コンパイルを、ビルドとリビルドがあって、考え方が異なります。 前にコンパイルしたモノが、メモリに残っているなりして、一度コンパイルしても、開発環境の実行ボタンだと、コンパイルした最新のファイルを読み込まないで実行されたりします。また、コンパイル時にファイルを上書きする考え方に、使いづらいバグがあるのだと思います。 プログラミング言語によくあることだと思いますので、そういう方向性で考えてみてください。安っぽいエディタでJavaをやっていてそういうような現象に悩んだ事があります。Eclipseでも、たしか使い方や考え方を間違えると、同じような現象になりました。 あまり深く考えないで、開発環境を変えるか、コンパイルごとに削除する方法で使いこなす方がいいですよ。

yuki22
質問者

お礼

開発環境・・・、そういえばsakuraエディタに変えてから起こってるようなきがします・・・。 簡単なものはメモ帳とかで練習してたので、長くなってきたらsakuraに変えました。 でも、これもきちんとしたエディタだと思うので、私の何かミスと言うか、気が付かない内にダメな事をしてるのかもですね・・。 以前他のエディタもご紹介いただいたのですが、ダウンロードの仕方がわからなくて・・、始まらないというのでしょうか^^; 何か他の使い勝手がよくてこの様な現象が起きたことないって言うものを探してみます。 お返事ありがとうございました^^

関連するQ&A

  • コンパイルができません

    Java超初心者です。 プログラムによってコンパイルできるものと、できないものがあって困っています。 できない場合のエラーメッセージは「○○(クラス名)を読み込めません」と出ます。 そのプログラムは、本に掲載されているものを丸写ししたものです。 プログラム自体が間違っていない証拠に、同じ内容のものをクラス名を変えて試してみて、成功と失敗が出ました。 クラス名や、保存したファイル名が間違っているとも思えないんですが。 もう一つなんですが、"System.out.println・・・"に対してエラーが出るんです。 入力・保存はきちんとできているはずなのに、コマンドプロンプト上では「Systemou」として認識され、エラーになってしまうことがあります。 何が悪いんでしょう? OSはMeです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • vine linux2.5でのコンパイルについて

    プログラムを作りファイルをコンパイルすることまではできるのですがコンパイルされたファイルを実行することができません。 ファイルを実行するには、どのようにしたらよいのでしょうか?

  • コンパイルができません

    「なぜ、あなたはJavaでオブジェクト指向開発ができないのか」 という本を使って今勉強しているのですが、Lesson9のフレームワークを使ったプログラムで シンボルを解決できません。 シンボル: クラス Card とエラーが出てコンパイルできなくなりました。 仕方なく「http://www.gihyo.co.jp/books/support.php/4-7741-2222-X#sampledata」にあるこの本のサンプルファイルをダウンロードして実行してみましたがやはり同じエラーがでてコンパイルできません。 javac ○○.java ではコンパイルできないのでしょうか? エディタは「JmEdit2」というのを使っています。

    • ベストアンサー
    • Java
  • コンパイルできません

    Javaのプログラムをコマンドプロンプトでコンパイルしようとしているんですが、プログラム中で画像データを byte [] imagedata = {-1, -40, -1, -32, 0, 16, 74, ・・・ -1, -39};のように記述しています。 そこで、コンパイルすると「このコードは64Kバイトを超えるサイズのメソッドの生成を必要とします。VirtualMachineは生成されるクラスファイルを拒否します。」と表示されてコンパイルできません。どうしたらいいのでしょうか?わかる方おられましたらお願いします。

    • ベストアンサー
    • Java
  • JAVAコンパイルと実行

    はじめまして。質問があります。 eclipseで開発したjavaのソースを実行するとき、メニューからメインクラスを指定し実行するだけでプログラム実行されますが、そのプログラムをコマンドプロンプトで実行する場合、できるプログラムとできないプログラム(例外:NoClassDefFoundError)があります。 コンパイルはeclipceのほうで勝手に.classファイルが生成されるので、そのclassファイルをjava [ファイル名]と打つだけだと思います。 実行できるプログラムとできないプログラムの違いは以下の通りです。 ・実行できるプログラム eclipseで新規でプロジェクトを作成。その直下にソースが存在し、クラスファイルも同じディレクトリに生成されます。 ・実行できないプログラム eclipseで新規でプロジェクトを作成。ソースフォルダ(src)を作成し、その下からパッケージ、クラスを作成しました。そうすると、エクスプローラでそのプロジェクトを見ると、binフォルダが生成されていました。その中にクラスファイルが生成されます。 違いはこのような感じです。実行できないプログラムをコマンドプロンプトで実行させるためにはどうしたらよいでしょうか?eclipseの使い方はだいぶわかってきたのですが、どのように動作しているか(java自体も)がわかりません。ご教授宜しくお願い致します。 OS:windows2000 開発環境:eclipse 3.0(J2SE 1.4.2_03)

    • ベストアンサー
    • Java
  • コンパイルが通らない

    うちのPCでは確実にコンパイルが通って、実行までできたプログラムが他の人のPCではコンパイルが通らなかったり実行ができません。 実行する際には javac nishi.java java nishi とやると以下のようなエラーがでて実行ができません(コンパイルは通ります。決してjava nishi.classとかjava nishi.javaといったお約束の間違いは行っていません) Exception in thread "main"java.lang.NoClassDefFoundError:nishi また違うファイルではこっちでコンパイルが通るのにあっちではコンパイルが通らなかったりします。バージョンが違うためでしょうか?僕のバージョンが1.5.08?で相手が1.4.2くらいです。だからコンパイルが通らないの?

  • コンパイルできません

    メモ帳に簡単なプログラムを書いて保存した所、拡張子が.txtになってしまったためかMS-DOSプロンプトでコンパイルしようとしたのですが、「コマンドまたはファイル名が違います」とエラーが出てしまいました。参考書のとおりにやっているのですが、うまくきません。どうすればコンパイルできるのでしょうか?

    • ベストアンサー
    • Java
  • eclipseのコンパイルエラーについて

    現在、Eclipse+borlandでdirectxのプログラムを作成しています。 しかし、eclipseでコンパイルをするとコンソールに ”プログラムが大きすぎてメモリに入りません”とエラーが 表示されます。 borlandでコンパイルをすると問題なく実行ファイルが生成されます。 eclipseでコンパイルする場合は、設定が必要なのでしょうか?

  • コンパイルできたのですけど…

    今までコンパイルできてmainメソッドの実行がコンソール上でできていたのですけどException in thread "main" java.lang.ArrayIndexOutOfBoundsException:5 at sampled5l4.main(sampled5l4.java:26) というのがコンソール上にでて実行できません。コンパイルされて、クラスファイルもできているのになぜ実行ができないのでしょうか?ちなみにほかのやつはちゃんと実行できます。どこを直せばいいのでしょうか?ご教授お願いします。jdk1.5.0です。

    • ベストアンサー
    • Java
  • 《エクセル2000VBA》なぜコンパイルエラーになるのかわかりません…

    最近、ここには本当にお世話になっております。 以前作ったVBA(コマンドボタンを押すと、別シートにデータが転記される)のコードを変更したら、一番上のPrivate Subの行の文字が赤くなり、コピー元のシートのボタンにカーソルを持っていくと「コンパイルエラーです」と出るようになってしまいました。 そこでバックアップで保存してあった、問題なく動く過去のファイルを開いてみたのですが、Private Sub周辺の部分の書き方は全く同じです。 というわけで、Private Subがコンパイルエラーになる条件が、よくわからないのですが… 原因が思いつかず、ほとほと困っています。 何とかこの現象を解決したいのですが、どうすればいいでしょうか。

専門家に質問してみよう