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

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

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

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

解決済

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

fall
fall

総合スコア0

Java

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

1回答

0評価

0クリップ

5158閲覧

投稿2020/04/21 04:11

編集2022/01/12 10:58

引数として生年月日を渡したらそれを元に年齢を計算するプログラムを作りです。
予め生年月日を記載して年齢を計算することは出来ましたが、ここから生年月日を渡す(args)処理と生年月日が不正な場合のエラーパターンを作成するにはどうすればよいでしょうか。
生年月日が数値以外の場合、現在の日付より未来の場合など起こりうるあらゆるパターンを作りたいです。
また、エラーの場合にはメッセージも出すようにしたいです。
ご教示いただけますと幸いです。

Java

import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; public class Age { public static void main(String... args) { // 生年月日 String birthdate = "2000/04/21"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); // LocalDateを生成 LocalDate localBirdhdate = LocalDate.parse(birthdate, formatter); // 現在の日付を取得 LocalDate nowDate = LocalDate.now(); // 年齢計算 long age = ChronoUnit.YEARS.between(localBirdhdate, nowDate); // 年齢出力 System.out.println("年齢: " + age); } }
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; public class Age { public static void main(String[] args) { int birthdate = args[0]; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); LocalDate localBirdhdate = LocalDate.parse(birthdate, formatter); try { args.length; } catch ( DateTimeParseException ne ) { System.err.println("Error"); return; } // 現在の日付を取得 LocalDate nowDate = LocalDate.now(); // 年齢を計算する long age = ChronoUnit.YEARS.between(localBirdhdate, nowDate); // 年齢 System.out.println("年齢: " + age); } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

maisumakun
maisumakun

2020/04/21 04:16 編集

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

2020/04/21 04:19

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

2020/04/21 04:25

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

2020/04/21 04:29

java Age 2000/04/21 上記のようにコマンドからの実行を想定しています。
Zuishin
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
fall

2020/04/21 05:57

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

2020/04/21 06:02

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

2020/04/21 06:23

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

2020/04/21 06:27

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

2020/04/21 07:00

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

2020/04/21 07:07

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

2020/04/21 07:44

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

2020/04/21 07:58

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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