0

ファイルを開くことができずに困っています。次のhasNextエラーでクラッシュするようjava.lang.NullPointerです。これは、エラーが発生している私のコードです(with hasNext)。

import java.io.*;
import java.util.Scanner;
public class Customers{
private Scanner opener;

    public void openFile() {
        try {
            opener = new Scanner (new File ("customer.txt"));
        } catch (Exception f) {
            System.out.println("Can not read file.");
        }
    }

    public void readFile() {
        while(opener.hasNext()) {
            String a = opener.next();
            String b = opener.next();
            String c = opener.next();

            System.out.printf("%s %s %s\n", a, b, c);
        }
    }

    public void closeFile() {
        opener.close();
    }

}

これは他のクラスです:

public class fileTest {
public static void main (String args []) {
    Customers c = new Customers();
    c.openFile();
    c.readFile();
    c.closeFile();
}

}

4

5 に答える 5

4

ファイルを開くときに例外が発生する可能性があるため、openerがnullになる可能性があります

public void openFile() throws Exception{

            opener = new Scanner (new File ("customer.txt"));
    }

ファイルを開く際に例外がある場合は、メッセージだけが出力され、オープナーはnullのままになり、opener.hasNext()でNPEが発生します。

ファイルを開くことができない場合、コードは失敗し、他のメソッドは実行されないため、例外をキャッチする代わりに例外をスローする必要があります。

于 2012-12-20T05:52:18.187 に答える
2

あなたの質問は明確ではありませんが、NPE をスローしていると言っているようです。opener.hasNext()

もしそうなら、それは であることを意味しopenerますnull。つまり、呼び出していないか、openFile()呼び出しているが機能していないことを意味します。特にmainメソッドが を呼び出すので、私は後者を疑っていますopenFile()

メソッドがファイルのオープンに失敗した場合openFile()(たとえば、指定されたパス名でファイルが存在しないなどの理由で)、メッセージが出力され、openerそのまま残りnullます。これはおそらく起こっていることです。


このopenFile()方法にはいくつかの欠点があります。

  1. それはキャッチしてExceptionいます...これは、期待しているもの以外の例外をキャッチする可能性があります。
  2. スタックトレースまたは実際の例外メッセージを記録していません
  3. 問題はファイルを開くことができないことが原因であると想定しています...他の何かである可能性がある場合(一般的に、この特定のケースではない場合)、
  4. エラーメッセージを出力すると、何も悪いことがなかったかのように続行します。

NPE の問題は、openFile()欠陥の結果です。

実際の例外メッセージを出力すると、アプリケーションがファイルを開くことができない理由がわかります。

アップデート

エラー メッセージcustomer.txt (The system cannot find the file specified)は、ファイルが見つからないことを明確に示しています。アプリケーションの現在のディレクトリが、そのファイルを含むディレクトリではない可能性があります。相対パス名を使用したため、現在のディレクトリを参照するように指示しました。解決策は、絶対 (完全) パス名を使用するか、アプリケーションが正しい現在のディレクトリで起動されるようにすることです。


この問題を解決すると、ファイルの読み取り方法に問題があります。このreadFile()メソッドは、入力から 3 の倍数のトークン (文字列) を読み取ることができると想定しています。ファイル形式に問題がある場合、(チェックされていない) 例外が発生する可能性があります。おそらく、何も悪いことが起こらないと仮定するのではなく、この例外をキャッチして診断を生成する必要があります。

于 2012-12-20T05:57:01.647 に答える
0

まず、ファイルが実際にディスクに存在することを確認します。ファイルが存在Fileしなくてもオブジェクトを作成できます。

2番目:doinによって1つの要素をチェックインし、opener.hasNext()次の3つの要素にアクセスします!

リストに要素が1つしかない場合はopener.hasNext()戻りtrueますが、存在しない次の2つの要素にアクセスしています。したがって、nullポインタ例外

于 2012-12-20T05:53:21.627 に答える
0

あなたopenerは初期化されていないため、ヌルポインター例外が発生しました。ファイルがそこに存在することを確認し、ファイルの絶対パスを指定してみてください

于 2012-12-20T06:02:01.740 に答える
0

ここでいくつかの点を確認してください。

  1. あなたのプログラムは指定されたファイルを読み込んでいますか?Eclipse を使用している場合は、ファイルを src フォルダーに保存し、opener = new Scanner (new File ("src/customer.txt")); としてパスを指定します。

2.コードの2番目の問題は、次の要素の while(opener.hasNext()) を1回だけチェックしてから、3つの要素 String a = opener.next(); を読み取ることです。文字列 b = opener.next(); 文字列 c = opener.next(); ファイルに次の要素がない場合、例外が発生します。アクセスする前に各要素を確認してください。

代わりに次のコードを使用してください。

public void readFile() { while(opener.hasNext()) { 文字列 a = opener.next(); System.out.printf("%s\n", a); } }

于 2012-12-20T06:06:45.570 に答える