【发布时间】:2020-11-09 05:32:39
【问题描述】:
我遇到了问题,我绝对无法解决它。我对 Java(或任何语言,就此而言)缺乏经验,如果这是一个愚蠢的问题,请原谅。
据我所知,java.time.format.DateTimeFormatter 的 format() 方法并没有像我想象的那样工作。我一直收到以下错误消息 (CLI):
Watch.java:609: error: cannot find symbol
String dateTimeDisplay = dateTime.format(dateTimeFormat);
^
symbol: method format(DateTimeFormatter)
location: variable dateTime of type Object
1 error
以下是我认为相关的代码:
import java.time.ZonedDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
public class Watch {
protected int hour, hourTens, hourOnes, minute, minuteTens, minuteOnes, amPM;
public void watchMethod(String userInput) {
Object dateTime; // Create reference to object called dateTime
switch (userInput) {
case "1":
ZonedDateTime dateTimeHere = ZonedDateTime.now();
hour = dateTimeHere.getHour();
minute = dateTimeHere.getMinute();
// amPM is used exclusively to display AM/PM or a heart (see lines 580 to 567).
amPM = dateTimeHere.getHour();
dateTime = dateTimeHere;
break;
case "2":
ZonedDateTime dateTimeThere = ZonedDateTime.now(ZoneId.of("Europe/Paris"));
hour = dateTimeThere.getHour();
minute = dateTimeThere.getMinute();
// amPM is used exclusively to display AM/PM or a heart (see lines 560 to 567).
amPM = dateTimeThere.getHour();
dateTime = dateTimeThere;
break;
case "3":
hour = -1;
minute = -1;
break;
}
// There is some code that prints things to console depending on the hour, minute, and amPM variables.
// I don't think this is relevant, but that's what's here.
// The following code prints out the actual date and time from a ZonedDateTime object.
DateTimeFormatter dateTimeFormat = DateTimeFormatter.ofPattern("hh:mm a 'on' EEEE, MMMM dd, yyyy");
String dateTimeDisplay = dateTime.format(dateTimeFormat); // ERROR
System.out.print("\nIt is currently " + dateTimeDisplay + "\n");
}
}
这是一门课。
我已检查我的导入是否正确,并且任何地方都没有拼写错误!这是与我的问题相关的其他问题让我相信是问题所在,但似乎并非如此。
我也不太熟悉使用Object 作为引用类型,所以如果这可能是导致问题的原因,我并不感到惊讶。这是我能想到的将dateTimeHere/dateTimeThere 打破开关块的所有方法。
无论如何,如果我得到任何帮助,我将不胜感激。
快速编辑:我还认为如果没有合适的 dateTime 对象(即案例“3”),这也会导致错误。我简单地添加了一个if/else 语句来解决这个问题,在“3”的情况下使用一些代码表示 dateTime 为空,但这绝对没有任何作用。不过,请告诉我是否应该重新添加它。
编辑:感谢@MarsAtomic 的评论,我看到这篇文章可以使用另一个通读。我的问题是,在我的代码末尾,我想打印出 switch 语句检索到的 ZonedDateTime 数据,无论是来自用户的计算机位置还是“巴黎/欧洲”。最终,“Paris/Europe”字符串(理想情况下)将具有来自子类的一些用户输入(就像 userInput 的情况一样,但该特定字符串仅用于选择已经显示的 3 个案例之一)。
【问题讨论】:
-
字段 dateTime 是 Object 类型。对象没有 .format() 方法。如果要访问 ZonedDateTime 的格式方法,则必须将 dateTime 声明为 ZonedDateTime(或将其转换为 ZonedDateTime)。真正的问题是,是什么让您认为您应该首先将 dateTime 声明为 Object?
-
您好,感谢您这么快就来到这里!我的问题是,最初,代码
String dateTimeDisplay = dateTime.format(dateTimeFormat);是String dateTimeDisplay = dateTimeHere.format(dateTimeFormat);,并且我不断收到 dateTimeHere 的缺少符号错误。所以我创建了一个新的 dateTime 对象,并将 dateTimeHere 和 dateTimeThere 设置为相等,以解决范围问题。我想我只是认为Object和String一样——愚蠢的错误。 -
没关系,但现在是熟悉X Y Problem 的好时机。当您不解决问题的直接原因以解决症状时,您确实可以使问题复杂化。你为什么不首先描述你想要做的事情——我不愿意在这一点上提供一个不能解决根本问题的解决方案。
-
@MarsAtomic,我的错。我刚刚更新了帖子,我希望现在适合。
-
您将面临的下一个问题是在某些情况下
dateTime不会被任何显式值初始化。请注意,您仅在"1"和"2"的情况下对其进行初始化,但如果"3"或userInput将包含任何其他值(如"dog")呢?
标签: java compiler-errors cannot-find-symbol