🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Q&A

解決済

3回答

2184閲覧

Java コマンドライン引数でのデータ型による条件分岐

tedmosby

総合スコア46

Java

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

0グッド

0クリップ

投稿2019/10/31 06:26

現在、Javaプログラムで3つの異なるデータ型(int/float/String)のコマンドライン引数を順不同にうけとって、それらを型判定し適切な変数に代入するプログラムを書いています。

以下のように、instanceofを利用して型判定しているのですが、eclipce上でエラーが出てしまいます。
instaceof以外にも型判定する方法はあるのでしょうか??

初心者ですので、お手柔らかにご教授いただけると幸いです。

java

1String valStr; 2int valInt; 3double valDouble; 4 5if(args[i] instanceof String) { 6 valStr = args[i]; 7}else if(args[i] instanceof Integer) { 8 valInt = args[i]; 9}else if(args[i] instanceof Float) { 10 valFloat = args[i]; 11}else { 12 System.out.println(" type error!!"); 13}

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

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

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

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

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

skytomo

2019/10/31 06:33

どのようなエラーが出ているかを明記してください. エラーログなどを追加してくれると,対処がしやすいです.
guest

回答3

0

現在、Javaプログラムで3つの異なるデータ型(int/float/String)のコマンドライン引数を順不同にうけとって

コマンドライン引数は常にString[]かと思います。

投稿2019/10/31 06:29

maisumakun

総合スコア145975

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

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

maisumakun

2019/10/31 06:31

直接mainを書いた場合、「public static void main(String[] args)」とあるように、コマンドライン引数はすべてStringとして来て、配列に入っています。
tedmosby

2019/11/01 09:41

Stringであることを見落としていました。。。
guest

0

この質問に対する回答は maisumakun さんの回答で合っています.

ただ,もし,あなたが引数をInteger型に変換できるときにInteger型に変換したいという意図のもと,この質問をしたのなら,
①Integer型に変換できるかチェックする
②String型からInteger型に変換する
の二段階を踏むことになります.

①Integer型に変換できるかチェックする
に関しては
正規表現を使ってチェックする方法がいいでしょう.
こちらが参考になると思います.

②String型からInteger型に変換する
に関しては

java

1valInt = Integer.parseInt(args[i]);

とすればいいでしょう.

投稿2019/10/31 06:45

skytomo

総合スコア35

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

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

tedmosby

2019/11/01 09:41

ありがとうございます! ②の方法でやってみました????
guest

0

ベストアンサー

eclipce上でエラーが出てしまいます。

きっとコンパイルエラーが出ているのですね。

Java

1String valStr; 2int valInt; 3double valDouble;

ここはmainメソッドのローカル変数だとすると初期化が必要です。

Java

1} else if ( args[i] instanceof Integer ) {

Java

1} else if ( args[i] instanceof Float ) {

もエラーですね。args[i]String 型なので、互換性のない型に対して instanceof 演算子を使用しているので文法的に誤りです。
ついでに言うと FloatDouble は違いますので、この処理の中ではどちらかに統一して使いましょう。

次いで・・・

Java

1valInt = args[i];

Java

1valFloat = args[i];

がエラーになっていると思います。
前者は型が合わない、後者は変数が存在しない、という状態。
まず後者は、valDouble ですね。
それを直すと前者と同様に型が合わないというエラーになるでしょう。

args は、おそらく main(String[] args)args ですよね。

そうだとすると、args[i]String 型です。
一方、valIntvalDouble はそれぞれ、int型、double型ですので、 String 型の args[i] を代入しようとしても型が一致しないというエラーになります。

エラーはそんなところかと。

また、instanceof演算子は、オブジェクトがどの型であるかを判定するためのものですから、instanceof の使用している行でコンパイルエラーにならなかったとしても、書かれている if ~ else if 文の各条件において、常に最初の条件で true になってしまって他の else if や、最後の else の処理が実行されることはないでしょう。

どうするかというのは他の方の回答にある通り、args[i] の文字列が整数とみなせるものか、浮動小数点数と見なせるものかを判定して、型を変換して値を代入する必要があります。どちらでもない場合は常に String型 です。

Java

1String valStr = ""; 2int valInt = 0; 3double valDouble = 0.0; 4 5if ( 何らかの方法で args[i] の文字列が整数と言えるかを判定 ) { 6 valInt = 何らかの方法で整数に変換(args[i]); 7} else if ( 何らかの方法で args[i] の文字列が浮動小数点数と言えるかを判定 ) { 8 valDouble = 何らかの方法で浮動小数点数に変換(args[i]); 9} else { 10 valStr = args[i]; 11} 12

もし各変数の未設定状態を把握したいのであれば、intdouble をそれぞれ IntegerDouble に変えて、変数の初期化は valStr も含めて null を設定しましょう。
そうすることで、あとで null の変数はコマンド行引数からの値設定がされていない状態だということが判定できます。

Java

1String valStr = null; 2Integer valInt = null; 3Double valDouble = null;

Java は型にうるさいのでスクリプト系の動的型付けとは趣が異なります。

投稿2019/11/01 04:59

編集2019/11/01 05:07
ironya

総合スコア456

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

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

ironya

2019/11/01 05:05 編集

> どちらでもない場合は常に String型 です。 と書きましたが、コマンド行引数に何も指定しない場合は、最初の args[i] を参照しようとした時点で、IndexOutOfBoundsException になるので、あくまで一つ以上のコマンド行引数が指定された場合の話です。 念のため。
tedmosby

2019/11/01 09:48 編集

回答ありがとうございます! コマンドライン引数がString型であることを完全に見落としていました..... Javaは変数の初期化が必要なんですね、勉強になります! ぼくのやりたかったことは、コマンドライン引数の型を判定してその型のための変数に格納して表示することだったので、以下のようなfor文で実現してみました???? ``` for(int i=0; i<args.length; i++){ if(isInteger(args[i])) { valInt = Integer.parseInt(args[i]); System.out.println("valInt = " + valInt); }else if(isDouble(args[i])) { valDouble = Double.parseDouble(args[i]); System.out.println("valDouble = " + valDouble); }else { valStr = args[i]; System.out.println("valStr = " + valStr); } System.out.println("args[" + i + "] = " + args[i]); } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問