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

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

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

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

Q&A

解決済

3回答

4473閲覧

性別を入力し、「男or女ですね」と表示する。男or女以外入力されたら「正しく入力してください」と表示

JUN1207

総合スコア15

Java

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

0グッド

1クリップ

投稿2020/02/06 21:30

編集2020/02/07 00:36

Java初心者です。
上記のプログラムをつくりたいのですが、いろいろしらべても行き詰まってしまいました。
わかるかたがいらっしゃいましたらご回答よろしくお願いいたします。

Java

1 2package practice; 3 4import java.util.InputMismatchException; 5import java.util.Scanner; 6 7public class Practice3 { 8 public static void main(String[]args) { 9 10 // 性別判定 11 Scanner scanner = new Scanner(System.in); 12 try { 13 System.out.println("性別を入力してください。"); 14 String sex = scanner.nextLine(); 15 if ( sex = " 男 " ) { 16 System.out.println("男ですね。"); 17 } 18 if ( sex = " 女 ") { 19 System.out.println("女ですね。"); 20 } 21 }catch (InputMismatchException e) { 22 System.out.println("正しく入力してください。"); 23 scanner.close(); 24 } 25 } 26}

このコードで if 文のところで

Java

1Exception in thread "main" java.lang.Error: Unresolved compilation problems: 2 型の不一致: String から boolean には変換できません 3 型の不一致: String から boolean には変換できません 4 5 at prctice/practice.Practice3.main(Practice3.java:14)

とエラーもでてしまいました。

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

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

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

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

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

m.ts10806

2020/02/06 23:44

コードはマークダウンのcode機能を利用してご提示ください。 ※表示は既についている回答のようになります
JUN1207

2020/02/06 23:52

ご回答ありがとうございます。 がすみません。初心者で「m.ts10806」さんの仰っていることが理解できませんでした。 もしよろしければ、具体的に教えていただいてもよろしいでしょうか? よろしくお願いいたします。
m.ts10806

2020/02/07 00:14 編集

コードの提示の仕方です。 ash_fkさんの回答に提示されたコードはどのように表示されていますか? 質問を編集し、あれと同じようにしてくださいという意味です。 「マークダウン」という記法でさまざまな表現が可能です。 https://teratail.com/help#about-markdown 初めてなのでしたら質問テンプレートに色々な表記がされていたはずです。そちらを参考にしてください。 これでもやり方イメージわかなければ下記の質問の回答を参考にしてください。 https://teratail.com/questions/238564 なぜそうする必要があるかというと幾つかありますが、 「コードの再現確認を行うため」です。 そのままさらで提示されると見ての通り行頭のインデントが詰まってしまい、質問者さんのコードそのままとなりません。これでは正しい再現確認がとれません。 もうひとつはcode機能にはワンクリックでコピーできる機能が付帯しているので、わざわざ選択してコピーして、という手間が省けますし、無駄な空白などなく質問者さんのコードを手元に持ってくることができるのです。 「配慮」にもあたる部分ですし、迅速な問題解決のための「手段」にもなるわけです。 特にコードのマークダウン対応がされてないと「そもそも見ない」という回答者もいるので機会損失にもなるわけです。 事実としてきちんとコード提示された質問の方が回答率、解決率ともに高い傾向にあります。
yambejp

2020/02/07 00:21

今回のものはあくまでも例だとは思いますが きょうび「男」「女」のどちらかを選ばせる選択肢は 一部団体からの攻撃対象になります、実装にはお気をつけください
JUN1207

2020/02/07 00:30 編集

m.ts10806さん ご回答ありがとうございます。 早速ご回答いただいたURLの記事を読んできました。 そして、m.ts10806 さんの内容を読み納得しました。 わざわざご指摘してくださったうえに、詳しく教えてくださりありがとうございます。 確かに私が質問に記載したコードと皆さんが回答してくださっているコードが違うなと思っていたのですがやり方もわからず、かといってプログラムを完成させたい思いもあり、「teratail」の詳細な使い方を読まずに質問をしてしまっていました。 次回以降、質問する際には必ずマークダウンのcodo機能を使って提示致します。
m.ts10806

2020/02/07 00:28

いえ、ですから質問を「編集」 してくれれば良いのです。 質問も回答もコメントも編集可能です。ここは「質問へんの追記修正依頼」のコメント欄ですからね。 指摘に対しては質問を編集して返すの運用になります。
m.ts10806

2020/02/07 00:30

yambejpさん Practice3となっているのでなにかの書籍か学校の授業かと思いますが、確かに例題としてはよろしくないですね。
JUN1207

2020/02/07 00:39

m.ts10806さん 早速質問を編集しました。 全て編集可能なのですね! とても便利なサイトだということを改めて実感しています。 指摘の件、承知いたしました。
JUN1207

2020/02/07 00:43

yambejpさん ご指摘ありがとうございます。 今回のはあくまでも練習課題のため実装はしません。 また実装もまだよくわかっていないため、私の力ではいろいろと調べないと実装までいかないと思います、、、
dodox86

2020/02/07 01:17

私も、選択肢が"男"と"女"だけなのは問題あるな、と思っていましたが、あくまで質問者さんにとっては練習課題だったので。例えばこれがWEB上の登録サイトのようなものでの実装ですと、それを提供した会社含め、社会的に問題視されることがあります。
guest

回答3

0

例外処理を用いた場合の最短コード

java

1try (Scanner in = new Scanner(System.in)) { 2 String gender = in.next("^[男女]$"); 3 System.out.printf("%s ですね", gender); 4} catch (InputMismatchException e) { 5 System.err.println("正しく入力してください。"); 6}

投稿2020/02/07 00:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

JUN1207

2020/02/07 01:02

asahina1979さん ご回答ありがとうございます。 こんなに短くコードがかけるのですね!!! とても驚きました!!! 今の自分には到底理解が及ばないので勉強させていただきます!!!
guest

0

ベストアンサー

既に回答されているので、付けたしします。

まずtryのcatchですが、対象のExceptionが発生しないので
close処理が行われません。
かならずcloseしたのであれば、finallyです。
tryの中で何か処理をされて最後にcloseをする場合は、finallyに
書く方が安全にcloseできます。
もし処理中にエラーすれば、catchに飛ぶので、closeしてくれません。
finallyなら、確実に最後に通るのでcloseします。
気を付けるのは、インスタンス等、定義するのはtryより前でする事。

Java

1package practice; 2 3import java.util.InputMismatchException; 4import java.util.Scanner; 5 6public class Practice3 { 7 public static void main(String[]args) { 8 9 Scanner scanner = new Scanner(System.in); 10 try { 11 System.out.println("性別を入力してください。"); 12 String sex = scanner.nextLine(); 13 14 if ( sex.equals("男") ) { 15 System.out.println("男ですね。"); 16 } else if ( sex.equals("女") ) { 17 System.out.println("女ですね。"); 18 } else { 19 System.out.println("正しく入力してください。"); 20 } 21 } catch(Exception e) { // エラー(Exception)発生時のみ 22 e.printStackTrace(); 23 } finally { // 必ず最後に通る 24 scanner.close(); 25 } 26 } 27}

投稿2020/02/06 23:54

編集2020/02/06 23:55
NEO_PLANETT-777

総合スコア333

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

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

退会済みユーザー

退会済みユーザー

2020/02/07 00:01

オートクローザー
NEO_PLANETT-777

2020/02/07 00:05

ああ、そうか今はそれがありましたね
JUN1207

2020/02/07 00:10

NEO_PLANETT-777さん ありがとうございます。 finally だと最後の最後まで処理を実行して安全に確実に close 処理が行われるということですね! 勉強になります!
NEO_PLANETT-777

2020/02/07 00:14

asahina1979さんが言うように、Java7以降であれば、オートクローザーってのが使えますよ。 これはcloseを意識しなくて、自動でやってくれます。try宣言時に()で定義すればOKです。
JUN1207

2020/02/07 00:57

NEO_PLANETT-777 asahina1979も仰っているオートクローザー、勉強になります。 詳しいやり方のご教示ありがとうございます!
guest

0

= 演算子は代入になってしまうので、正しくはequals メソッドで比較するとうまくいくかと思います。
下記のような形です。

java

1if (sex.equals("男")) { 2 System.out.println("男ですね。"); 3}

こちらの記事も合わせて参考にしてみていただけたらと思います。
https://www.javadrive.jp/start/string/index4.html

投稿2020/02/06 21:36

編集2020/02/06 21:54
ash_fk

総合スコア45

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

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

JUN1207

2020/02/06 21:58

ご回答ありがとうございます。 早速コードをかいてみましたらうまく動作しました。 いまだコードは完成ではないので引き続きコードをかいてみます。
ash_fk

2020/02/06 22:10

よかったです! プログラムが動くのが見れるのは嬉しいですし、感動しますよね。 僕も始めた触った言語はJavaで、JUN1207さんと同じような問題に当たったことがあり、なにかとても懐かしい気持ちになりました。 コードが完成することを心より祈っています。
JUN1207

2020/02/06 22:11

コードをこちらにかえてみました! package practice; import java.util.InputMismatchException; import java.util.Scanner; public class Practice3 { public static void main(String[]args) { // 性別判定 Scanner scanner = new Scanner(System.in); try { System.out.println("性別を入力してください。"); String sex = scanner.nextLine(); if (sex.equals("男")) { System.out.println("男ですね。"); } if (sex.equals ("女")) { System.out.println("女ですね。"); } }catch (InputMismatchException e) { System.out.println("正しく入力してください。"); scanner.close(); } } } これで実行したのですが、男、女は認識してくれるようになりましたが、エラー判定をしてくれず、なんでも入れることができてしまいます。 もしわかるようでしたら、こちらもお聞きしてもよろしですか? よろしくお願いいたします。
ash_fk

2020/02/06 22:18

そうですね。 僕だったらtry catchは使わず、素直に if else で処理するのが良いと思いました。 下記のようなコードです。 if (sex.equals("男")) { System.out.println("男ですね。"); } else if (sex.equals ("女")) { System.out.println("女ですね。"); } else { System.out.println("正しく入力してください。"); } scanner.close();
JUN1207

2020/02/06 22:24

ash_fk さん ご回答ありがとうございます! なるほど。 if 文とtry caatch文は似ているようで違うのですね。 わたしはJavaをはじめてまだ1週間なので、色々と勉強中です。 でも、本当にプログラムがうごいた時は感動します!!!
退会済みユーザー

退会済みユーザー

2020/02/07 00:41 編集

デフォルトの設定でnextLineで呼んでいる以上、その例外は発生しませんしな
JUN1207

2020/02/07 00:00 編集

asahina1979さん ご回答ありがとうございます。 となると、nextLine に代わるものでないとだめだと言うことですね。 そうか、nextLine だと文字をすべて認識してしまうからですね。 ちなみに、それがなにかご存知ですか? よろしくお願いします。
takepan1973

2020/02/07 00:35

例外で受けるのは一般的ではないので、素直にelseで分岐しては如何ですか。 例外について、「システムから見た例外」と「あなたの個人的な事情による例外」は分けた方が良いと思います。 受け付ける入力が文字列である限り、「男」も「女」も「犬」も「猫」も文字列なので、「男と女以外の入力値」もシステムから見ると例外ではありません。 (数値入力のみ受け付けるnextIntの場合は、数値以外の文字列を例外として処理するのは通常のことですが) 〜 蛇足 〜 ジェンダー論的な面から見ると、「男と女以外の性別」を「正しくない入力」とはねてしまうのは、性的マイノリティーに対する配慮不足として、好ましくないかもしれませんね。
JUN1207

2020/02/07 00:54

takepen1973さん ご回答ありがとうございます。 仰っている通り、素直に }else{ での分岐にしました。 例外についての「システムから見た例外」と「あなたの個人的事情による例外」の件、承知いたしました。 確かに、受け付ける入力が文字列で有る限りは「文字列」は全て認識しますよね。 〜蛇足〜についてですが、こちらはyambejpさんからもご指摘がありました。 今回のプログラムについては練習課題のため実装云々とはなりませんが以後気をつけます。 またこちらを作成者にも共有できたらと思っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問