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

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

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

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

Q&A

解決済

3回答

6477閲覧

javaのCalendar,getActualMaximumの使い方

ppate

総合スコア7

Java

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

0グッド

0クリップ

投稿2017/01/15 10:32

初心者です。
javaでカレンダーを使った課題をやっています。
ある年と月を入力してその月が何日まであるか
表示しなさい。という問題です。

###発生している問題・エラーメッセージ
なぜかコンパイルはできたのですが、getActualMaximumの使い方と
作った変数をどこにいれるかがわからず、
年月を正しく入力してもcatch以降のエラーメッセージが表示されます。
本当に基本的なことで申し訳ありませんが、よろしくお願いいたします。

###該当のソースコード
import java.util.Calendar;
public class Test{
public static void main(String[] args){
try{
Calendar cal = Calendar.getInstance();
int yyyy = Integer.parseInt(args[0].substring(0,4));
int MM = Integer.parseInt(args[0].substring(5,7));
int Last = cal.getActualMaximum(Calendar.DATE);
cal.setLenient(false);
cal.set(yyyy,MM-1);

System.out.println(Last); } catch(ArrayIndexOutOfBoundsException e){ System.out.println("年月をyyyy/MM形式で入力してください。"); } catch(NumberFormatException e){ System.out.println("すべて数字で入力してください。"); } }

}

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

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

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

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

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

swordone

2017/01/15 11:00 編集

入力した文字はどのような形式ですか?また、エラーメッセージ出力のあとにe.printStackTrace()を実行してみてください。
guest

回答3

0

Calendarクラスでint値を2つとるsetメソッドはset(int field, int value)なのですが、
これは一つ目の引数はカレンダーのフィールドを示す値(年を示すCalendar.YEARなど)でなければなりません。
その値の範囲は整数値でいえば0以上17未満です。

年月を入れるつもりが、年の数値をフィールド値として入れてしまっているので、ArrayIndexOutOfBoundsExceptionになります。

投稿2017/01/16 03:07

swordone

総合スコア20649

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

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

0

参考情報

...
getInstanse()は実行日時が影響します。
29日に実行すると、cal.set(Calendar.MONTH, MM);の部分で2月の場合、2月29日となり、3月1日になります。そして3月の末日の31日がリターンされます。
...

上記ページに目を透し、いろいろ試してみることをお勧めします。

投稿2017/01/15 10:58

katoy

総合スコア22324

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

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

swordone

2017/01/15 11:01

catch以降のエラーメッセージが表示されることとこれは関係がないように思います。
guest

0

ベストアンサー

以下でできます

java

1import java.util.Calendar; 2public class TIO{ 3public static void main(String[] args){ 4try{ 5Calendar cal = Calendar.getInstance(); 6int yyyy = Integer.parseInt(args[0].substring(0,4)); 7int MM = Integer.parseInt(args[0].substring(5,7)); 8cal.set(Calendar.YEAR,yyyy); 9cal.set(Calendar.MONTH,MM-1); 10int Last = cal.getActualMaximum(Calendar.DATE); 11cal.setLenient(false); 12 13 14System.out.println(Last); 15} 16catch(ArrayIndexOutOfBoundsException e){ 17e.printStackTrace(); 18System.out.println("年月をyyyy/MM形式で入力してください。"); 19} 20catch(NumberFormatException e){ 21e.printStackTrace(); 22System.out.println("すべて数字で入力してください。"); 23} 24} 25}

投稿2017/01/15 10:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ppate

2017/01/15 12:42

ありがとうございます。 tetratailさんの方法でほぼできました。 ただ、13月など存在しない数値でも値が返ってくるのと、 2017/01だと表示されるけれど2017/1だとエラーになるので、 その部分をもう少し自分で考えて修正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問