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

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

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

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

Q&A

解決済

1回答

12836閲覧

[Java]生年月日を渡したら年齢を計算するプログラム

fall

総合スコア12

Java

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

0グッド

0クリップ

投稿2020/04/21 04:11

編集2020/04/21 06:56

引数として生年月日を渡したらそれを元に年齢を計算するプログラムを作りです。
予め生年月日を記載して年齢を計算することは出来ましたが、ここから生年月日を渡す(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"); } } } } }

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

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

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

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

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

maisumakun

2020/04/21 04:16 編集

> 引数として生年月日を渡したらそれを元に年齢を計算するプログラムを作りました。 渡された引数(args)を使っている形跡がないのですが、それは大丈夫ですか?
fall

2020/04/21 04:19

申し訳ございません。argsも必要ですね。 内容を修正しました。
m.ts10806

2020/04/21 04:25

どのように実行されることを想定としたプログラムなのでしょうか。 今のところコマンド実行でしょうか。となると「生年月日を渡す」は必然と「コマンドから」になると思いますが、どのように考えられてますか?
fall

2020/04/21 04:29

java Age 2000/04/21 上記のようにコマンドからの実行を想定しています。
Zuishin

2020/04/21 04:37

args[0] がコマンドライン引数です。 渡されたかどうかは args.length でわかります。 LocalDate.parse に失敗する(不正な日付)だと DateTimeParseException が発生します。 https://docs.oracle.com/javase/jp/8/docs/api/java/time/format/DateTimeParseException.html それをキャッチすれば不正な日付に対応できます。 未来の日付を入力すると age がマイナスになります。それをチェックすれば未来の日付にも対応できます。
fall

2020/04/21 05:57

ご教示ありがとうございます。 いただいた内容(ageのマイナスパターンは未記載)からコードを編集してみましたが、コンパイル時にエラーが出てしまいます。 どこをどう直せばよいでしょうか。 ご教示いただければ幸いです。
Zuishin

2020/04/21 06:02

args.length をパースしようとしているからですね。
fall

2020/04/21 06:23

内容を修正しました。 内容はこれであっていますでしょうか。 またtryの中のargs.lengthが渡されたかどうかのチェックはどのようなコードにすればよいでしょうか。
Zuishin

2020/04/21 06:27

args は String[] です。args[0] は文字列なので、int にキャストできません。そして parse は文字列に対して行うものです。 コマンドライン引数を空白で区切ったものが args に入ります。コマンドライン引数はあるとは限らないので args[0] もあるとは限りません。args[0] が無いときにアクセスしようとすると例外が起こるので、先に length をチェックします。
Zuishin

2020/04/21 06:32

例えば java Age 2000/04/21 abc のように実行すると、args[0] は 2000/04/21 に、args[1] は abc になります。これらは文字列です。args.length は args 配列の大きさが入るので、ここでは 2 になります。これが 0 の時はコマンドライン引数はありません。
fall

2020/04/21 07:00

ありがとうございます。 いただいた内容を参考に質問欄にコードを修正しました。 以下の箇所でコンパイル時に「シンボルを見つけられません」というエラーが発生しました。 これらの箇所で起こっているクラスや変数は定義されていないということでしょうか。 ・catch ( DateTimeParseException e ) ・long age = ChronoUnit.YEARS.between(localBirdhdate, nowDate);
Zuishin

2020/04/21 07:07

import してないからです。DateTimeParseException はリンクしましたが、確認しましたか? そこで名前空間を調べてください。
Zuishin

2020/04/21 07:44

うまく動いたなら、今ある回答をベストアンサーに選んでください。
fall

2020/04/21 07:58

ありがとうございました。無事に動かせることが出来ました。
guest

回答1

0

ベストアンサー

コピーして改変させてもらいました。
動作確認済み

Java

1import java.time.LocalDate; 2import java.time.format.DateTimeFormatter; 3import java.time.format.DateTimeParseException; 4import java.time.temporal.ChronoUnit; 5 6public class Age { 7 public static void main(String[] args) { 8 9 // 引数が1つであることを確認し、違った場合エラー(これがないと、引数がなかった場合にOut ofなんとかexceptionが出ます) 10 // lengthは、その配列の長さをintで返す?ものです。 11 // コンパイルエラーが出たのは、Stringしか受け付けない関数にintを渡したからかと思います。 12 if (args.length != 1) { 13 System.err.println("must have only 1 argument"); 14 return; 15 } 16 17 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); 18 19 LocalDate localBirthdate; 20 // 生年月日を表す文字列から、LocalDateを生成 21 try { 22 // argsは配列なので、[]で~~項目番号?(呼び方わからん)~~インデックスを指定して取り出します。 23 // その番号は最初の方から0,1,2,3...と続いていきます。 24 // 今回は1つ目を使うので、args[0]を指定すれば、一つ目の引数が使えます。 25 localBirthdate = LocalDate.parse(args[0], formatter); 26 } catch (DateTimeParseException e) { 27 System.err.println("Error"); 28 System.err.println(e); 29 return; 30 } 31 32 // 現在の日付を取得 33 LocalDate nowDate = LocalDate.now(); 34 35 if (nowDate.compareTo(localBirthdate) >= 0) { 36 // 年齢を計算する 37 long age = ChronoUnit.YEARS.between(localBirthdate, nowDate); 38 // 年齢 39 System.out.println("年齢: " + age); 40 } else { 41 System.err.println("The date is the future"); 42 } 43 } 44} 45

投稿2020/04/21 06:33

編集2020/04/21 08:30
ozraru

総合スコア150

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

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

fall

2020/04/21 06:54

ありがとうございます。 試してみたところ、以下の箇所でコンパイル時に「シンボルを見つけられません」というエラーが発生しました。 原因はなんでしょうか? ・catch ( DateTimeParseException e ) ・long age = ChronoUnit.YEARS.between(localBirdhdate, nowDate);
ozraru

2020/04/21 07:15

直しました。 最初の方はDateTimeParseExceptionのimport忘れ、 2つ目はlocalBirthdateの宣言をtry内で行っていたため、tryの外では無効なことが原因でした。
fall

2020/04/21 07:58

ありがとうございました。無事に動かせることが出来ました。
swordone

2020/04/21 08:19

誕生日が今日から1年未満の未来であれば、「0歳」となるのでお気をつけください。
fall

2020/04/22 06:41 編集

1年未満の記載ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問