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

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

ただいまの
回答率

87.34%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,853

score 16

前提・実現したいこと

何か文をコマンドプロンプトで入力し、それが事前に用意した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)

該当のソースコード

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.File;
import java.util.Scanner;
import java.io.FileNotFoundException;

class Mathmagic {
    public static void main(String []args){
        System.out.println("Please write here.");
        String[] input = Scanner(library.file);
        String[] output = Scanner(library.file2);

        baseTalk(input,output);

    }
    private static void baseTalk(String[] input, String[] output){
        String str = "";
        while (!(str.equals("end")||str.equals("exit"))) {
            str = BufferedReader();
            int Line = checkEqualsLine(input,output);
            if (Line == -1) System.out.println("error:Not defined");
            else System.out.println(output[Line]);
        }
    }
    private static int checkEqualsLine(String[] input,String[] output){
        int Line = -1;
        if(!(input.length == output.length))return -1;
        else{
            for (int i = 0;i < input.length;i++){
                if (input[i].equals(output[i])) {
                    Line = i;
                    break;
                }
            }
        }
        return Line;
    }
    private static String BufferedReader(){
        String str = null;
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            str = br.readLine();
        }catch (IOException ignored){

        }
        return str;
    }
    private static String[] Scanner(File file){
        String[] input = new String[library.limitInput];
        try(Scanner sc = new Scanner(file)){
            int i = 0;
            while (sc.hasNextLine()){
                input[i] = sc.nextLine();
                i++;
            }
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }
        return input;
    }
}

class library{
    static int limitInput = 1000;
    static File file = new File("word_input.txt");
    static File file2 = new File("word_output.txt");
}

試したこと

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

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

Java 12,OpenJDK,Windows 10

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • asahina1979

    2019/08/01 23:11

    nerianighthawk

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

    キャンセル

  • jimbe

    2019/08/01 23:12

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

    キャンセル

  • nerianighthawk

    2019/08/01 23:20

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

    キャンセル

回答 2

checkベストアンサー

+1

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

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

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

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

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

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


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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

-1

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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