1

プログラムの全体的な考え方は、ファイルを 1 行ずつ読み取り、各単語を配列 token[] に保存することです。for ループを使用して、配列 token[] の要素をコンソールに出力しようとしています。しかし、変数トークンが初期化されていないと表示されます。

import java.io.*;

public class ReadFile{
    public static void main(String args[]){
        String[] token;
        int i;

            try{
                // Open and read the file
                FileInputStream fstream = new FileInputStream("a.txt");
                BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
                String strLine;
                //Read file line by line and storing data in the form of tokens
                while((strLine = br.readLine()) != null){
                    token = strLine.split(" ");
                }   
                in.close();//Close the input stream
            }
            catch (Exception e){//Catch exception if any
                System.err.println("Error: " + e.getMessage());
            }

                   // Why can't I do this printing part?
            for(i=0;i<=token.length;i++){
                System.out.println(token[i]);
            }``
        }// close main()
}// close Class
4

4 に答える 4

2

メインなどのメソッド内にいる場合、変数宣言は初期化されないため、自分で初期値を指定する必要があります。

例えば:

文字列[] 配列 = 新しい文字列[0];

あるいは

文字列[] 配列 = null;

于 2013-03-27T18:09:32.450 に答える
1

次のコード:

    public class ReadFile{
    public static void main(String args[]){
    String[] token;
    int i;
    try{
        // Open and read the file
        FileInputStream fstream = new FileInputStream("a.txt");
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;
        //Read file line by line and storing data in the form of tokens
        while((strLine = br.readLine()) != null){
            token = strLine.split(" ");
        }   
        in.close();//Close the input stream
    }
    catch (Exception e){//Catch exception if any
        System.err.println("Error: " + e.getMessage());
    }

これに変更する必要があります:

    public class ReadFile{
    public static void main(String args[]){
    String[] token = null;//initialize token with null
    int i;   
try{
        // Open and read the file
        FileInputStream fstream = new FileInputStream("a.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fStream));//Don't use DataInputStream as this class is good for reading primitives, length-prefixed strings e.t.c 
        StringBuilder sBuilder = new StringBuilder();
        String strLine;
        //Read file line by line and storing data in the form of tokens
        while((strLine = br.readLine()) != null){
            //token = strLine.split(" ");
            sBuilder.append(strLine);
        }   
        token = (sBuilder.toString()).split(" ");//Write this line here.
        in.close();//Close the input stream
    }
    catch (Exception e){//Catch exception if any
        System.err.println("Error: " + e.getMessage());
    }

for ループ構造も変更します。

for(i=0;i<=token.length;i++){//This will give ArrayOutOfBoundException
        System.out.println(token[i]);
    }

if (token != null)
for(i=0; i<token.length; i++){// condition should be checked for i < token.length
        System.out.println(token[i]);
    }

注: @Peter Lawrey で提案されているように、DataInputStream特にプリミティブの読み取りに使用する必要があります。

于 2013-03-27T18:11:10.293 に答える
1

これは範囲の問題です。

の範囲内main()token定義されていますが、初期化されていません。tokenこのスコープ レベルで使用する場合は、初期化する必要があります。

try...catch ブロックのスコープで、token初期化されます。split()不思議なことに、その値は最後の行でのみ重要にString[]なりますtoken.

于 2013-03-27T18:13:54.993 に答える
0

このコードをチェックすると、どこに問題があるかがわかります。

import java.io.*;
import java.util.*;
public class ReadFile{
public static void main(String args[]){
ArrayList<String[]> tokenlist = new ArrayList<>();
int i;

try{
    // Open and read the file
    FileInputStream fstream = new FileInputStream("health.txt");
    BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
    String strLine;
    //Read file line by line and storing data in the form of tokens
    while((strLine = br.readLine()) != null){
         String[] token = strLine.split(" ");
        tokenlist.add(token);
    }   
    //in.close();//Close the input stream
}
catch (Exception e){//Catch exception if any
    System.err.println("Error: " + e.getMessage());
}

       // Why can't I do this printing part?
for(int count=0; count<tokenlist.size();count++){
    String[] token = tokenlist.get(count);
    for(i=0;i<token.length;i++){
        System.out.println(token[i]);
    }
 }

 }// close main()
 }
于 2013-03-27T18:08:56.937 に答える