LoginSignup
rempei
@rempei

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Java if文の条件で、ある変数がOO型の時という条件は指定できるのか?

Q&AClosed

解決したいこと

タイトルの通りなのですが、
例えば、変数numがint型でないときというような感じです。

Scannerで入力したとき数字でなければ警告文を出したいという状況です。

発生している問題・エラー

出ているエラーメッセージを入力

例)

NameError (uninitialized constant World)

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

ソースコードを入力

例)

System.out.println("数値を入力して下さい");
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
//ここで例えば + などを入力する
if (//ここの条件の指定方法が知りたいです//) {
  System.out.println("※数値を入力して下さい");
}

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

0

3Answer

数値の代わりに + を入れてみたのですが

Scanner周りはバッファが不意に残ったりするので,nextInt等を使う場合while(true)に入れるのは危険だったりします.
可能な限りnextLineで読み込んで(=入力を読み切って),あとからパースを試みるのが良いと思われます.

同様の理由で,無限ループの内部にtry-catchを入れると,catchした時点での中途半端な処理が次の周回に残って危険ですので,確実に脱出できないtryの書き方は控えてください.

1

Comments

  1. @rempei

    Questioner
    とても参考になりました!
    ありがとうございました

ざっと考えました:

  • 上記nextInt()で例外をキャッチ
  • Integer.parseInt()で例外をキャッチ
    * instanceofで型判定
    (2/8:不適切なため削除しました、すみません・・・)

※過去の質問が解決したらば、クローズをお願いします

0

Comments

  1. @rempei

    Questioner
    ちょっと素人すぎてよく分からないのですがtry-catchで警告文を出すということでしょうか?ちなみに以前は

    System.out.println("数値を入力して下さい");
    try {
    Scanner scan = new Scanner(System.in);
    int num = scan.nextInt();
    } catch (Exception ex) {
    System.out.println("※数値を入力して下さい");
    }
    このような書き方をしていたのですが、数字以外を入力してもcacthされなかったのでif文にしてみようと思いこの質問をしました。

    ※過去の質問はまだ考えてるのでもうちょっと待ってください
  2. 上記コードをコピペして試しましたが、しっかりキャッチされますけど。。。
    数値が入力されるまでループするとか、後はロジックの問題かと思います。
  3. @rempei

    Questioner
    もう一度してみたらキャッチされました。
    ありがとうございました。
  4. @rempei

    Questioner
    すみません、コードの訂正なのですが

    System.out.println("演算子を入力して下さい");
    try {
    Scanner scan = new Scanner(System.in);
    String cal = scan.next();
    } catch (Exception ex) {
    System.out.println("※演算子を入力して下さい");
    }

    このコードの時にキャッチされませんでした。
    間違えて数字をいれてしまった時も文字として判断されるからキャッチされないと思うのですが、演算子以外が入力された時にキャッチされるようにするにはどうすればいいでしょうか?
  5. cal.equals("+")としてやれば、"+"かどうかが判定できるかと。

    "+" でも "-" でも "*" でも "/" でも "=" でもない場合に再入力を促せばいいのでは?

    #もっとお洒落なやり方もあるでしょうが、まずは、愚直な方法で実装したほうがよさそう
  6. @rempei

    Questioner
    cal.equalのやり方でやりたいことができました!ありがとうございます。
    もう一つ聞きたいのですが

    while (!(num instanceof int)) {
    try {
    System.out.println("数値を入力してください");
    num = scan.nextInt();
    } catch (Exception ex) {
    System.out.println("※ 数値が入力されていません");
    break;
    }
    }
    上記のように数値が入力されるまで繰り返すように
    条件でinstanceofを使ってみたのですが
    Incompatible conditional operand types int and int
    というエラーが出てうまくいきませんでした。
    使い方が間違っているのでしょうか?
    num は int num = 0; で定義しています。
  7. エラーの理屈はさておき、ロジック的に正しいのは以下では?
    ・例外キャッチしてるのでinstanceofは不要
    ・breakの位置が逆(正常ならbreak)

    while (true) {
    try {
    System.out.println("数値を入力してください");
    num = scan.nextInt();
    break;
    } catch (Exception ex) {
    System.out.println("※ 数値が入力されていません");
    }
    }
  8. @rempei

    Questioner
    上記のコードを試してみました。
    数値の代わりに + を入れてみたのですが
    System.out.println("数値を入力してください");と
    System.out.println("※ 数値が入力されていません");
    が永遠に表示される無限ループになってしましました。
  9. @Verclene さん(ありがとうございます)にフォローいただきましたのでそちらを参照ください(すみません、今回は全然動作確認してませんでした)。

ご参考:

import java.util.*;

public class Main {
    // 面倒くさいので数値変換できなければマイナス値を返す仕様
    public static int getNumber(String str) {
        try {
            return Integer.parseInt(str);
        } catch (Exception e) {
            return -1;
        }
    }

    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        while (true) {
            System.out.println("数値を入力してください");
            int num = getNumber(scan.nextLine());
            if (0 <= num)
                break;
            System.out.println("※ 数値が入力されていません");
        }
    }
}
0

Comments

  1. @rempei

    Questioner
    ありがとうございます
    参考にさせていただきます!

Your answer might help someone💌