質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

746閲覧

Javaプログラムが動かない

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/06/12 01:49

編集2019/06/13 10:05

Java8の参考書でEclipseを使って勉強しています。
以下のC:\pleiades\eclipse\JavaFX_topic\src\topic22\execprog.javaコードを実行すると、
コンソール画面には
「起動しました。」
「終了しました。」と出て終了します。

「起動しました。」のあとにC:\pleiades\eclipse\JavaFX_topic\bin\topic18\AnimeClock.class
が実行されて
「AnimeClock」が表示されると思われますが、表示されないで終了します。

下が期待される実行結果です。
イメージ説明
コード内4行目: String cmdline = "java AnimeClock"; あたりの設定が間違っていそうなのですが、どうしたらいいかわかりません。
C:\pleiades\eclipse\JavaFX_topic\src\topic22\execprog.java
C:\pleiades\eclipse\JavaFX_topic\src\topic18\AnimeClock.java        
C:\pleiades\eclipse\JavaFX_topic\bin\topic22\execprog.class
C:\pleiades\eclipse\JavaFX_topic\bin\topic18\AnimeClock.class
C:\pleiades\eclipse\JavaFX_topic\bin\topic18\AnimeClock$1.class

と出ます。

各々のtopic18にはAnimeClock.classとtopic22にはexecprog.classができています。

よろしくおねがいいたします。

Java

1package topic22; 2 3import java.io.IOException; 4 5public class execprog { 6 7 public static void main(String[] args) { 8 9 String cmdline = "java AnimeClock"; // 実行するコマンドライン 10 11 try { 12 13 Process proc = Runtime.getRuntime().exec(cmdline); 14 15 System.out.println("起動しました。"); 16 17 proc.waitFor(); // 終了を待つ 18 19 System.out.println("終了しました。"); 20 21 } catch( SecurityException e) { 22 23 System.out.println("セキュリティマネージャがサブプロセスの作成を許可しません。"); 24 25 } catch( IOException e ) { 26 27 System.out.println("入出力エラーが発生しました。"); 28 29 } catch( NullPointerException e ) { 30 31 System.out.println("コマンドラインがnullです。"); 32 33 } catch( IllegalArgumentException e ) { 34 35 System.out.println("コマンドが指定されていません。"); 36 37 } catch( Exception e ) { 38 39 System.out.println("エラーです。" + e.getMessage()); 40 41 } 42 } 43} 44

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2019/06/12 10:19

本質問はJavaFXにあまり関係しないと思うので、もし自分の回答内容で問題が解決したならタグからJavaFXを外しJavaを追加しておいてください。
退会済みユーザー

退会済みユーザー

2019/06/12 21:00

はい、わかりました。
guest

回答1

0

ベストアンサー

javaコマンドでパッケージtopic22にあるクラスAnimeClockのmainメソッドを動かしたい場合は

java topic22.AnimeClock

と書くことになっています。普段Eclipseなどを使ってアプリケーションを動かすときあまりこういうことを意識しないかも知れませんが、Javaを学ぶなら「必ず知ってなければならない常識」といってもよい仕様なので覚えておきましょう。ちなみに

java AnimeClock

と書くと「デフォルトパッケージのAnimeClockクラス」と解釈されてしまいます。


追記:

Eclipseからexecprogを起動するとカレントディレクトリーはプロジェクトディレクトリーになっていると思います。それはmainメソッドの中に

System.out.printf("current directory = %s%n", System.getProperty("user.dir"));

と書いておくと確認できます。多分

"C:\pleiades\eclipse\JavaFX_topic

と表示されることでしょう。さて、この状態で

java topic22.AnimeClock

を実行してjavaコマンドを起動したときjavaコマンドはどうやってtopic22.AnimeClockクラスのクラスファイル

C:\pleiades\eclipse\JavaFX_topic\bin\topic18\AnimeClock.class

の場所を知ることができるでしょうか?カレントディレクトリーからの相対位置は

./bin/topic22/AnimeClock.class

になりますが、javaコマンドはbinディレクトリーの下にパッケージに応じたクラスファイルが配置されていることなんぞ知りません。Eclipseが勝手にそういうふうにしているだけであってjavaコマンドはそういうことを全然知らないのです。

それゆえjavaコマンドを起動する際には「クラスファイルをどこから探せばいいよ」ってことを教えてあげる必要があります。それを教えるためのオプションが-cpつまりクラスパスの指定オプションです。

java -cp bin topic22.AnimeClock
あるいは
java -cp C:\pleiades\eclipse\JavaFX_topic\bin

と指定して動かせばjavaコマンドはめでたくクラスファイルを見つけることができるでしょう。


少々教条的な言い方になりますが・・・javaなりjavacなりのコマンドを使うならそれらコマンドにどのようなオプションがあるか調べておいてください。

個人的な意見ですが、以下のオプションは最低限知っておく方がよいと思います。これを知らないとごく典型的なものでもコンパイルや実行がうまくいかないと思います。

javac:

  • -cp
  • -d
  • -sourcepath
  • 文字セット関連(-J-Dfile.encoding=xxxや-encodingオプション)

java:

  • -cp
  • 文字セット関連(-Dfile.encoding=xxxオプション)

どこを見ればわかるかは経験に応じてまちまちになるかと思います。java --helpなどで出てくる簡単な説明を見ても親切な説明ではないのでチンプンカンプンかも知れません。やはりインターネット上で解説ページを探したり教科書を見るとかしたほうがよいと思います。しかしきちんとした仕様を調べることを忘れないでください。Oracleが提供している日本語のJava8関連のヘルプは以下のあたりから探せます。
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/index.html#basic

(なお、上記はJava8までの話であり最新のJava言語にはモジュールの仕様が追加されているのでモジュール関連オプションも必須知識になると思います。)

投稿2019/06/12 09:39

編集2019/06/12 10:14
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/12 21:07

ありがとうございます。相対アドレスでよく迷っています。だいぶ勉強したと思いますが、独学なので基礎が出来てないみたいです。親切なアドバイスで大変助かりました。 このあたりを、少し集中して勉強します。
退会済みユーザー

退会済みユーザー

2019/06/12 21:08

今日帰ってきたら、やってみます。
退会済みユーザー

退会済みユーザー

2019/06/13 09:53

すみませんAnimeClock.javaのpackageはpackage topic18となっています。 もう一度教えていただけませんか。そのあとでパスの勉強をしたいと思います。
退会済みユーザー

退会済みユーザー

2019/06/13 09:56

すみません、AnimeClock.javaのパッケージはpackage topic18となっていました。 再度、説明していただけませんか。お願いいたします。
KSwordOfHaste

2019/06/13 11:15

あ、自分の回答ではtopic22にあると勘違いして書いてました。混乱させたなら申し訳ないです。けど、topic22と違うパッケージだとしても考え方は同じです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問