0

array*次のコードは、テキスト ファイル内の文字列から「2D」を構築します。現在NullPointException、次の行でエラーが返されています。

temp = thisLine.split(区切り文字); 私の質問は、それtempが戻ってくるという理解で正しいnullですか? もしそうなら、なぜ、どのようにチェックを追加するのnullですか? 私はJavaの初心者で、ファイルからの文字列を作成するのはこれが初めての試みarrayですarrays.*

- - - - 編集 - - - -

上記は解決済みです。

以下に興味のある方のために、IndexOutOfBoundsException.具体的には次の行を返すコードを示します。

fileContents.set(i, fileContents.get(i).replace(hexLibrary[i][0], hexLibrary[i][1]));

System.out.println("SnR after this");

    String[][] hexLibrary;    // calls the replaces array from the LibToArray method
    hexLibrary = LibToArray();

    for(int i=0;i<502;i++){
        {
        fileContents.set(i, fileContents.get(i).replace(hexLibrary[i][0], hexLibrary[i][1]));
        }       
        }
    for (String row : fileContents) {
        System.out.println(row);        // print array to cmd
        }

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _


    public static String[][] LibToArray()
    {

        String thisLine;  
         String[] temp;  
         String delimiter=",";  
         String [][] hexLibrary = new String[502][2];  
    try
        {
            BufferedReader br= new BufferedReader(new FileReader("hexlibrary.txt"));  
            for (int j=0; j<502; j++) {  
                    thisLine=br.readLine(); 
                    temp = thisLine.split(delimiter);  
             for (int i = 0; i < 2; i++) {  
                hexLibrary[j][i]=temp[i];  
             }  
            }   
        }
        catch (IOException ex) {    // E.H. for try
        JOptionPane.showMessageDialog(null, "File not found.  Check name and directory."); // error message
        }
    return hexLibrary;
    }
4

3 に答える 3

1

である可能性が高いthisLineですnull。これは、502 行が読み取られる前に入力が不足した場合に発生します。そうthisLineでないnull場合はthisLine.split(delimiter)返されませんnull。常に次のnull行を確認する必要があります。

for (int j=0; j<502; j++) {  
    thisLine=br.readLine(); 
    if (thisLine != null) {
        temp = thisLine.split(delimiter);  
        for (int i = 0; i < 2; i++) {  
            hexLibrary[j][i]=temp[i];  
        }  
    } else {
        // report error: premature end of input file
        break; // no point in continuing to loop
    }
}

個人的には、特定のファイル長を想定しないようにメソッドを書きます。

public static String[][] LibToArray() {
    List<String[]> lines = new ArrayList<>();
    String delimiter=",";  
    try (BufferedReader br= new BufferedReader(new FileReader("hexlibrary.txt"))) {
        String line = br.readLine();
        while (line != null) {
            String[] tmp = line.split(delimiter);
            // the next line is dangerous--what if there was only one token?
            // should add a check that there were at least 2 elements.
            lines.add(new String[] {tmp[0], tmp[1]});
            line = br.readLine();
        }
    } catch (IOException ex) {
        JOptionPane.showMessageDialog(null, "File not found.  Check name and directory.");
    }
    String[][] hexLibrary = new String[lines.length][];
    lines.toArray(hexLibrary);
    return hexLibrary;
}

(上記では、新しい Java 7 のtry-with-resources 構文を使用しています。以前の Java を使用している場合は、メソッドが戻る前にfinally閉じる句を追加する必要があります。br

于 2013-08-07T01:10:47.523 に答える
0

ファイルの読み取り中にストリームの終わりをチェックしていません。

リーダーがストリームの最後に到達した場合、メソッドreadLineは a を返します。テキスト ファイルの行数に応じて、最初のループ (ループが終了する前) でnullこのポイント ( ) に到達しています。nullfor

于 2013-08-07T01:12:42.230 に答える