引数として生年月日を渡したらそれを元に年齢を計算するプログラムを作りです。
予め生年月日を記載して年齢を計算することは出来ましたが、ここから生年月日を渡す(args)処理と生年月日が不正な場合のエラーパターンを作成するにはどうすればよいでしょうか。
生年月日が数値以外の場合、現在の日付より未来の場合など起こりうるあらゆるパターンを作りたいです。
また、エラーの場合にはメッセージも出すようにしたいです。
ご教示いただけますと幸いです。
Java
1import java.time.LocalDate; 2import java.time.format.DateTimeFormatter; 3import java.time.temporal.ChronoUnit; 4 5public class Age { 6 public static void main(String... args) { 7 8 // 生年月日 9 String birthdate = "2000/04/21"; 10 11 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); 12 13 // LocalDateを生成 14 LocalDate localBirdhdate = LocalDate.parse(birthdate, formatter); 15 16 // 現在の日付を取得 17 LocalDate nowDate = LocalDate.now(); 18 19 // 年齢計算 20 long age = ChronoUnit.YEARS.between(localBirdhdate, nowDate); 21 22 // 年齢出力 23 System.out.println("年齢: " + age); 24 } 25}
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; public class Age { public static void main(String[] args) { if (args.length != 1) { System.err.println("must have only 1 argument"); return; } DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); // LocalDateを生成 try { LocalDate localBirdhdate = LocalDate.parse(args[0], formatter); } catch ( DateTimeParseException e ) { System.err.println("Error"); System.err.println(e); return; } // 現在の日付を取得 LocalDate nowDate = LocalDate.now(); // 年齢を計算する long age = ChronoUnit.YEARS.between(localBirdhdate, nowDate); if (age >= 0) { // 年齢 System.out.println("年齢: " + age); } else { System.err.println("The date is the future"); } } } } }
> 引数として生年月日を渡したらそれを元に年齢を計算するプログラムを作りました。
渡された引数(args)を使っている形跡がないのですが、それは大丈夫ですか?
申し訳ございません。argsも必要ですね。
内容を修正しました。
どのように実行されることを想定としたプログラムなのでしょうか。
今のところコマンド実行でしょうか。となると「生年月日を渡す」は必然と「コマンドから」になると思いますが、どのように考えられてますか?
java Age 2000/04/21
上記のようにコマンドからの実行を想定しています。
args[0] がコマンドライン引数です。
渡されたかどうかは args.length でわかります。
LocalDate.parse に失敗する(不正な日付)だと DateTimeParseException が発生します。
https://docs.oracle.com/javase/jp/8/docs/api/java/time/format/DateTimeParseException.html
それをキャッチすれば不正な日付に対応できます。
未来の日付を入力すると age がマイナスになります。それをチェックすれば未来の日付にも対応できます。
ご教示ありがとうございます。
いただいた内容(ageのマイナスパターンは未記載)からコードを編集してみましたが、コンパイル時にエラーが出てしまいます。
どこをどう直せばよいでしょうか。
ご教示いただければ幸いです。
args.length をパースしようとしているからですね。
内容を修正しました。
内容はこれであっていますでしょうか。
またtryの中のargs.lengthが渡されたかどうかのチェックはどのようなコードにすればよいでしょうか。
args は String[] です。args[0] は文字列なので、int にキャストできません。そして parse は文字列に対して行うものです。
コマンドライン引数を空白で区切ったものが args に入ります。コマンドライン引数はあるとは限らないので args[0] もあるとは限りません。args[0] が無いときにアクセスしようとすると例外が起こるので、先に length をチェックします。
例えば java Age 2000/04/21 abc のように実行すると、args[0] は 2000/04/21 に、args[1] は abc になります。これらは文字列です。args.length は args 配列の大きさが入るので、ここでは 2 になります。これが 0 の時はコマンドライン引数はありません。
ありがとうございます。
いただいた内容を参考に質問欄にコードを修正しました。
以下の箇所でコンパイル時に「シンボルを見つけられません」というエラーが発生しました。
これらの箇所で起こっているクラスや変数は定義されていないということでしょうか。
・catch ( DateTimeParseException e )
・long age = ChronoUnit.YEARS.between(localBirdhdate, nowDate);
import してないからです。DateTimeParseException はリンクしましたが、確認しましたか?
そこで名前空間を調べてください。
うまく動いたなら、今ある回答をベストアンサーに選んでください。
ありがとうございました。無事に動かせることが出来ました。
回答1件
あなたの回答
tips
プレビュー