• ベストアンサー

終了条件文字列 「exit」

(1) 「1以上の整数を入力:」と表示 (2) 1行読み込みをし、入力された値が文字列「exit」と等しいかどうかをチェックし、「exit」と等しい場合はプ ログラムを終了する。 (3) 入力された値が1以上の場合、階乗の計算 という問題で、どうしても「exit」で終わることができません。 できても、NumberFormatException になって終わりってしまいます。 こんな説明で理解してもらえるか分かりませんが、教えていただけませんか。

質問者が選んだベストアンサー

  • ベストアンサー
  • takaP-
  • ベストアンサー率79% (83/105)
回答No.5

そのものズバリ。宿題じゃなければ良いけど(笑 import java.io.* ; class Test { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ; while(true) { System.out.print("1以上の整数を入力:") ; System.out.flush() ; String s = br.readLine() ; try { int i = Integer.parseInt(s) ; if(i>0) { int answer = 1 ; for(int j=1 ; j<=i ; j++) { answer*=j ; } System.out.println(i+"の階乗は"+answer) ; continue ; } else { System.out.println("不正な入力値です") ; } } catch(NumberFormatException ne) { if("exit".equals(s)) { System.exit(0) ; } else { System.out.println("不正な入力値です") ; } } } } catch(IOException ie) { ie.printStackTrace() ; System.exit(0) ; } } }

suzuno
質問者

お礼

そのものずばりなんてすごくありがたいです。 何日もエラーとの格闘だったもので。半ば諦めていました。とても勉強になります。 長文を書いていただいてすみません。ありがとうございました。

その他の回答 (4)

  • covachan
  • ベストアンサー率38% (46/120)
回答No.4

皆さんの意見をまとめるとこんな感じですか? //sample public class CheckNumber{ static public void main(String[] arg){ int i = 0; //引数のチェック if(arg.length==0){ System.out.println("エラー: 引数を入力してください"); return; } //exitのチェック if("exit".equals(arg[0]))return; try{ i=Integer.parseInt(arg[0]); }catch(NumberFormatException nfe){ System.out.println("エラー: 数値を入力してください"); return; } //数値のチェック if(i<1){ System.out.println("エラー: 1以上の数値を入力してください"); return; } } // ここに階乗計算処理 } exitの評価は arg[0].equals("exit") とはしないほうがよいと思います。 この場合は問題ないとは思いますが、変数にnullが入る場合もあるので、普段から定数を頭に持ってくるほうがいいと思います。

suzuno
質問者

お礼

わざわざまとめてくださってありがとうございます。 組み立て方がよく分かりました。 arg[0].equals("exit")とはしないようにします。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.3

逆にInteger.parseInt()の前にequals("exit")の判断をしてしまうという手もありますね。

suzuno
質問者

お礼

おお、equals()なんてありましたね。 私って全然覚えてなくて駄目ですね。 いったい文字はどのようにして比較するんだぁ・・なんて考えていました。 ありがとうございました。

  • tajiri
  • ベストアンサー率45% (5/11)
回答No.2

>書き忘れてましたが、NumberFormatException になったら、「エラー 値は1以上の数字ではありません」と表示するようにしなければならないんですよ…。 それならcatchしたあとでifで条件分岐してやれば できると思いますがいかがでしょう。 ちなみにAPIを見るのはプログラムを組むときの 基本ですのでお忘れなく。 (すでにあるものを自分で実装してしまうというのもよくある話です)

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/index.html
suzuno
質問者

お礼

なるほど、catchした後にifとは気が付きませんでした。 ずっと、数値変換する前にif・・とかで考えていたものですから。 二度にわたるご回答ありがとうございました。

  • tajiri
  • ベストアンサー率45% (5/11)
回答No.1

Integer.parseInt()を使ってますよね。 その場合、数字に変換できない場合NumberFormatException を 投げる仕様になっています。 Integer.parseInt()のあたりをtryでくくり NumberFormatException をcatchして 終了処理を記述してください。 (java.lang.String)↓

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Integer.html#parseInt
suzuno
質問者

お礼

回答ありがとうございます。 Integer.parseInt()を使ってます。なるほど、そこをtryをくくるんですね。 でも書き忘れてましたが、NumberFormatException になったら、「エラー 値は1以上の数字ではありません」と表示するようにしなければならないんですよ…。すみません。 教えていただいたHP、参考にさせていただきます。

関連するQ&A