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

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

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

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

Java

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

Q&A

解決済

2回答

1573閲覧

java.lang.NullPointerExceptionが解決できない

keita135

総合スコア16

NullPointerException

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

Java

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

0グッド

0クリップ

投稿2019/08/01 13:41

前提・実現したいこと

何か文をコマンドプロンプトで入力し、それが事前に用意したword_input.txtのX行目と一致していれば、word_output.txtのX行目の言葉が出力される。かつ、endまたはexitと入力されるまでこの処理を繰り返せるようにしたいです。javaです。

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

入力がinputのいずれかに一致、もしくは異なっていてもどちらもこの結果です。

Exception in thread "main" java.lang.NullPointerException at Mathmagic.checkEqualsLine(Mathmagic.java:31) at Mathmagic.baseTalk(Mathmagic.java:21) at Mathmagic.main(Mathmagic.java:14)

該当のソースコード

java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3import java.io.IOException; 4import java.io.File; 5import java.util.Scanner; 6import java.io.FileNotFoundException; 7 8class Mathmagic { 9 public static void main(String []args){ 10 System.out.println("Please write here."); 11 String[] input = Scanner(library.file); 12 String[] output = Scanner(library.file2); 13 14 baseTalk(input,output); 15 16 } 17 private static void baseTalk(String[] input, String[] output){ 18 String str = ""; 19 while (!(str.equals("end")||str.equals("exit"))) { 20 str = BufferedReader(); 21 int Line = checkEqualsLine(input,output); 22 if (Line == -1) System.out.println("error:Not defined"); 23 else System.out.println(output[Line]); 24 } 25 } 26 private static int checkEqualsLine(String[] input,String[] output){ 27 int Line = -1; 28 if(!(input.length == output.length))return -1; 29 else{ 30 for (int i = 0;i < input.length;i++){ 31 if (input[i].equals(output[i])) { 32 Line = i; 33 break; 34 } 35 } 36 } 37 return Line; 38 } 39 private static String BufferedReader(){ 40 String str = null; 41 try { 42 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 43 str = br.readLine(); 44 }catch (IOException ignored){ 45 46 } 47 return str; 48 } 49 private static String[] Scanner(File file){ 50 String[] input = new String[library.limitInput]; 51 try(Scanner sc = new Scanner(file)){ 52 int i = 0; 53 while (sc.hasNextLine()){ 54 input[i] = sc.nextLine(); 55 i++; 56 } 57 }catch (FileNotFoundException e){ 58 e.printStackTrace(); 59 } 60 return input; 61 } 62} 63 64class library{ 65 static int limitInput = 1000; 66 static File file = new File("word_input.txt"); 67 static File file2 = new File("word_output.txt"); 68}

試したこと

どこからNullが現れているのか分からないので手も足も出ませんでした。

補足情報(FW/ツールのバージョンなど)

Java 12,OpenJDK,Windows 10

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

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

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

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

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

gentaro

2019/08/01 13:45

デバッグして調査したりされないんでしょうか?
nerianighthawk

2019/08/01 13:57

"word_input.txt"と"word_output.txt"の中身がわからないと何とも言い難いですが、気になる点としては str = BufferedReader(); これって何がstrに入っていますか? BufferedReader()ってBufferedReaderクラスのコンストラクタなので、String型ではなく、BufferedReaderクラスのインスタンスが入っている気がしますが。
jimbe

2019/08/01 14:00

エラーメッセージに行番号まで付いて場所が示されています.
退会済みユーザー

退会済みユーザー

2019/08/01 14:11

nerianighthawk 意味不明なメソッド String型を戻す BufferedReader が実装されてるよ javaの基本的な作法を無視して作成してるから回答はしないが
jimbe

2019/08/01 14:12

nerianighthawk さん: str = BufferedReader(); はメソッド呼び出しです.
nerianighthawk

2019/08/01 14:20

asahina1979さん jimbeさん こんなメソッドが実装されているなんて…知りませんでした… 確かに、もし私が言ったような理由ならそもそもあのエラー文になりませんもんね。 ありがとうございます。
guest

回答2

0

ベストアンサー

エラーメッセージに依ると、31行目でNullPointerExceptionが生じて居ることが分かります。
次の箇所ですね。

Java

if (input[i].equals(output[i])) {

どうやらinput[i]がnullであるようです。
inputがどのように作られたか探しに行くと、Scannerメソッドに辿り着きます。

Java

private static String[] Scanner(File file){
String[] input = new String[library.limitInput];
...
return input;
}

ファイルの内容に関係無く、常に library.limitInput 長であることが分かります。
余分に確保するのは賢明ですが、その部分にnullが詰まってしまっているのです。

実際に配列の要素を全て出力してみると良いでしょう。
for文を使っても良いですし、Arrays.toStringで文字列化するのも簡便です。


解決策はいくつか考えられます。

  • 後で必要な部分だけ切り詰めた、新たな配列を作る
  • 配列では無くリストを使う

投稿2019/08/01 14:09

編集2019/08/01 14:10
LouiS0616

総合スコア35660

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

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

0

そもそも「前提・実現したいこと」に書かれた仕様を満たすプログラムにもなっておりません.
checkEqualsLine は何をしているのでしょうか.

投稿2019/08/01 14:08

jimbe

総合スコア12632

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問