Простой вопрос об исключении Java - PullRequest
2 голосов
/ 01 октября 2010

Эй, это просто простое упражнение из класса, в котором я решил попробовать сделать исключение. Согласно книге вводная информация для этой задачи должна быть в следующем формате: 19 апреля 2009 Я пытаюсь сделать с моим исключением то, что пользователь (тот, кто оценивает его) следует этим параметрам, чтобы моя программа работала. Это выглядит хорошо? Мог ли я сделать что-нибудь лучше?

Редактировать: Спасибо за своевременные ответы! Я знаю, что мне нужно многому научиться, но надеюсь, что однажды я смогу ответить на вопросы здесь. веселит

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...");}
        }
}

Ответы [ 2 ]

5 голосов
/ 01 октября 2010

Обычно использование исключений для вещей, которые являются частью логики вашей программы, вызывает недовольство. Ваша логика должна быть:

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

Но ваша программа:

    try{
         parse the date

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

Чтобы определить, правильно ли введены данные, вы можете проверить их на длину, получить подстроку месяца, как вы делаете, и проверить ее на длину, получить подстроку дня и проверить, является ли она целым числом и т. Д. И т. Д.

Программа никогда не должна генерировать исключение StringIndexOutOfBoundsException, потому что это то, что вы можете проверить, прежде чем использовать метод подстроки.

5 голосов
/ 01 октября 2010

Вот несколько мыслей. Это только мое мнение, поэтому возьмите их с крошкой соли или полностью игнорируйте, если хотите:

  1. Я не знаю, что делает этот оператор import, но все это можно сделать без введения зависимости от библиотеки. Вы должны знать о влиянии зависимостей.
  2. Я ненавижу вид комментариев, которые вы добавили. Я знаю, что студенты и преподаватели любят их, но как профессионал я нахожу, что они менее информативны, чем сам код, и только добавляют беспорядок.
  3. Я бы не стал вкладывать всю эту логику в основной метод. Я бы инкапсулировал это в класс или статический метод, чтобы я мог использовать его снова. Это бесполезное студенческое упражнение, как написано.
  4. Вы проверили счастливый путь "голубого неба", где все работает. Я бы порекомендовал посмотреть на что-то вроде JUnit и начать думать о крайних и исключительных случаях. Попробуйте больше входов, которые проверяют, чтобы сломать ваш метод. Так будет лучше. Ваш текущий метод гарантирует, что ваш код будет согласовываться с другими делами, о которых легко думать (например, передавая строку, которая не является месяц-день-год).

Вот как я мог бы написать то же самое:

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);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...