2

ファイルを読み取り、その行を分割してコンテキスト(コンピューター名と日付)を取得しようとしています。コードは数行の出力を提供し、次の例外を提供します。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
        at FILE_MAIN.getComputerName(FILE_MAIN.java:34)
        at FILE_MAIN.readFiles(FILE_MAIN.java:24)
        at FILE_MAIN.main(FILE_MAIN.java:12)

コード:

import java.util.*;
import java.io.*;
import java.util.Scanner;
public class FILE_MAIN
{
    public static void main(String[] args) throws FileNotFoundException
    {
        File folder = new File("folderName/");
        File[] listOfFiles = folder.listFiles();
        for (int i = 0; i < listOfFiles.length; i++)
        {
            readFiles(listOfFiles[i].getName());
        }
    }
    public static void readFiles(String fileName) throws FileNotFoundException
    {
        FileReader dataFile = new FileReader("yukt/"+fileName);
        try (Scanner FileRead = new Scanner(dataFile)) 
        {
            while (FileRead.hasNextLine() && FileRead.nextLine().isEmpty()==false)
            {
                String[] split;
                String line = FileRead.nextLine();
                split = line.split("\\|",-1);
                String computerName=getComputerName(split[0]);
                System.out.println(computerName);
            }      
        }
    }
    public static String getComputerName(String splited)
    {
        String[] split1;
        String[] split2;
        split1=splited.split("\\:",-1);
        split2=split1[1].split("\\ ",-1);
        return("a");
    }
    public static String getDate(String splited)
    {
        String[] split1=splited.split("\\(",-1);
        String[] split2=split1[1].split("\\ ",-1);
        return(split2[0]);
    }
}

main関数は、フォルダー内のファイルの名前を取得し、各ファイルをreadFiles関数に渡します。ここで、各行はdelimeter(|)によって3つの部分に分割され、部分はgetComputerNameおよびgetDate関数に送信されます。この関数は、さらに分割した後にその値を返します。文字列。

ファイルの行の例を次に示します。すべての行は次のようになっています。

[CD8C] ComputerName:NITIN UserID:GO ankurjain Station 9900  LanId: | (11/24 19:50:30) | Client is disconnected from agent.
4

4 に答える 4

4

split1単一の要素を含むための保護はありません。

split1=splited.split("\\:",-1);
split2=split1[1].split("\\ ",-1); // Accesses second element of split1

保護を追加:し、入力文字列にnoが含まれていることがエラーであるかどうかを判断します。そうでない場合は、文字列全体を使用します:

split1=splited.split("\\:",-1);
if (split1.length > 1)
{
    split2=split1[1].split("\\ ",-1);
} 
于 2012-03-25T11:08:40.710 に答える
0
split1=splited.split("\\:",-1);
split2=split1[1].split("\\ ",-1);

split1はあなたが思っていることをしてはいけません。つまり、分割されていないため、cossplit1[1]は無効です。

その結果を使用する前に、最初の分割の結果を実際に確認する必要があります。

于 2012-03-25T11:11:26.227 に答える
0

天気文字列のサブパーツに指定された文字列が含まれているかどうかを確認する必要があるという同様の問題がありました。しかし、問題の文字列には多くのバリエーションがありました。ifループを使用する代わりに、三項演算子を使用しました-

StringUtils.containsIgnoreCase("Test String",
                    ("split me".split(":").length > 1)
                        ? "split me".split(":")[1] : "Can't split")
于 2015-11-12T18:58:56.457 に答える
-1

split2=split1[1]java.lang.ArrayIndexOutOfBoundsException: 1エラーが発生します。配列には2つの要素がないため、1のインデックスはエラーをスローします。

ifステートメントに割り当てを入れることで、少なくとも2つの要素があることを確認するためのチェックを追加できます。

if (split1.lenght > 1){
  split2=split1[1].split("\\ ",-1);
}  
于 2012-03-25T11:11:12.397 に答える