2

Hey, This is just a simple exercise from class that I decided to have a go at putting an exception in. According to the book input for this problem is supposed to be in the following format: APRIL 19, 2009 What I'm trying to do with my exception is make sure the user(whoever grades it) follows those parameters so my program works. Does this look ok? Could I have done anything better?

Edit: Thanks for the timely answers! I know I have a lot to learn but hopefully one day I'll be capable enough to answer questions on here. cheers

import jpb.*;

public class ConvertDate {
    public static void main(String[] args) {
        try{
        SimpleIO.prompt("Enter date to be converted: ");
        String bam = SimpleIO.readLine();
        bam = bam.trim().toLowerCase();
        //empty space is taken off both ends and the entirety is put in lower case
        int index1 = bam.indexOf(" ");
        int index2 = bam.lastIndexOf(" ");
        int index3 = bam.indexOf(",");
        /*critical points in the original string are located using indexing to divide and conquer
        in the next step*/
        String month = bam.substring(0,index1);
        String up = month.substring(0, 1).toUpperCase();
        String rest = month.substring(1,index1);
        String day = bam.substring(index1, index3).trim();
        String year = bam.substring(index2+1);
        //now all the pieces are labeled and in their correct cases
        System.out.println("Converted date: " +day +" " +up +rest +" " +year);
        //everything comes together so perfectly
        } catch(StringIndexOutOfBoundsException e){
            System.out.println("best type that in like the book does on page 125...");}
        }
}
1
  • Some people put a lot of time into their answers. A 'tip of the hat' is appropriate ;-) Commented Oct 1, 2010 at 12:02

2 Answers 2

5

Here are a few thoughts. These are just my opinion, so take them with a grain of salt or ignore completely if you wish:

  1. I don't know what that import statement is doing, but it's possible to do all this without introducing the dependency on the library. You should be aware of the effect that dependencies have.
  2. I hate the kind of comments that you've added. I know that students and professors love them, but as a professional I find that they're less informative than the code itself and only add clutter.
  3. I would not put all this logic into a main method. I'd encapsulate it into a class or static method so I could reuse it. It's a useless student exercise as written.
  4. You tested the "blue sky" happy path, where everything works. I'd recommend looking at something like JUnit and start thinking about edge and exception cases. Try more inputs that test to break your method. It'll improve that way. Your current method guarantees that your code will bonk with other cases that are easy to think of (e.g., passing in a string that isn't month-day-year).

Here's how I might write the same thing:

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParseException;

public class ConvertDate 
{
    private static final DateFormat DEFAULT_FORMAT;

    static
    {
        DEFAULT_FORMAT = new SimpleDateFormat("MM-dd-yyyy");
        DEFAULT_FORMAT.setLenient(false);
    }

    public static void main(String[] args) 
    {
        for (String dateString : args)
        {
            try
            {
                Date date = DEFAULT_FORMAT.parse(dateString);
                System.out.println(date);
            }
            catch (ParseException e)
            {
                System.out.println("invalid date string: " + dateString);
            }
        }
    }
}
Sign up to request clarification or add additional context in comments.

8 Comments

I hate the kind of comments indeed. @user463372, write comments that tell why you are doing something, not what you're doing. We can read the code, we know what you're doing. But a little insight into why you are doing it can shed tons of light.
Beware, the Java date formatting classes are annoying IMO. duffymo's program, which looks very reasonable, accepts 13-32-2010 as a valid date. parse() is a tad loose...
@Tony Ennis - Try that date now. Not loose anymore.
@Tim - agreed. Even smart people can stand to have their code tightened up.
Holy cow, I just ran the code and it rejects my bogus dates. How many times have I coded crud to prevent the looseness! I didn't know!
|
5

Generally using exceptions for things that are a part of the logic of your program is frowned upon. Your logic should be:

   if(The Input is well formed){
       parse the date
   }else{
       Tell the user that the input is wrong
   }

But your program is:

    try{
         parse the date

     }catch(){
         tell the user the input is wrong
     }

To determine if the input is well formed you can test it for length, get the month substring as you are doing and test that for length, get the day substring and test if it is an integer etc etc.

A program should never throw a StringIndexOutOfBoundsException because this is something that you can check before you use the substring method.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.