【发布时间】:2020-02-07 23:04:43
【问题描述】:
我应该修改 Time2 类(如下)以将时间实现为自午夜以来的秒数。该类应该有一个数据字段(一个具有自午夜以来的秒数的 int)而不是三个。此更改不应影响公共方法的参数、行为或输出。
然后创建一个带有 main 方法的 Driver 类来测试您的 Time2 类。该程序应要求用户输入午夜过后的小时数、分钟数和秒数,创建一个 Time2 对象并使用 mutator 方法。然后程序应该使用 toString() 方法打印出时间。
我的问题是下面代码的哪一部分是数据字段?
import java.util.Scanner;
public class Driver {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Time2 time = new Time2();
System.out.print("Enter hours:");
int hours = input.nextInt();
System.out.print("Enter minutes:");
int minutes = input.nextInt();
System.out.print("Enter seconds:");
int seconds = input.nextInt();
time.setSecond(seconds);
System.out.println(time.toString());
}
public static class Time2 {
private int hour;
private int minute;
private int second;
public Time2() {this(0, 0, 0);}
public Time2(int hour) {this(hour, 0, 0);}
public Time2(int hour, int minute) {this(hour, minute, 0);}
public Time2(int hour, int minute, int second) {
if(hour<0||hour>=24)
throw new IllegalArgumentException("hour must be 0-23");
if (minute < 0 || minute >= 60)
throw new IllegalArgumentException("minute must be 0-59");
if (second < 0 || second >= 60)
throw new IllegalArgumentException("second must be 0-59");
this.hour = hour;
this.minute = minute;
this.second = second;
}
public Time2(Time2 time) {this(time.getHour(), time.getMinute(), time.getSecond());}
public void setTime(int hour, int minute, int second) {
if (hour<0||hour>=24)
throw new IllegalArgumentException("hour must be 0-23");
if (minute < 0 || minute >= 60)
throw new IllegalArgumentException("minute must be 0-59");
if (second < 0 || second >= 60)
throw new IllegalArgumentException("second must be 0-59");
this.hour = hour;
this.minute = minute;
this.second = second;
}
public void setSecond(int second) {
if (second <= 0 || second > 60)
throw new IllegalArgumentException("second must be 0-59");
this.second = second;
}
public int getHour() {return second/60/60;}
public int getMinute() {return second/60;}
public int getSecond() {return second;}
public String toUniversalString() {
return String.format( "%02d:%02d:%02d", getHour(), getMinute(), getSecond());
}
public String toString() {
return String.format("%d:%02d:%02d %s",
((getHour() == 0 || getHour() == 12) ? 12 : getHour() % 12), getMinute(),
getSecond(), (getHour() < 12 ? "AM" : "PM"));
}
}
}
~UPDATE~ 我得到了代码,唯一的问题是它显示错误的小时和分钟(见输出链接) output
【问题讨论】:
-
字段是类的属性。在下面的示例中是字段: private int hour; // 0 - 23 私有 int 分钟; // 0 - 59 私有 int 秒; // 0 - 59 你必须添加类似 private int secondsSinceMidNight;字段将保存基于通过 Time2 类传递的小时、分钟和秒的计算值。您可以创建一个方法来进行计算并从 main 方法调用它以获取 secondsSinceMidNight 字段的值(您也可以将其称为变量)。希望对您有所帮助
-
@LaxmanChari 谢谢你的提示!他们非常有帮助:) 我只希望我的老师教我们声明
throw new IllegalArgumentException的含义:/ 这可以合并成一个 if 声明吗? -
this link 解释异常。当您说
throw new IllegalArgumentException("hour must be 0-23");时,您是在指示程序从此时停止执行,因为收到的输入与预期不符。由于特定原因,每个条件都会失败,在本例中,小时数可以在 0-23 之间,因此您的消息仅在这种情况下相关。如果你有通用消息,那么你只能有一个抛出异常的 if 语句。 -
抱歉,我不确定如何处理这个问题。既然在这种情况下,if 语句只能接收一条消息,那么 if else 语句会起作用吗?我不知道我还能怎么做。
-
代码正在尝试确定输入是否有效。如果输入无效,则应向应用程序的用户显示输入无效的消息,并说明原因。因为您有 3 个字段,并且每个字段都可以包含特定值,例如小时可以在 0-23 之间,分钟可以在 0-59 之间等等。您可以编写 if 语句来验证用户输入并通知用户哪里出错,以便他们可以更正输入并再次运行程序。如果您通过传递 800 作为小时值来运行此代码,它应该会导致代码执行失败并显示消息 hour must be 0-23 。
标签: java