-
passing command line argument in java
I was writting a calendar pogram that took user input from the command line. What I want to know is how can I write my program so that if the user doesn't enter the info. it will automatically assign a value to the variable in the array, eg:
if they typed: java calendarmonth 10 2005
they would get a printout for the calendar month of October 2005, but I want it so that if they typed
java calendarmonth 10
it would automatically assign they year to be the current year, and if they typed
java calendarmonth
it would auctomattically assign the current month and year to the program, heres the source code:
import javax.swing.JOptionPane;
import java.util.*;
public class calendarmonth {
/** Main method */
public static void main(String argv[]) {
String monthString = argv[0];
int month = Integer.parseInt(monthString);
String yearString = argv[1];
int year = Integer.parseInt(yearString);
printMonth(year, month);
if (month > 12) {
System.out.println("Invalid Number Please Try");
//code to perform OK action
}
}
/** Print the calendar for a month in a year */
static void printMonth(int year, int month) {
//Print the heading of the calendar
printMonthTitle(year, month);
//Print the headings of the calendar
printMonthBody(year, month);
}
/** Print the month title, e.g., May, 1999 */
static void printMonthTitle(int year, int month) {
System.out.println(" " + getMonthName(month)
+ " " + year);
System.out.println("------------------------------");
System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
}
/** Get the English name for the month */
static String getMonthName(int month) {
String monthName = null;
switch (month) {
case 1: monthName = "January"; break;
case 2: monthName = "February"; break;
case 3: monthName = "March"; break;
case 4: monthName = "April"; break;
case 5: monthName = "May"; break;
case 6: monthName = "June"; break;
case 7: monthName = "July"; break;
case 8: monthName = "August"; break;
case 9: monthName = "September"; break;
case 10: monthName = "October"; break;
case 11: monthName = "November"; break;
case 12: monthName = "December"; break;
}
return monthName;
}
/** Print month body*/
static void printMonthBody(int year, int month){
//Get start day of the week for the first date in the month
int startDay = getStartDay(year, month);
//Get number of days in the month
int numberOfDaysInMonth = getNumberOfDaysInMonth(year, month);
//Pad space before the first day of the month
int i = 0;
for (i = 0; i < startDay; i++)
System.out.print(" ");
for (i = 1; i <= numberOfDaysInMonth; i++) {
if (i < 10)
System.out.print(" " + i);
else
System.out.print(" " + i);
if ((i + startDay) % 7 == 0)
System.out.println();
}
System.out.println();
}
/** Get the start day of the first day in a month */
static int getStartDay(int year, int month) {
//Get total number of days since 1/1/1800
int startDay1800 = 3;
int totalNumberOfDays = getTotalNumberOfDays(year, month);
//Return the start day
return (totalNumberOfDays + startDay1800) % 7;
}
/** Get the total number of days since Jan 1, 1800 */
static int getTotalNumberOfDays(int year, int month) {
int total = 0;
// Get the total days from 1800 to year - 1
for (int i = 1800; i < year; i++)
if (isLeapYear(i))
total = total + 366;
else
total = total + 365;
// Add days from Jan to the month prior to the calendar month
for (int i = 1; i < month; i++)
total = total + getNumberOfDaysInMonth(year, i);
return total;
}
/** Get the number of days in a month */
static int getNumberOfDaysInMonth(int year, int month) {
if (month == 1 || month == 3 || month == 5 || month == 7 ||
month == 8 || month == 10 || month == 12)
return 31;
if (month == 4 || month == 6 || month == 9 || month == 11)
return 30;
if (month == 2) return isLeapYear(year) ? 29 : 28;
return 0; // If month is incorrect
}
thanks
/** Determine if it is a leap year */
static boolean isLeapYear(int year) {
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
}
-
Your code seems to be okay. There are a few aspects which you need to look into
1> Your code is presently not checking if arguments are being passed or not. It would be a good idea to do that.
2> NumberFormatException should be handled in case the String entered for month / year is not an integer.
You could check if the month and / or year should be set to some default value based on the argument length - argv.length in your code.
Your main() method should be modified something like this:
Code:
public static void main(String argv[]) {
int len = argv.length;
int month = 0;
int year = 0;
Calendar cal = Calendar.getInstance();
if(len > 0) {
// Get month
String monthString = argv[0];
try {
month = Integer.parseInt(monthString);
} catch(NumberFormatException nfe) {
System.out.println("Invalid month input: " +monthString);
//code to fetch input again OR exit.
}
if (month > 12) {
System.out.println("Invalid Number Please Try");
//code to perform OK action
}
if(len > 1) {
// Get year
String yearString = argv[1];
try {
year = Integer.parseInt(yearString);
} catch(NumberFormatException nfe) {
System.out.println("Invalid year input: " +monthString);
//code to fetch input again OR exit.
}
} else {
// Set the year to current year if nothing is entered.
year = cal.get(Calendar.YEAR);
}
} else {
System.out.println("No arguments passed.");
month = cal.get(Calendar.MONTH) +1; // Months are returned from 0-11
year = cal.get(Calendar.YEAR);
}
// Print the calendar.
printMonth(year, month);
}
See if this helps!
Another observation: Your calendar is printing correctly but the formatting on the console is a bit off. I guess you could sort that out later.
Happiness is good health and a bad memory.
Similar Threads
-
Replies: 2
Last Post: 06-14-2006, 03:16 PM
-
Replies: 1
Last Post: 05-13-2005, 06:46 AM
-
By Mike Tsakiris in forum .NET
Replies: 11
Last Post: 10-04-2002, 05:32 PM
-
By Anonymous in forum Java
Replies: 0
Last Post: 01-31-2002, 11:08 PM
-
By JJ in forum Enterprise
Replies: 1
Last Post: 07-06-2000, 04:50 AM
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
Forum Rules
|
Top DevX Stories
Easy Web Services with SQL Server 2005 HTTP Endpoints
JavaOne 2005: Java Platform Roadmap Focuses on Ease of Development, Sun Focuses on the "Free" in F.O.S.S.
Wed Yourself to UML with the Power of Associations
Microsoft to Add AJAX Capabilities to ASP.NET
IBM's Cloudscape Versus MySQL
|
Bookmarks