dポイントプレゼントキャンペーン実施中!

コマンドライン引数で*で掛け算するプログラムを作成しています。
「"*"」の入力なしに
c:\myweb\keisanmain>java myweb.Keisanmain.Keisan 1 * 2
を実行してくれる掛け算のプログラムを自分なりにここまで作成しました。
実行の結果 c:\myweb\keisanmain>java myweb.Keisanmain.Keisan 1 * 2
Exception in thread "main" java.lang.NoClassDefFoundError: myweb/Keisanmain/Keisan というバグがでます。
どうかわかる方お時間があるときに教えて下さい。

package myweb.keisanmain;
class Mainkeisan{
public static void main (String args[]){

if(args.length == 0){
}else if(args.length == 1){
}else if(args.length == 2){
}else if(args.length == 3){

/**
*c:\myweb\keisanmain>java myweb.Keisanmain.Keisan 1 * 2
Exception in thread "main" java.lang.NoClassDefFoundError: myweb/Keisanmain/Keis
an */


double num =0.0;
Integer a = new Integer("args[0] * args[1]");
double b = a.doubleValue();
System.out.println(b);
}
}
}

A 回答 (16件中1~10件)

#12>catchのところをExceptionクラスからRuntimeException です。


#12>どうもcatch してないらしいです。
System.out.println は、例外をスローしません。
parseInt は、例外として NumberFormatException をスローします

>たんに入力した文字を数値として返しているようですね。これではargs[2]の意味がありません。
については、意味がわかりません。

再三言っているのに
>Integer b = Integer.parseInt(args[1]);
しているのはなぜですか

この回答への補足

エラーのとりかたを教えていただいて恐縮します。
なぜ変えなかったかは私がそこの意味をしっかり
理解しれなかったからです。教えていただいているのにわからないまま書くのではBLUEPIXYさんをはじめ
皆様にエラーの意味をわかってからソースをそのまま
書きお返事をまずは書きたかったのです。いらいらさせてすいません。本当にごめんなさい。反省しております。今度出すときはもう少しましなソースを
だします。最近皆様にたてつづけに聞いているので
毎日でなく数日おきに聞きます。それではここでまた質問するときはどうぞよろしくお願いします。

補足日時:2006/10/09 01:39
    • good
    • 0

#15の回答に間違いがありました。


m(_ _)mすみません。

【誤】
double a = Long.parseLong(args[0]);
【正】
double a = Double.parseDouble(args[0]);

【誤】
double c = Long.parseLong(args[2]);
【正】
double c = Double.parseDouble(args[2]);
    • good
    • 0
この回答へのお礼

yychi-coさん。ありがとうございました。

お礼日時:2006/10/19 11:42

こんにちは。

#11です。

#10のBLUEPIXYさんの回答のとおり、パッケージ宣言をはずしたら実行はできたんですね^^
であれば、私の回答したCLASSPATHの設定云々はまったく関係ありません。
ごめんなさいねm(_ _)m

ちなみに、私が申し上げたのはPathではなくCLASSPATHです。


ソースの内容について。

