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

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

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

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

Sublime Text

SublimeTextとは、オーストラリアのSublime HQ Pty Ltdが提供しているテキストエディターのことです。Mac/Windows/Linuxでの利用が可能で、柔軟にカスタマイズできたり、多くの言語に対応していくこともあり、海外や日本国内でも人気のあるエディターです。

Q&A

解決済

1回答

5675閲覧

javaのコンパイルはできるのに、クラスが実行できない。

nana777

総合スコア16

Java

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

Sublime Text

SublimeTextとは、オーストラリアのSublime HQ Pty Ltdが提供しているテキストエディターのことです。Mac/Windows/Linuxでの利用が可能で、柔軟にカスタマイズできたり、多くの言語に対応していくこともあり、海外や日本国内でも人気のあるエディターです。

0グッド

0クリップ

投稿2019/05/31 00:34

javaのクラスを実行したい

javaでジャンケンをするクラスをターミナルで実行したいのですが
実行できません。ちなみにコンパイルはできます。
ジャンケンゲームの内容は5回勝負で何回勝ったか勝敗を出すゲームです。ただし、あいこもループする。
環境はsublimetext と ターミナルです。

発生している問題・エラーメッセージ

エラーメッセージ$ java janken battle エラー: メイン・クラスjankenを検出およびロードできませんでした 原因: java.lang.NoClassDefFoundError: janken/java/Janken (wrong name: janken)

該当のソースコードpackage janken.java;

class Janken{

public static void main(String[]args){
int player = 0;
int cpu = 0;
int winCount = 0;
int loseCount = 0;

System.out.println("私とジャンケンで勝負しましょう。"); for(int i=0; i<6; i++){ player = Battle.player(); cpu = Battle.cpu(); Battle.battle(loseCount, winCount, player, cpu); if(winCount >loseCount){ System.out.println(winCount + "勝であなたの勝ちです!"); }else if(winCount == loseCount){ System.out.println("引き分けです!"); }else if(winCount < loseCount){ System.out.println(loseCount + "敗であなたの負けです。"); }

}
}
}

package janken.java;

class Battle{

public static int player(){
String[]shape = {"グー", "チョキ","パー"};
System.out.println("最初はグー、ジャンケン...");
System.out.println("数字を入力してください。グー = 0、チョキ = 1、パー =2のどれかを入力してください。");
int player = new java.util.Scanner(System.in).nextInt();
if (player < 3){
System.out.println("ぽん!→→→player:" + shape[player]);
}else{
System.out.println("0、1、2以外は打ち込まないで下さい");
}
return player;
}
public static int cpu(){
String[]shape = {"グー", "チョキ","パー"};
int cpu = new java.util.Random().nextInt(3);
System.out.println("ぽん!→→→cpu:" + shape[cpu]);
return cpu;
}

public static void battle(int loseCount, int winCount, int player, int cpu){ String draw = "DRAW"; String win = "You WIN"; String lose = "You LOSE"; switch(cpu){ case 0: if(player == 0){ System.out.println(draw); }else if(player == 1){ System.out.println(win); winCount += 1; }else if(player == 2){ System.out.println(lose); loseCount += 1; } break; case 1: if(player == 0){ System.out.println(win); winCount += 1; }else if(player == 1){ System.out.println(draw); }else if(player == 2){ System.out.println(lose); loseCount += 1; } break; case 2: if(player == 0){ System.out.println(lose); loseCount += 1; }else if(player == 1){ System.out.println(win); winCount +=1; }else if(player == 2){ System.out.println(draw); } break; }

}
}

java

試したこと

echo %CLASSPATH%でクラスパスを通す。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2019/05/31 00:42

コードはマークダウンのcode機能を利用してご提示ください。 また、 > echo %CLASSPATH%でクラスパスを通す これでは「CLASSPATHという名前の変数」を出力ししただけになりませんか?
nana777

2019/05/31 01:19

再編集しました。ご指摘ありがとうございます。 もう一度調べてやってみます。
m.ts10806

2019/05/31 01:23

編集反映されていないようなので再度やってみてください
guest

回答1

0

ベストアンサー

勘違いが三つあります。
0. javaコマンドに指定するのはファイル名ではなくクラス名
0. javaコマンドに指定するのはエントリーポイントを含んだ起動クラス
0. パッケージを作った際は、パッケージのルートまで戻って実行すること

1と2を踏まえると、java janken buttle ではなく java Janken と打つのが正しいです。

3を踏まえると、
jankenディレクトリの親まで返り、java janken/java/Janken と叩くのが正しいです。

Javaのファイル名は特段の理由が無い限りクラス名と同じくすることをお勧めします。

コードの書き方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押して下さい。
Java

投稿2019/05/31 00:49

編集2019/05/31 01:16
LouiS0616

総合スコア35658

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

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

LouiS0616

2019/05/31 00:59

package-privateなクラスはパッケージ内にカプセルされて欲しいので、ファイル名=クラス名 の原則が崩れるのは順当な仕様のように思えます。
m.ts10806

2019/05/31 01:03

なるほど。質問者ではないですが勉強になりました。
退会済みユーザー

退会済みユーザー

2019/05/31 01:12

そもそも クラスファイルになるときに クラス名.class になるから 内部の開発者にたいして隠蔽するだけだから百害あって一利無し
LouiS0616

2019/05/31 01:19 編集

@asahina1979 さん 確かにコンパイルするとメリットが消し飛ぶのですよね。。。 インナークラスも匿名クラスもぼろぼろ漏れ出てきますし、なんとも残念な感じです。
nana777

2019/05/31 01:21

編集しました。ご指摘ありがとうございます。 Java Janken でやっても同じ結果になってしまいます。。
LouiS0616

2019/05/31 01:24

@nana777 さん 回答を編集してあります。ページを更新してご確認ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問