我正在编写一个程序,用户可以在其中输入日期并打印出来。该程序还有一个给定的日期,可以通过第二次输入来计算年差。我当前的问题是,当我调用计算方法时,一切似乎都可以正常工作,但是不幸的是输出始终为0。
这是我的代码:
import java.util.Scanner;
public class Dates{
static Scanner scan = new Scanner(System.in);
// Attributes
static int Day;
static int Month;
static int Year;
//Constructor
Dates(int x, int y, int z){
Day = 12;
Month = 12;
Year = 2019;
if(Day > 31) {
do {
System.out.println("Wrong day! repeat entry: ");
Day = scan.nextInt();
}while (Day > 31);
}
if(Month > 12) {
do {
System.out.println("Wrong month! repeat entry: ");
Month = scan.nextInt();
}while(Month > 12);
}
if(Year < 1800) {
do {
System.out.println("Incorrect Year! repeat entry: ");
Year = scan.nextInt();
}while(Year < 1800);
}
}
//Calculates Year difference
public static int getYeardiff(int day, int month, int year) {
System.out.println("Press <0>, if you want to know passed years between two dates. ");
int difference = 0;
int key = scan.nextInt();
if(key == 0) {
System.out.println("Enter a second date: ");
Dates diffr = new Dates(Day, Month, Year);
diffr.Day = scan.nextInt();
diffr.Month = scan.nextInt();
diffr.Year = scan. nextInt();
if(diffr.Year <= Dates.Year) {
difference = Dates.Year - diffr.Year;
System.out.println(difference);
}
}
return difference;
}
//Formats the date into a String.
public static String asString(int day, int month, int year) {
String stringDay = "" + Day;
String stringMonth = "" + Month;
String stringYear = "" + Year;
String stringDate = stringDay + "." + stringMonth+ "." + stringYear;
System.out.println(stringDate);
return stringDate;
}
public static void main(String[] args) {
System.out.println("Enter todays date!");
Dates xmas = new Dates(Day, Month ,Year);
xmas.Day = scan.nextInt();
xmas.Month = scan.nextInt();
xmas.Year = scan.nextInt();
asString(xmas.Day, xmas.Month, xmas.Year);
getYeardiff(Day, Month, Year);
}
}
这是更好概述的方法。
public static int getYeardiff(int day, int month, int year) {
System.out.println("Press <0>, if you want to know passed years between two dates. ");
int difference = 0;
int key = scan.nextInt();
if(key == 0) {
System.out.println("Enter a second date: ");
Dates diffr = new Dates(Day, Month, Year);
diffr.Day = scan.nextInt();
diffr.Month = scan.nextInt();
diffr.Year = scan. nextInt();
if(diffr.Year <= Dates.Year) {
difference = Dates.Year - diffr.Year;
System.out.println(difference);
}
}
return difference;
}
可以说,我得到的输出始终为0。 这是完整的输出:
Enter todays date!
12
12
2019
12.12.2019
Press <0>, if you want to know passed years between two dates.
0
Enter a second date:
12
12
1990
0
我的问题是,为了从我的计算方法中获得正确的输出,我必须更改什么?
答案 0 :(得分:2)
使用大写字母的字段违反Java标准。同样,您的Dates
类的构造函数对传入的参数也不做任何事情。而是从扫描仪分配它们。这也违反惯例。扫描仪应该在外面要求输入,然后您根据用户输入的内容构造类。
我修改了您的代码,如下所示:
首先,您的Dates
类可以简化为:
int day;
int month;
int year;
//Constructor
Dates(int day, int month, int year) {
this.day = day;
this.month = month;
this.year = year;
}
然后我创建了一种要求输入日期的方法
public static Dates getDates() {
int day = 0, month = 0, year = 0;
System.out.print("Enter the day: ");
day = scan.nextInt();
while (day > 31 || day < 1) {
System.out.println("Wrong day! repeat entry: ");
day = scan.nextInt();
}
System.out.print("Enter the month: ");
month = scan.nextInt();
while(month > 12 || month < 1) {
System.out.println("Wrong month! repeat entry: ");
month = scan.nextInt();
}
System.out.print("Enter the year: ");
year = scan.nextInt();
while(year > 9999 || year < 1800 ) {
System.out.println("Incorrect Year! repeat entry: ");
year = scan.nextInt();
}
return new Dates(day, month, year);
}
然后简化您的getYeardiff
和asString
函数:
//Calculates Year difference
public static int getYeardiff(Dates other) {
Scanner scanner = new Scanner(System.in);
System.out.print("Press <0>, if you want to know passed years between two dates. ");
int difference = 0;
int key = scan.nextInt();
if(key == 0) {
System.out.println("Enter a second date: ");
Dates diffr = getDates();
difference = Math.abs(diffr.year - other.year);
System.out.println(difference);
}
return difference;
}
//Formats the date into a String.
public static String asString(Dates other) {
String stringDay = "" + other.day;
String stringMonth = "" +other.month;
String stringYear = "" + other.year;
String stringDate = stringDay + "." + stringMonth+ "." + stringYear;
System.out.println(stringDate);
return stringDate;
}
最后是您的main
方法:
public static void main(String[] args) {
System.out.println("Enter todays date!");
Dates xmas = getDates();
asString(xmas);
getYeardiff(xmas);
scan.close();
}
答案 1 :(得分:1)
我认为问题在于整个代码结构,您正在使用静态变量,然后将它们视为实例变量,请尝试重新设计您的类,以正确地将DAY,MONTH,YEAR变量定义为普通变量,而不是static coz static应该仅在您希望在类级别而不是对象级别上使用某个固定值时使用,甚至您也可以将Dates类与主类分开以使事情更轻松,更清晰。
答案 2 :(得分:0)
diffr.Year
和Dates.Year
指向相同的值。
将xmas
对象传递到getYeardiff
并执行difference = Dates.Year - xmas.Year;
例如 可以将getYeardiff调整为
public static int getYeardiff(Dates today) {
System.out.println("Press <0>, if you want to know passed years between two dates. ");
int difference = 0;
int key = scan.nextInt();
if(key == 0) {
System.out.println("Enter a second date: ");
Dates diffr = new Dates(Day, Month, Year);
diffr.Day = scan.nextInt();
diffr.Month = scan.nextInt();
diffr.Year = scan. nextInt();
if(diffr.Year <= Dates.Year) {
difference = differ.Year - today.Year;
System.out.println(difference);
}
}
return difference;
}
主要方法可以调整为
public static void main(String[] args) {
System.out.println("Enter todays date!");
Dates xmas = new Dates(Day, Month ,Year);
xmas.Day = scan.nextInt();
xmas.Month = scan.nextInt();
xmas.Year = scan.nextInt();
asString(xmas.Day, xmas.Month, xmas.Year);
getYeardiff(xmas);
}