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

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

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

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

Eclipse

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

Q&A

2回答

2336閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

Eclipse

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

0グッド

0クリップ

投稿2020/04/06 05:57

編集2020/04/06 23:54

前提・実現したいこと

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

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

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

該当のソースコード

Programming

1/** 2 * Main method の説明 3 * 入力された値を受けて積を求める 4 * 空入力で終了 5 * @param 実行時引数 6 */ 7 8import java.io.BufferedReader; 9import java.io.IOException; 10import java.io.InputStreamReader; 11 12 13 14 15 16 17 18public class assignment3{ 19 public static void main(String[] args) { 20 try { 21 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//入力 22 double product = 1;//initial value 23 String str; 24 while (!(str = br.readLine()).isEmpty())//入力された値が空なら入力終了 25 try { 26 product *= Double.valueOf(str);//受け取った値を数値(Double type)に変換して変数"product"に代入 27 } catch (NumberFormatException e) {//数値以外の入力なら例外発生 28 System.out.println("数値を入力してください");//その例外が発生したら出力 29 } 30 str = String.format("%,.16g", product);//積算された値をString.format methodで編集してカンマ区切り 31 if (str.indexOf('.') >= 0)//search index of "." 32 str = str.replaceAll("0*$", "").replaceAll("\.$", ""); 33 System.out.println("入力された値の積 : " + str); 34 } catch (IOException e) { 35 System.out.println("入出力例外が発生しました"); 36 } 37 } 38 39 40}

試したこと

以下の通りに二つ試しました。
1:これに変更して記載してみたが複数の値の入力が出来なくなるため却下(入力された値の積算ができないから)

while (true) {

str = br.readLine();
if (str == null || str.isEmpty()) break;

2:数値以外の入力したら例外処理であるNumberformatExceptionで例外処理できないから却下

while ((str = br.readLine()) != null && !str.isEmpty());

補足情報

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

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

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

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

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

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

jimbe

2020/04/06 08:57

NullPointerException は assignment3 クラスの 27 行目で発生しているのに, ご提示のコードが Exercise3 クラスでは意味がありません. assignment3 クラスで発生しているのなら assignment3 クラスのコードを, Exercise3 クラスで発生しているのなら Exercise3 の例外をご提示ください.
guest

回答2

0

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

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

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

追記

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

  1. 質問を編集して、複数の値の入力ができなくなったという while (true) の

コード全体を追加してください。

  1. while ((str = br.readLine()) != null && !str.isEmpty()); の最後の

セミコロンを削除したコードを試したらどうなりますか?

投稿2020/04/07 08:32

編集2020/04/08 07:20
kazuma-s

総合スコア8224

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

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

xebme

2020/04/07 10:29

[試したこと]を読むと whileブロックをどうするか悩んでいるようです。 しかし、以下は明らかにセミコロンの位置がおかしいのです。 >>>while ((str = br.readLine()) != null && !str.isEmpty()); 仕様が違うのかもしれません。わたしの回答に追記してみます。
kaina

2020/04/08 07:34

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

0

どげんかせんといかん

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

Java

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

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

  • 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を使ってループをやり直します。

Java

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

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

投稿2020/04/06 06:49

編集2020/04/07 10:55
xebme

総合スコア1083

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問