【发布时间】:2021-09-20 21:55:27
【问题描述】:
当我通过的文本符合格式时,我无法弄清楚为什么会收到 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
第一次完美通过,但之后的任何人都会导致错误。它们都有完全相同的格式,两边都没有空格,所以我看不到问题所在。我检查了有关该问题的每一个论坛帖子,其中大多数是使用错误格式、错误字符串等的个人。我不确定这里的情况是否如此,因为当我对其进行硬编码或查询用户输入时它可以完美运行。
以下是我在 Formatter 中选择的每个选项的含义(来自documentation):
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
提前感谢大家的帮助!
【问题讨论】:
-
格式 k (1-24) 似乎与您的值 00 不匹配。
-
我忘了在文档中添加它,给定的 k 示例是 0,因此我认为 00 就可以了。无论哪种方式,当我对其进行硬编码时,当用户输入它以及通过该方法传递 00:00:00 字符串时,为什么它会起作用。很坚持这个哈哈!
-
你能显示读取文件的代码的minimal reproducible example吗?
-
可以!请给我几分钟。
-
顺便说一句,你确定你真的想要
LocalTime吗?如果这是一首歌曲的长度,Duration将是更合适的类型。
标签: java duration localtime datetime-parsing datetimeparseexception