如何在Java中抛出和捕获异常?

时间:2014-07-24 15:46:17

标签: java exception

我正在尝试学习基本java程序的异常处理。我在网上阅读了一本教科书,甚至还练习了我的书给我的练习,但我仍然没有很好地掌握它。

我希望我可以在下面发布我的代码,看看是否有人能告诉我一个更好的方法来处理异常,或者我是否正确地做了。

public class labBookFortyTwo {

    public static void main(String[] args) {

        int size = 0;

        Scanner myInput = new Scanner(System.in);
        System.out.println("Please enter the amount of grades there are ");
        size = myInput.nextInt();

        double grade = 0;

        double[] myArray = new double[size];

        TestScoresTwo myScore = new TestScoresTwo(myArray, size);

        for (int count = 0; count < myArray.length; count++) {

            System.out.println("enter grade ");

            grade = myInput.nextDouble();

            myArray[count] = grade;

            System.out.println("you entered " + myArray[count]);

        }

        double avg = myScore.avgGrade();
        System.out.println("avg is \t " + avg);
    }

}

这是我的班级:

public class TestScoresTwo {

    int size = 0;
    double[] tScore = new double[size];
    double sum = 0;

    public TestScoresTwo(double[] scores, int sizE) {
        // double[] tScore = scores; //this line messed me up
        // the below line works
        tScore = scores;
        size = sizE;
    }

    public double avgGrade() {

        try {
            for (int otherCount = 0; otherCount < size; otherCount++) {
                if (tScore[otherCount] < 0 || tScore[otherCount] > 100) {
                    throw new IllegalArgumentException("At the " 
                        + (otherCount + 1) + "   position "
                            + tScore[otherCount] + " is a wrong input ");
                }
            }

            for (int count = 0; count < tScore.length; count++) {
                sum = tScore[count] + sum;
            }

        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }

        double avg = sum / size;
        return avg;
    }
}

3 个答案:

答案 0 :(得分:1)

到目前为止,一个答案和一条评论告诉你,它“无用”或者“没有意义”在同一个地方抛出并捕获异常。

以下是他们真正想要告诉您的内容:如果throw new FoobarException(...);try {...} catch (FoobarException ex) { ... }块中的词汇括起来,则表明您的代码组织不当。将抛出的代码移动到单独的方法中会更清晰。

罗伯特·C·马丁(http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/)的优秀书籍清洁代码:...... 倡导单一责任原则 - 一个程序中的每个方法都应该这样的想法负责做一件事。

他明确表示处理异常是一件事。因此,如果你编写一个捕获异常的方法,你的代码会更清晰†如果相应的抛出发生在其他方法中第一种方法调用。

private R reallyDoSomething(A a, B b, C c) throws SomeException {
    ...
    ... just worry about the normal case, and...
    if (something's not normal) {
        throw new SomeException(...);
    }
    ...
}

public R doSomething(A a, B b, C c) {
    try {
        return reallyDoSomething(a, b, c);
    } catch (SomeException ex) {
        ...
        ...handle abnormal case...
        ...
    }
}

另外,请记住,他们称之为“例外”是有原因的:它们应该是例外的(即不寻常的)。通常,当方法抛出异常时,这意味着该方法无法执行通常应该执行的任务。

异常允许我们将处理异常条件的代码与执行正常工作的代码分开。这可以使正常情况 lot 更容易阅读。 (如果您从未尝试过阅读大型C函数定义,其中错误处理与正常情况处理混合在一起,那么您可能无法完全理解异常之美。)

所以,如果目的是将正常与异常分开,你可以用两种方式来接受它:(1)将异常情况的处理程序(try / catch)放在一个单独的方法中,而不是那个方法。正常的“工作,以及(2)不要对”正常“事物使用例外。 (即,在抛出 not 错误的异常之前请三思而后行。)


†当鲍勃叔叔说“干净”时,他的意思是“易读”

答案 1 :(得分:0)

基本上,你所做的事情没有意义,你不应该在同一个地方抛出并捕捉异常(这是无用的)。我强烈建议您阅读有关异常处理的教程。使用谷歌,你可以找到关于这个主题的精心设计的课程。例如,this是您可以获得的第一个结果之一。 你应该做的事情看起来更像是这样:

public class TestScoresTwo  {
    //...

    public double avgGrade() throws IllegalArgumentException{
        for( int otherCount = 0; otherCount < size;otherCount++ ){
            if(tScore[otherCount] < 0 || tScore[otherCount] > 100){
                throw new IllegalArgumentException("At the " + (otherCount + 1) + "   position " + tScore[otherCount] + " is a wrong input ");
            }
        }
        for(int count = 0; count < tScore.length ; count++) {
            sum = tScore[count] + sum;
        }

        double avg = sum / size;
        return avg;
    }
}

你应该在调用抛出excpetion的方法时捕获你的异常。

public static void main(String[] args)
{
// ...
    try{
        double avg = myScore.avgGrade();
    }catch(IllegalArgumentException e){
        System.out.println(e.getMessage());
    }
// ...
}

答案 2 :(得分:0)

throw这里没有多大意义我觉得如果你没有办法摆脱目前的状态,你应该抛出异常。

此外,如果您要捕获异常,除非您要throw,否则不需要rethrow它。 像这样的东西

try{
}
catch (Exception e){
     throw new customException(e);
}