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

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

ただいまの
回答率

88.11%

NullpointerExceptionが発生していまう←これだけが解決せんばい

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 748
退会済みユーザー

退会済みユーザー

前提・実現したいこと

Eclipseを使用
実現したいことは下記の通りですが、Ctr+ZでNullpointerExceptionを発生させないように記述したい
-コンソールから複数の数値(整数・実数)を受け取って、入力された数値の積を表示。

発生している問題・エラーメッセージ

Exception in thread "main" java.lang.NullPointerException
    at test.assignment3.main(assignment3.java:27)

該当のソースコード

/**
     * Main method の説明
     * 入力された値を受けて積を求める
     * 空入力で終了
     * @param 実行時引数
     */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;







public class assignment3{
    public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//入力
            double product = 1;//initial value
            String str;
            while (!(str = br.readLine()).isEmpty())//入力された値が空なら入力終了
                try {
                    product *= Double.valueOf(str);//受け取った値を数値(Double type)に変換して変数"product"に代入
                } catch (NumberFormatException e) {//数値以外の入力なら例外発生
                    System.out.println("数値を入力してください");//その例外が発生したら出力
                }
            str = String.format("%,.16g", product);//積算された値をString.format methodで編集してカンマ区切り
            if (str.indexOf('.') >= 0)//search index of "."
                str = str.replaceAll("0*$", "").replaceAll("\\.$", "");
            System.out.println("入力された値の積 : " + str);
        } catch (IOException e) {
            System.out.println("入出力例外が発生しました");
        }
    }


}

試したこと

以下の通りに二つ試しました。
1:これに変更して記載してみたが複数の値の入力が出来なくなるため却下(入力された値の積算ができないから)
>>>while (true) {
str = br.readLine();
if (str == null || str.isEmpty()) break;

2:数値以外の入力したら例外処理であるNumberformatExceptionで例外処理できないから却下
>>>while ((str = br.readLine()) != null && !str.isEmpty());

補足情報

※コードを見やすくするために必ずWhile "{}"で囲みたい。
どなたかご存知あれば、お知恵をおかしください。
もっと適切でシンプルにかけないですかね?!!!

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2020/04/06 17:57

    NullPointerException は assignment3 クラスの 27 行目で発生しているのに, ご提示のコードが Exercise3 クラスでは意味がありません.

    assignment3 クラスで発生しているのなら assignment3 クラスのコードを, Exercise3 クラスで発生しているのなら Exercise3 の例外をご提示ください.

    キャンセル

回答 2

0

どげんかせんといかん

whilebreakcontinueは一緒に学習しましょう。ついでにラベルの使い方も覚えてください。

https://teratail.com/questions/251709
while ((str = br.readLine()) != null) {
  if (str.isEmpty())
    break https; // 入力された値が空なら入力終了
  try {
    product *= Double.valueOf(str); // 受け取った値を数値(Double type)に変換して変数"product"に代入
  } catch (NumberFormatException e) { // 数値以外の入力なら例外発生
    System.out.println("数値を入力してください"); // その例外が発生したら出力
  }
}

やっていることを簡単に説明します。

  • whileのループ条件は入力がnull以外
    CTL+Z+Enterは入力がnullwhileループから抜ける。null以外ならループに入る
  • 空文字列はstr.isEmpty()で判定
    空文字列ならばbreakでループを抜ける
  • 空文字以外なら文字列のdouble変換を行う

ラベル

  • break/continueはラベルを指定できる
  • ラベルはwhile/forなどのネストがあるとき、内側のループから外側のループに制御を移すときに使う

ここではhttps:というラベルを宣言。https:の後の//teratail.com/questions/251709はコメントとみなされます。break https;httpsの付くブロックを退出する。質問の回答としてラベルは必要ありません。break;だけで十分です。

参考

わかりやすい解説をあげます。Javaでbreak文/continue文/ラベル

 

推測と別解(追記)

試したことを読むと、whileブロックをどう記述するか決めかねているように思えます。そこで仕様が「数字を入力する都度、積を表示する」ものとして別の回答を追記します。数値以外ならcontinueを使ってループをやり直します。

try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {// 入力
  double product = 1;// initial value
  for (String str;(str = br.readLine()) != null && !str.isEmpty();) { // 入力された値が空なら入力終了
    try {
      product *= Double.valueOf(str);// 受け取った値を数値(Double type)に変換して変数"product"に代入
    } catch (NumberFormatException e) {// 数値以外の入力なら例外発生
      System.out.println("数値を入力してください");// その例外が発生したら出力
      continue;
    }
    str = String.format("%,.16g", product);// 積算された値をString.format methodで編集してカンマ区切り
    if (str.indexOf('.') >= 0)// search index of "."
      str = str.replaceAll("0*$", "").replaceAll("\\.$", "");
    System.out.println("入力された値の積 : " + str);
  }
} catch (IOException e) {
  System.out.println("入出力例外が発生しました");
}


これがNGなら、正しい仕様を追記してください。この問題のテストケースがありませんか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

この質問のコードは、Javaで仕様書通りにかけない。。。の KEIpon さんの質問に対する
私 kazuma-s の回答のコードのクラス名を Exercise3 から assignment3 に変更し、
import java.io.*; を複数の import に変更し、そのあとに 8行もの空行を追加したものです。

そして質問内容は、元の回答とそれに対するコメントですべて解決しているものです。

なぜ、同じ質問を繰り返すのですか?

追記

試してみたことについてお願いがあります。

  1. 質問を編集して、複数の値の入力ができなくなったという while (true) の
    コード全体を追加してください。

  2. while ((str = br.readLine()) != null && !str.isEmpty()); の最後の
    セミコロンを削除したコードを試したらどうなりますか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/07 19:29

    [試したこと]を読むと whileブロックをどうするか悩んでいるようです。
    しかし、以下は明らかにセミコロンの位置がおかしいのです。
    >>>while ((str = br.readLine()) != null && !str.isEmpty());

    仕様が違うのかもしれません。わたしの回答に追記してみます。

    キャンセル

  • 2020/04/08 16:34

    何の弁明もなく退会しちゃったようですね。。。

    キャンセル

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

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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