【问题标题】:Throw an exception if an invalid value is passed in如果传入了无效值,则抛出异常
【发布时间】:2015-12-05 22:10:45
【问题描述】:

我有一个类,现在我正在更改设置器以在传入无效值时抛出异常。 它需要:

  • A. (dueDay 必须介于 1 和 31 之间,dueMonth 必须介于 1 和 12 之间。)setter 方法中不处理异常显示。
  • 乙。更改TodoItem 的主要方法,使其向用户询问任务、到期日和到期月份,并将此信息存储为新的TodoItem
  • C.更改构造函数,以便将其称为新的 setter 方法。如果抛出异常,应该在main方法中处理。应该告诉用户他们输入了无效的日期或月份,并要求输入正确的日期或月份。

我的班级是:

(我已经改了setter抛出异常,但是不行,我想我应该改一下main函数的构造函数,但是我不知道怎么做。)

public class TodoItem {

    private String task;
    private int dueMonth;
    private int dueDay;
    private boolean isDone;

    // class variables
    private static int numItems;
    private static int numDone;

    // constructor
    public TodoItem(String taks,int day,int month) {
        this.task = task;
        dueDay = day;
        dueMonth = month;
        isDone = false;

        numItems++;
    }

    // second constructor
    public TodoItem(String task) {
        this.task = task;
        isDone = false;

        numItems++;
    }

    public static void WriteToFile(String a){
        a="toString.txt";
        String task;
        int dueMonth;
        int dueDay;
        boolean isDone;
    }
    // toString method
    public String toString() {
        return a+task + ", due: " + dueMonth + "/" + dueDay + (isDone?", done":", todo");
    }

    // getters
    public int getDueDay() {
        return dueDay;
    }

    public int getDueMonth() {
        return dueMonth;
    }

    // setters
    public void setDueDay(int day) throws Exception  {
        if (day >= 1 && day <=31) {
            dueDay = day;
        }
        else {
            throw new Exception ("Error:  invalid due day");
        }
    }

    public void setDueMonth(int month) throws Exception{
        if (month >= 1 && month <= 12) {
            dueMonth = month;
        }
        else {
            throw new Exception("Error:  invalid due month");
        }
    }

    // Checks off an item as being done.
    // If the item was already marked as done, don't increase the counter
    // (this was not specified in the problem set instructions).
    public void markAsDone() {
        if (!isDone) {
            isDone = true;
            numDone++;
        }
    }


    // returns the percentage of to-do list items completed
    public static double percentDone() {
        return (double) numDone/numItems*100;
    }

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        // constructor 1
        TodoItemDone item1 = new TodoItemDone("Walk dog",12,3);
        TodoItemDone item2 = new TodoItemDone("Do 326 project",16,3);
        TodoItemDone item3 = new TodoItemDone("Put away winter boots",21,3);

        // constructor 2
        TodoItemDone item4 = new TodoItemDone("Buy groceries");
        TodoItemDone item5 = new TodoItemDone("Clean bathroom");
        TodoItemDone item6 = new TodoItemDone("Study for myself");


        // toString (and verify constructors)
        System.out.println("The 6 items are:");
        System.out.println(item1);
        System.out.println(item2);
        System.out.println(item3);
        System.out.println(item4);
        System.out.println(item5);
        System.out.println(item6);

        System.out.println();
        System.out.println("Setting due dates and months on the last 3:");
        // setDueDay
        item4.setDueDay(1);
        item5.setDueDay(5);
        item6.setDueDay(52);
        // setDueMonth
        item4.setDueMonth(12);
        item5.setDueMonth(6);
        item6.setDueMonth(0);

        System.out.println("The last 3 items are now:");
        System.out.println(item4);
        System.out.println(item5);
        System.out.println(item6);

        // Test percentDone() and markAsDone()
        System.out.println();
        System.out.println("About to complete some items:");
        System.out.println("percent done: " + percentDone());
        item1.markAsDone();
        System.out.println("Item 1 is now: " + item1);
        System.out.println("percent done: " + percentDone());

        item1.markAsDone();
        System.out.println("Item 1 is now: " + item1);
        System.out.println("percent done: " + percentDone());

        item2.markAsDone();
        System.out.println("Item 2 is now: " + item2);
        System.out.println("percent done: " + percentDone());
    }

【问题讨论】:

  • 我建议你扔一个IllegalArgumentException
  • @PeterLawrey 改变这个重要吗?
  • 使用通用的Exception 不是一个好主意。最好使用在这种情况下通常使用的异常。此外,IllegalArgumentException 是一个未经检查的异常,初学者发现它更容易使用。

标签: java exception throw


【解决方案1】:

但是,它不起作用,

你定义了 TodoItem 类,但是在 main() 中你创建了 TodoItemDone。当我将 TodoItem 更改为 TodoItemDone 时,我得到了结果:

The 6 items are:
null, due: 3/12, todo
null, due: 3/16, todo
null, due: 3/21, todo
Buy groceries, due: 0/0, todo
Clean bathroom, due: 0/0, todo
Study for myself, due: 0/0, todo

Setting due dates and months on the last 3:
Exception in thread "main" java.lang.Exception: Error:  invalid due day
    at com.github.vedenin.TodoItemDone.setDueDay(TodoItemDone.java:61)
    at com.github.vedenin.TodoItemDone.main(TodoItemDone.java:120)

正确抛出异常

【讨论】:

    【解决方案2】:

    改变这部分:

    public TodoItem(String taks,int day,int month) {
        this.task = task;
        dueDay = day;
        dueMonth = month;
        isDone = false;
    
        numItems++;
    }
    

    到这里:

    public TodoItem(String task,int day,int month) {
        this.task = task;
        dueDay = day;
        dueMonth = month;
        isDone = false;
    
        numItems++;
    }
    

    您没有将this.task 设置为更正输入参数taks。 我更改了您的参数名称。 也许这不是主要问题,但尝试改变它。

    【讨论】:

    • 谢谢,但还是有问题。这6项是:线程“main”java.lang.Error中的异常:未解决的编译问题:a无法解析为变量
    • 您确定将taks 更改为task 吗?因为我认为这 6 个例外正是 TodoItem 方法。
    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 2018-03-03
    • 2011-10-18
    • 1970-01-01
    相关资源
    最近更新 更多