0
0

More than 3 years have passed since last update.

【Java】メイン・クラスXXXが見つからなかったかロードができませんでした

Posted at

別のファイルをコピーして作成しただけなのになんで実行できないの?クラスファイルも生成されているのに!!

java_lessons/com/dot/myappにMyApp.javaを作成。
MyApp.javaをコピーしてPractice.javaを作成。
試したいことをPractice.javaに書いていく。

MyApp.javaの外部クラスをjava_lessons/com/dot/myapp/modelに入れていて、それを読みこんでいたけど、外部クラスを読み込まずに簡単なコードを試したいのでpackageとimportを削除してPractice.javaを作成して行った。

そしてコンパイルはうまく行ったけど、実行ができない。

実行しようとすると

メイン・クラスcom.dot.myapp.Practiceが見つからなかったかロードができませんでしたというエラーのループに。

調べたらPATHがどうとか書いてたけど、java_lessonsのディレクトリとは別にtestディレクトリを作成してそこにPractice.javaを移動してコンパイル・実行をするとできた。

ということはPATHがどうとかいう話ではないのではないかと考えた。

でもどうしたらいいかわからない。

ん〜こう言う時ってどうしたらいいんだろう。質問できる人がいたらいいけど、独学だからいません!ネットで聞けばいいけど、それならなんとか自分で対処したい!

解決までのプロセス

とりあえず考えられる原因をいくつか列挙できればそれぞれの原因について調べて見れば、同じようなエラーメッセージと合わせて検索に引っかかるはず!!

自分が作成したファイルと実行できていたコピー元のファイルを比較して原因究明

  1. mainはなんか特別なメソッドらしいから、別ファイルだけどmainが同じ階層に存在しているのがおかしいのか?
  2. packageを利用してないから消したけど、利用してないけど書けばできるのか?
  3. やっぱりPATHを通す設定が必要なのか?
  4. vagrantでsshで接続して実行とかしてるけど、ファイルの保存ができてなかったりして実行ファイルを読み込めない?
  5. FTPにCyberduckを利用しているけど、それがうまく行っていない?

あとはトライアルアンドエラー

1.の対処

java_lessonsの階層深くに入っていたけど、まずは別のディレクトリを作成して移動する。

  1. java_lessonsの横にtestフォルダを作成
  2. Practice.javaをそこに移動
  3. ターミナルでtestに移動
  4. コンパイル・実行
  5. 実行できた → mainメソッドは同じ階層に一つしかアカン?
  6. test/practiceのフォルダを作成
  7. ファイルを移動
  8. コンパイル・実行
  9. できない → mainは一つしかないのに・・・
  10. またtestに移動させる
  11. コンパイル実行
  12. できた → mainの数じゃなくてディレクトリの問題
  13. ターミナルで実行したいファイルがあるディレクトリに移動してから実行
  14. できた!!

収穫
ターミナルで移動してから実行すればいい。

しかし、もともとのMyAppは階層深くにあってもできたぞ?

ということは、ターミナルで移動してから実行しなくてもできるようにする方法があるということですね。

ということで、

2.の対処

packageの利用はしてないけど、とりあえずpackage宣言をしておこう!

package com.dot.myapp;

これを冒頭につけて、最初のディレクトリ、つまり、
java_lessons/com/dot/myappにPractice.javaを戻してコンパイル実行。

いけました。

収穫
package宣言すれば階層深くにいても実行できる。
でも、さらに一つ下のディレクトリmodelにあるクラスは利用してないのに書かないといけない?

ここでまたファイルを移動させて実験。

java_lessons/comに移動させてpackage com;と宣言して実行。

できた

収穫
ターミナルがいるディレクトリより下の階層にある場合は、package宣言でそのファイルのディレクトリを書けばいい!

自分なりの結論

package化するというのは、PHPとかでfunctionやdefineだけのファイルをmodelに入れて管理するための方法かと思いきや、実行させる時に、ターミナルのいるディレクトリより下にある場合に書く必要があるということ。

自分なりの収穫

いくつか原因を列挙してからやってたまたま最初の方に解決策が見つかったけど、とにかくいろいろ実際に試してみるのが早いのかな。

エラーメッセージをそのまま検索してもひっかかるときはあるけど、それよりもいろいろ自分で考えて試して解決する方が理解は深まる。

理解が深まるということは、同じ状況じゃないにしても、似たような状況では原因として考えられるものを列挙しやすくなり、結果的に解決が早くなる!

とにかく自分で考えて自分で解決する回数をこなしてスピードを上ていこう!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0