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

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

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

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

3回答

2621閲覧

1月から9月までのどれかの月を入力し、日付を表示する。例外処理を使って漢数字でも処理できるようにする。

hona_tan

総合スコア45

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/10/08 05:08

編集2020/10/11 14:31

月に漢数字(一や二など)が入力さ入れた場合でも正しく動作し、一方で不適切な値が入力されたとしても、プログラムが異常終了しないように、例外処理を使って書き換える。ただし、入力される漢数字は1桁の月(一から九まで)に限るものとする.
というプログラムです。
ifの()の中をどのように書けばいいでしょうか?

public class StringToInt2 { public static void main(String[] args) { int n; try { n = Integer.parseInt(args[0]); } catch(NumberFormatException e) { char c = args[0].charAt(0); switch(c) { case '一': //System.out.println("一月は31日です"); n = 1; break; case '二': //System.out.println("二月は28日です"); n = 2; break; case '三': //System.out.println("三月は31日です"); n = 3; break; case '四': //System.out.println("四月は30日です"); n = 4; break; case '五': //System.out.println("五月は31日です"); n = 5; break; case '六': //System.out.println("六月は30日です"); n = 6; break; case '七': //System.out.println("七月は31日です"); n = 7; break; case '八': //System.out.println("八月は31日です"); n = 8; break; case '九': //System.out.println("九月は30日です"); n = 9; break; default : //System.out.println("不正な値です。"); n = -1; } } if (n > 0 && n < 13) { int days; switch(n) { case 1: days = 31; break; case 2: days = 28; break; case 3: days = 31; break; case 4: days = 30; break; case 5: days = 31; break; case 6: days = 30; break; case 7: days = 31; break; case 8: days = 31; break; case 9: days = 30; break; case 10: days = 31; break; case 11: days = 30; break; default: days = 31; } System.out.println(args[0].charAt(0) + "月は" + days + "日あります。"); } else { System.out.println("不正な値です。"); } } }

エラー

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at StringToInt2.main(StringToInt2.java:5)

漢数字を入力した場合。

$javac StringToInt2.java $java StringToInt2 三月は31日あります。

数字を入力した場合

$javac StringToInt2.java $java StringToInt2 3月は31日あります。

Eclipse_2020-06を使ってプログラムを書いています。

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

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

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

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

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

m.ts10806

2020/10/08 05:20

文字列として受け取って例外に流さない方が良いのでは?
dodox86

2020/10/08 05:24

もしかして、提示のコードは与えられたもので、今のところ一切質問者さんは手を加えていないのでは?
m.ts10806

2020/10/08 07:24

ひとまず課題なら出題者で 答えだけもらってもなんの身にもなりません 習った範囲で出来ないわけがないので復習から
hona_tan

2020/10/08 07:59

確かにこれは大学の課題です。tryとcatchのコードは与えられました。他は自分で考えて書きました。tryとcatchは絶対に使わないといけないです。ifでできると思ったのですが条件がわからなくなってしまい、質問しました。もしお答えしていただけるなら幸いです。説明不足ですみません。
m.ts10806

2020/10/08 08:02

習った範囲で出来ないわけがないので復習から。 他者からすると今回の内容は課題の代行を依頼しているにすぎません。課題の代行はteratailでは非推奨行為です
hona_tan

2020/10/08 08:07

わかりました。お答えいただきありがとうございました。
momon-ga

2020/10/08 08:44

ifで出来ると思ったとのことですが、何を判定したいのですか?
dodox86

2020/10/11 06:00

@質問者さん 修正された質問を読んで: > if (n < 0 && n > 10) { nが0未満(負の値)でかつ、10より大きい値、と言うのはありえないと思います。不等号の向きを良く考えてみてください。
guest

回答3

0

自己解決

Eclipse_2020-06のargsの指定の仕方がわからなかったので、ifの()のなかをどう書けばいいかわかりませんでした。でも、argsの指定の仕方がわかったのでifの中もわかりました。

ちなみにこうなりました↓

public class StringToInt2 { public static void main(String[] args) { int n = 0; try { n = Integer.parseInt(args[0]); } catch(NumberFormatException e) { char c = args[0].charAt(0); switch(c) { case '一': System.out.println("一月は31日です"); break; case '二': System.out.println("二月は28日です"); break; case '三': System.out.println("三月は31日です"); break; case '四': System.out.println("四月は30日です"); break; case '五': System.out.println("五月は31日です"); break; case '六': System.out.println("六月は30日です"); break; case '七': System.out.println("七月は31日です"); break; case '八': System.out.println("八月は31日です"); break; case '九': System.out.println("九月は30日です"); break; default : System.out.println("不正な値です。"); n = -1; } } if (n > 0 && n < 13) { int days; switch(n) { case 1: days = 31; break; case 2: days = 28; break; case 3: days = 31; break; case 4: days = 30; break; case 5: days = 31; break; case 6: days = 30; break; case 7: days = 31; break; case 8: days = 31; break; case 9: days = 30; break; case 10: days = 31; break; case 11: days = 30; break; default: days = 31; } System.out.println(n + "月は" + days + "日あります。"); } } }

投稿2020/10/12 06:58

hona_tan

総合スコア45

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

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

kazuma-s

2020/10/12 07:28

0 や 13 を入れても「不正な値です。」と出ませんが、いいんですか? 月を指定しないと、ArrayIndexOutOfBoundsException になりますが、いいんですか? 漢数字で「一二」を入れると、「一月は31日です」と表示されますが、いいんですか?
guest

0

nが初期化されていないコンパイルエラーになるのは、例外発生時にnに値が入らないからです。
現状ですと、漢字の一~九の場合にnに値が入りません。

たぶん、こんな感じのことがやりたいのだろうと思います。

java

1int n; 2try { 3 n = Integer.parseInt(args[0]); 4} catch (NumberFormatException e) { 5 char c = args[0].charAt(0); 6 7 switch (c) { 8 case '一': 9 // System.out.println("一月は31日です"); 10 n = 1; 11 break; 12 case '二': 13 // System.out.println("二月は28日です"); 14 n = 2; 15 break; 16 case '三': 17 System.out.println("三月は31日です"); 18 n = 3; 19 break; 20 case '四': 21 System.out.println("四月は30日です"); 22 n = 4; 23 break; 24 case '五': 25 System.out.println("五月は31日です"); 26 n = 5; 27 break; 28 case '六': 29 System.out.println("六月は30日です"); 30 n = 6; 31 break; 32 case '七': 33 System.out.println("七月は31日です"); 34 n = 7; 35 break; 36 case '八': 37 System.out.println("八月は31日です"); 38 n = 8; 39 break; 40 case '九': 41 System.out.println("九月は30日です"); 42 n = 9; 43 break; 44 default: 45 // System.out.println("不正な値です。"); 46 n = -1; 47 } 48} 49 50if (n < 13) { // n が1~9なら続行、それ以外なら不正な値 51 int days; 52// switch は省略 53 System.out.println(args[0].charAt(0) + "月は" + days + "日あります。"); 54} else { 55 System.out.println("不正な値です。"); 56} 57

そうすると、System.out.println("一月は31日です");などは不要になるのがわかると思います。
あとは、nの比較を正しいもの(1~9の間)で判定すれば良いです。

投稿2020/10/11 12:59

momon-ga

総合スコア4826

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

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

hona_tan

2020/10/11 14:35

解答ありがとうございます。言われた通りプログラムを直したのですが、エラーが出てしまいます。使っているものによると思うのですが、試しにAtomで実行するとできました。使っているのがEclipse_2020-06だとException in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at StringToInt2.main(StringToInt2.java:5)が出てしまいます。Eclipse_2020-06でできるようにならなければいけないのですが、どうしたらいいんでしょう、、、
hona_tan

2020/10/11 15:11

Eclipse_2020-06のargsの指定の仕方がわからなかったのですが調べたところやり方がわかり、実行することができました。細かくわかりやすい説明をしてくださり本当にありがとうございました。
guest

0

Java

1class Test { 2 static final int[] days = { 31, 28, 31, 30, 31, 30, 31, 31, 30 }; 3 4 public static void main(String[] args) { 5 int i = -1; 6 if (args.length == 1 && args[0].length() == 1 && 7 (i = "123456789".indexOf(args[0])) < 0) 8 i = "一二三四五六七八九".indexOf(args[0]); 9 if (i < 0) 10 System.out.println("不正な値です。"); 11 else 12 System.out.println(args[0] + "月は" + days[i] + "日あります。"); 13 } 14}

例外処理を使っていないから、これはダメですね。

追記
例外処理を使ってみました。

Java

1class Test { 2 static final int[] days = { 31, 28, 31, 30, 31, 30, 31, 31, 30 }; 3 4 public static void main(String[] args) { 5 int i = -1; 6 if (args.length == 1 && args[0].length() == 1) 7 try { 8 i = Integer.parseInt(args[0]) - 1; 9 } 10 catch (NumberFormatException e) { 11 i = "一二三四五六七八九".indexOf(args[0]); 12 } 13 if (i < 0) 14 System.out.println("不正な値です。"); 15 else 16 System.out.println(args[0] + "月は" + days[i] + "日あります。"); 17 } 18}

数字が全角の1,2、... 9でもよくなりました。
これでいいんでしょうか?

追記2
数字で「12」がいいのなら、漢数字の「十二」もいいのではないでしょうか?

Java

1public class StringToInt2 { 2 static final String[] s = { 3 "","一","二","三","四","五","六","七","八","九","十","十一","十二" 4 }; 5 public static void main(String[] args) { 6 int n = 0, days = 0; 7 if (args.length == 1) 8 try { 9 n = Integer.parseInt(args[0]); 10 } catch (NumberFormatException e) { 11 n = java.util.Arrays.asList(s).indexOf(args[0]); 12 } 13 switch (n) { 14 case 1: case 3: case 5: case 7: case 8: case 10: case 12: 15 days = 31; break; 16 case 2: 17 days = 28; break; 18 case 4: case 6: case 9: case 11: 19 days = 30; break; 20 } 21 if (days > 0) 22 System.out.println(args[0] + "月は" + days + "日あります。"); 23 else 24 System.out.println("不正な値です。"); 25 } 26}

例外処理も switch も使っていますが、このコードは問題の解答そのものではありません。
中身を理解して、漢数字が「九」までというのなら自分で修正してください。

投稿2020/10/08 15:08

編集2020/10/12 04:52
kazuma-s

総合スコア8224

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

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

hona_tan

2020/10/11 05:56

回答ありがとうございます。申し訳ありませんが必ずswitch文を使わなければならないとのこと。if文の中を修正したのですがエラーが出てしまいました。どの部分がダメなのかもう一度指摘してくださると嬉しいです。よろしくお願いします。
kazuma-s

2020/10/11 06:59

コンパイルエラーになります。
hona_tan

2020/10/11 11:38

すみません。また修正したので見ていただいてもよろしいですか?if文の中をありえない月(13月など)を表示しない。ようにするようにするのですが、if文の中をn < 13にするとnが初期化されていません。とエラーが出てしまいます。n=0とすればいいのでしょうか?
kazuma-s

2020/10/11 13:12

int n = -1; のように宣言時に初期化しておきましょう。 > 1月から9月までのどれかの月を入力し 10月を不正にしなくていいのですか?
hona_tan

2020/10/11 13:22 編集

n = -1にしてみました。なのですが、次はこのようなエラーが出てしまいました。 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at StringToInt2.main(StringToInt2.java:5) あ、普通の数字の場合は不正にしなくていいらしいです。 たくさん質問してしまってすみません。本当に自分の頭で考えてみても全くわからないんです。先週の水曜日からずっと考えているのですが、ネットで探してもいいのが見つからなくて、先生に質問してみても返信がものすごく遅くて、、、 本当に回答してくださってありがとうございます。
kazuma-s

2020/10/11 13:34

コマンド引数に月を指定していないのではありませんか? 私のコードが switch を使っていないからといって無視しないで、よく見てください。 args.length をチェックしましょう。
hona_tan

2020/10/11 14:52

ご指摘ありがとうございます。Eclipse_2020-06だとAtomと違い指定するやり方が違うようでした。もう少し調べてみます。
kazuma-s

2020/10/11 14:58

コマンド引数に月を指定していないのではありませんか? と尋ねているのになぜそれに応えないのですか? エラーメッセージは StringToInt2.java の 5行目と言っています。 5行目は、n = Integer.parseInt(args[0]); です。 エラーメッセージは「添字 0 が範囲外。配列長が 0 なので」と言っています。 その行で配列と言えば args です。
hona_tan

2020/10/11 15:09

すみません。Eclipse_2020-06のargsの指定の仕方がわかりませんでした。調べたところやり方がわかり、実行することができました。本当にここまで質問に答えてくださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問