1.渡す引数は3個ですよね。数字1と演算子と数字2です。
>java Mainkeisan 1 * 2
なので、コマンドライン引数が3個だった場合にのみ実行すればよいので、下記は不要です。
if(args.length == 0){
}else if(args.length == ){
}else if(args.length == 2){
}else if(args.length == 3){
シンプルに
if(args.length == 3){
//処理
}
で良いのではないでしょうか。

2.例外が発生するのはInteger b = Integer.parseInt(args[1]);の部分です。
2個目に渡した"*"が数値に変換できないのでargs[1]をparseIntしようとするとNumberFormatExceptionが発生します。
すなわち、
Integer a = Integer.parseInt(args[0]);
Integer b = Integer.parseInt(args[1]);
Integer c = Integer.parseInt(args[2]);
の部分もtry~catchすべき内容に含みます。
数字以外の文字がparseIntに渡されれば例外が発生するのでtry~catchで囲みましょう。
tryの中に例外が発生するかもしれない処理を書き、catchで指定するのはcatchしたい例外のクラスです。
今回の場合はNumberFormatExceptionです。


そもそも演算子"*"は数値に変換する必要がないのでparseIntする必要はありません。

また、一度paseIntしてdoubleに変換しなおしているようですが、doubleで計算するのであれば、最初からLongクラスのparseDoubleで良いのでは?
double a = Long.parseLong(args[0]);
String b = args[1];
double c = Long.parseLong(args[2]);
このようにすれば、
double d = a.doubleValue();
double f = c.doubleValue();
は不要です。
num = a * c;となります。

この場合も数字以外のものを渡すとNumberFormatExceptionが発生するのでtry~catchが必要です。

掛け算しかしないプログラムであれば、args[1]の"*"を取得する必要はありませんが。
コマンドライン引数に渡された演算子によって掛け算以外の計算もしたい場合はまた別の制御が必要になります。

思った結果を得るために必要な処理を日本語で書き出してみて、それに沿ったプログラムがかかれているかどうか見直してみてください。

また、スペルミス等ないかどうかしっかり確認してください。

BLUEPIXYさんのアドバイスがまったく反映されてませんよ。

この回答への補足

まずは本当にありがとうございます。もうすこし考えます。今日はアスタリスクのところとclas pathの
ところ勉強します。yuchi-coさん。BLUEPIXYさんの
アドバイスをどうにか反映したいです。反省してます。

補足日時:2006/10/09 01:35
    • good
    • 0

引数に何が渡るのかのテストは、例えば、


class Args {
public static void main(String[] args){
for(String str : args)
System.out.println(str);
}
}
javac Args.java
java Args *
とか
java Args 1 * 2
とかしてみて下さい。
    • good
    • 0
この回答へのお礼

BLUXPYさん。するどいソースをありがとうございます。現時点では(String str : args)のところの
意味がわからないので教科書を見て調べてから
また質問します。いいソースありがとうございます。
それとこれは☆でfor for の入れ子の代理で ツリー
できますね!素敵なコードありがとうございます。

お礼日時:2006/10/09 01:47

#10>C:\myweb\keisanmain>java Mainkeisan 1 * 2


#10>となんにもでませんでした。あれ??なんでだろう。
java Mainkeisan 1 "*" 2
にして下さい。
なぜかは、args の内容を全部System.out.println してみたらわかると思います。

この回答への補足

てつや組です。うーん。BLUEPIXYさん。
するどいご指摘ありがとうございます。
たんに入力した文字を数値として返しているよう
ですね。これではargs[2]の意味がありません。
エラーがでました。どうやらこれはクラスの
問題であるみたいです。
コードーを変えてみました。
catchのところをExceptionクラスからRuntimeException です。
どうもcatch してないらしいです。
この仕様をまだよくわからないので調べます。
答えがわかる方アドバイス下さい。

変更コード

// package myweb.keisanmain;
class Mainkeisan{
public static void main (String args[]){
if(args.length == 0){
}else if(args.length == ){
}else if(args.length == 2){
}else if(args.length == 3){
double num =0.0;
Integer a = Integer.parseInt(args[0]);
Integer b = Integer.parseInt(args[1]);
Integer c = Integer.parseInt(args[2]);


double d = a.doubleValue();
double f = c.doubleValue();

try{
System.out.println(num = d * f);
System.out.println("ここでprint outします。");
System.out.println(args[0]);
System.out.println(args[1]);
System.out.println(args[2]);



}catch(RuntimeException e){
System.out.println("数字を入力してください。");
System.out.println("入力例:java Mainkeisan 1 1");
}finally{



}

}
}
}

補足日時:2006/10/08 04:07
    • good
    • 0

c:\myweb\keisanmain\Mainkeisan.classがあり、


C:\> で
java myweb.keisanmain.Mainkeisan 1 * 2
と実行して
Exception in thread "main" java.lang.NoClassDefFoundError
が出るのであれば、CLASSPATHの設定ではないでしょうか?

CLASSPATHを定義すると実行時にカレントディレクトリ(今居る場所)のクラスが検索されなくなり、コンパイルは通るが実行できないという状況になります。

コントロールパネル→システム→詳細タブ→環境変数にCLASSPATHは定義されていますか?
されていれば、今入っている値の先頭に「.;」を追加して再度試してみてください。
「.」はカレントディレクトリ、「;」は環境変数の値に複数の場所を定義する際の区切り文字です。

推測ですが。。。確認してみてください。

参考URL:http://www.javaroad.jp/java_basic2.htm

この回答への補足

yuchi-coさんお返事ありがとうございます。
やはりエラーだでます。
ユーザー環境変数にPathと編集して実行したところ
やはりエラーでました。
環境変数の設定がいけないのでしょうか。
下記します。アドバイス下さい。

C:\>path
PATH=. ;C:\Program Files\Bin;C:\Program Files\Java\jdk1.5.0_05\bin;C:\Tomcat5;\b
in;

実行例

C:\>java Mainkeisan 1 * 2
Exception in thread "main" java.lang.NoClassDefFoundError: Mainkeisan

補足日時:2006/10/08 02:53
    • good
    • 0

#9>


c:\myweb\keisanmain\Mainkeisan.class
がありますか?

いったんパッケージの指定はコメントアウトして
javac Mainkeisan.java
java Mainkeisan 1 "*" 2
が動作するようになってから考えることにしませんか

>Integer b = Integer.parseInt(args[1]);
1 "*" 2
の時
args[0] : "1"
args[1] : "*"
args[2] : "2"
です。
これもそろそろ直しませんか

この回答への補足

BULUEXPYさん。いつもすいません。
今日は秋の夜更かしさんです。
動作を確認したところ

C:\myweb\keisanmain>java Mainkeisan 1 * 2

C:\myweb\keisanmain>
となんにもでませんでした。あれ??なんでだろう。
PCは文字列かもしれないと思ってるかもしれない
のに。。。と意図したためまだよくわかってない
です。
もう少し考えてみます。
他に実行してみたら
C:\myweb\keisanmain>java Mainkeisan 1 2 2
2.0

コマンドライン引数は無視すると計算はしているようなのですが。

もしコマンドライン引数で掛け算するプログラム
がわかる方はアドバイス下さい。

補足日時:2006/10/08 02:59
    • good
    • 0

#7で


C:\>java myweb.keisanmain.Mainekeisan 1 "*" 2
Exception in thread "main" java.lang.NoClassDefFoundError: myweb/keisanmain/Mainekeisan
となるのは、スペルミスだと思います。
Mainekeisan → Mainkeisan

この回答への補足

BLUEPIXYさん。遅くまですいません。少しだけIntegerだけソースを変更ました。
またエラーがでました。スペルは確認しました。
アドバイス下さい。他にわかる方もどうぞ
アドバイス下さい。
 

C:\>java myweb.keisanmain.Mainkeisan 1 * 2
Exception in thread "main" java.lang.NoClassDefFoundError: myweb/keis
keisan
ーーーーーーーーーーーーーーーーーーーーー
package myweb.keisanmain;
class Mainkeisan{
public static void main (String args[]){
if(args.length == 0){
}else if(args.length == 1){
}else if(args.length == 2){
}else if(args.length == 3){
double num =0.0;
Integer a = Integer.parseInt(args[0]);
Integer b = Integer.parseInt(args[1]);
   Integer c = Integer.parseInt(args[2]);



double d = a.doubleValue();
double f = c.doubleValue();

try{
System.out.println(num = d * f);



}catch(Exception e){
System.out.println("数字を入力してください。");
System.out.println("入力例:java Mainkeisan 1 1");
}finally{



}

}
}
}

補足日時:2006/10/07 01:39
    • good
    • 0

#4ですが、#4の補足に対しては既に回答がでているので、省略しますが


>Integer b = new Integer("*");
は、どんな目的があってやっているのですか?
"*" (あるいは、コマンドラインの*)をInteger で扱いたい?

>if((a == b) || (b == c))
どういう意図で同値かどうかを調べているのでしょう?

この回答への補足

いつもBLUEPIXYさんありがとうございます。
配列の質問でこんなに付き合ってくださってありがと
うございます。がんばります。

Integer b = new Integer("*");

まず コマンドライン引数で
>1*2を全て>確かにIntegerクラスでは
文字列を宣言・オブジェクト化しているだけですね。アフタリスクをどうにか処理するために苦肉の
策ではちゃめちゃになってしまったんだと思います。
>if(a==b||b==c)としたのは
アスタリスクを解決するため「”1 * 2 ”」と大きくみておおきなかたまりとプログラムを作成
したかったんですが大きな勘違いですね。
これも勘違いして申し訳ないです。

補足日時:2006/10/07 00:18
    • good
    • 0

えーと、なんだかいろいろと・・・



1.ANo.2の補足です。
>また、今回の実行コマンドが引数との間にスペースがないため、
>Mainkeisan1
>と言うクラス指定になっています。
>引数とクラス名のスペースを忘れないようにしましょう。
は、ANo.1のかたの解答に付いている補足で、javaコマンドで実行する際にクラス名と引数の間にスペースが入っていないようでしたので、そちらを指摘させていただきました。

2.Ano.5の部分に付いている補足でのエラーの意味は、Javaコマンドで指定されたクラスが見つからないという物です。
クラスの指定の際に、パッケージが入力されていないためだと思います。
java myweb.keisanmain.Mainekeisan 1 * 2
のように入力されれば、また違った結果になると思います。

3.ANo.6の方に対する補足でのエラーは、パッケージの宣言がimport宣言よりもあとにあるからかな?と思います。
まずpackage 宣言、次にインポート宣言をしてください。
そもそも、同じパッケージの場合はインポートは不要だったと思います。

以上です。

この回答への補足

kscKaneさん。お返事ありがとうございます。
今回は詳しく貴方様に書いてない補足までも
ご説明していただき心がじーんとうれしくなり
ました。本当にありがとうございます。
さて疑問点があります。
1.はありがとうございます。よくわかることができました。
2と3がよくわかりません。アドバイスいただけませんか。
実行してみましたが自分なりに本を調べてみたのですが
よくうまくいきません。どうかよろしくお願い申し上げます。
以下に詳細に書きますのでどうか見にくいとは思いますが
お時間があるときにお返事を下さい。また他の方わかる方
どうかアドバイス下さい。
2.のことです。

ソースは私のNo5に対する補足にあります。
C:\myweb\keisanmain>javac -d ./ Mainkeisan.java
とC:\myweb\keisanmain のディレクトリのディレクトリでjavac -d ./ Mainkeisan.javaとコンパイル。
アドバイス通りに実行してみました。
C:\>java myweb.keisanmain.Mainekeisan 1 "*" 2
Exception in thread "main" java.lang.NoClassDefFoundError: myweb/keisanmain/Main
ekeisan
やはりここでエラーが出てしまいますksckaneさんのアドバイス通りではないのでしょうか。
解釈が間違えていたらご指摘お願い申し上げます。
他では出来るかぎりどうにか苦肉の策でどうにか 実行してみました。パッケージの実行がうまくいかなかったので
C:\myweb\keisanmain のディレクトリで  コンパイル方法として javac -d ./ Mainkeisan.java
で作成したところMainkeisan.classがC:\myweb\keisanmain\myweb\keisanmain のディレクトリ構成で
おこっなったらやはりそんなクラスがないとおこられました。以下です。

C:\myweb\keisanmain\myweb\keisanmain>java Mainkeisan 1 "*" 2
Exception in thread "main" java.lang.NoClassDefFoundError: Mainkeisan (wrong nam
e: myweb/keisanmain/Mainkeisan)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
4)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
3.のことはご指摘の結果、エラーがとれました。でも
実行の段階でエラーが出ます。なぜかよくわかりません。
ソースは私のNo6の補足にあります。

C:\myweb>java goo.Mainkeisan 1
Exception in thread "main" java.lang.NoClassDefFoundError: goo/Mainkeisan

補足日時:2006/10/07 00:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!