0

通過するテキストがフォーマットに適合しているのに、DateTimeParseException エラーが発生する理由がわかりません。以下は、問題を引き起こすコードです。

LocalTime lt = LocalTime.parse(songTime, 
DateTimeFormatter.ofPattern("k:m:s"));

これが奇妙なことです。ユーザーに時間を照会するたびに (例として 00:02:30 を使用します)、希望どおりに正確に実行されます。しかし、私の方法(テキストファイルから時間を抽出する)を使用すると、エラーが発生します:

スレッド「メイン」の例外 java.time.format.DateTimeParseException: テキスト '00:02:30 ' を解析できませんでした。解析されていないテキストがインデックス 8 で見つかりました

私が最初に想定したことは、それが余分な空白またはそれに沿った何かを持ち込んでいる可能性があるということでした. これを確認するために、変数の両側に 3 行ずつ出力すると、次のように出力されました。

---00:02:30---

上記のように、空白はありませんでした。00:02:30 をハードコーディングすると、同様に完全に機能します。それから私は私を悩ませた別のことに出くわしました。私のテキストファイルは次のようになります。

00:00:00 First
00:02:30 Second

最初は完全に合格しますが、その後は誰でもエラーが発生します。どちらもまったく同じ形式で、どちらの側にも空白がないため、問題は見られません。この問題に関するすべてのフォーラム投稿を確認しましたが、その大部分は間違った形式や間違った文字列などを使用している個人でした。ハードコードしたり、ユーザーに入力を求めたりすると完全に機能するため、ここではそうではありません。

以下は、フォーマッターで選択した各オプションの意味です (ドキュメントから)。

k       clock-hour-of-am-pm (1-24)
m       minute-of-hour 
s       second-of-minute

ファイルを読み取るメソッドは次のとおりです。

public static ArrayList<Song> scanInSongs () {

ArrayList<Song> songArray = new ArrayList<Song>();

try { 

    BufferedReader reader = new BufferedReader(new FileReader("Description.txt"));
    String line;

    while ((line = reader.readLine()) != null) {
       String key = line.substring(0, line.indexOf(' '));
       System.out.println("Fetched timestamp: "+ key);
       String value = line.substring(line.indexOf(' ') + 1);
       System.out.println("Fetched name: "+ value);

       Song song = new Song(value, "", key);
       songArray.add(song);
    }
} catch (IOException e) {
    System.out.println("File not found, exception: "+ e);
} 

return songArray;

}

ソングクラス:

public class Song {
    private String duration = "";
    private String name = "";
    private String timestampFromVideo = "";

    public Song(String name, String timestampFromVideo, String duration) {
        if (name == "") {
            this.name = "";   
        } else {
            this.name = name;
        }
        this.duration = duration;

        this.timestampFromVideo = timestampFromVideo;
    }

    public String getName() {
        return this.name;
    }

    public String getDuration() {
        return this.duration;
    }

    public String getTimestampFromVideo() {
        return this.timestampFromVideo;
    }

    public void setDuration(String duration) {
        this.duration = duration;
    }

}

メイン:

public static void main(String[] args) {

    ArrayList<Song> songArray = scanInSongs();

    String songTime = songArray.get(0).getDuration();

    LocalTime lt = LocalTime.parse(songTime, 
    DateTimeFormatter.ofPattern("k:m:s"));       
}

最後に、前に述べたように、ファイルは次のとおりです。

00:00:00 First
00:02:30 Second

みなさん、助けてくれてありがとう!

4

3 に答える 3