質問: br.readLine()) != null && !str.isEmpty()); #### 補足情報 ※コードを見やすくするために必ずWhile "{}"で囲みたい。 どなたかご存知あれば、お知恵をおかしください。 もっと適切でシンプルにかけないですかね?!!!
回答: **どげんかせんといかん** `while`と`break`、`continue`は一緒に学習しましょう。ついでにラベルの使い方も覚えてください。 ``` 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`は入力が`null`、`while`ループから抜ける。`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なら、正しい仕様を追記してください。この問題のテストケースがありませんか?