Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中抛出和捕获异常?_Java_Exception - Fatal编程技术网

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

如何在Java中抛出和捕获异常?,java,exception,Java,Exception,我试图学习基本java程序的异常处理。我在网上和课本上阅读,甚至练习了我的书给我的练习,但我仍然没有很好地掌握它 我希望我能在下面发布我的代码,看看是否有人能告诉我一种更好的方法来处理异常,或者我是否做得很好 public class labBookFortyTwo { public static void main(String[] args) { int size = 0; Scanner myInput = new Scanner(System

我试图学习基本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);
    }

}
公共类labBookFortyTwo{
公共静态void main(字符串[]args){
int size=0;
扫描仪myInput=新扫描仪(System.in);
System.out.println(“请输入等级数量”);
size=myInput.nextInt();
双级=0;
double[]myArray=新的double[大小];
TestScoresTwo myScore=新的TestScoresTwo(myArray,size);
对于(int count=0;count
这是我的班级:

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;
    }
}
公共类TestScoresTwo{
int size=0;
double[]t核心=新的双[尺寸];
双和=0;
公共TestScoresTwo(双[]分,整数大小){
//double[]tScore=scores;//这一行把我搞砸了
//下面这行行行得通
tScore=分数;
大小=大小;
}
公共双平均等级(){
试一试{
对于(int-otherCount=0;otherCount100){
抛出新的IllegalArgumentException(“在”
+(其他计数+1)+“位置”
+tScore[otherCount]+“输入错误”);
}
}
对于(int count=0;count
基本上,您所做的没有意义,您不应该在同一个位置抛出和捕获异常(这是非常无用的)。我强烈建议您阅读有关异常处理的教程。使用谷歌,你可以找到关于这个主题的精心设计的课程。例如,这是你能得到的第一个结果之一。 您应该做的事情看起来更像这样:

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;
    }
}

throw
这里没有什么意义,我认为当您无法摆脱当前状态时,应该抛出一个异常

此外,如果正在捕获异常,则不需要抛出它,除非要重新抛出它。 像这样的

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

到目前为止,一个答案和一条评论告诉您,在“同一个地方”抛出并捕获异常“毫无意义”

他们真正想告诉你的是:如果一个
抛出新的FooberException(…)
在词汇上包含在
try{…}catch(fooberException ex){…}
块中,这表明您的代码组织不良。将执行抛出的代码移动到单独的方法中会更干净

优秀的书,干净的代码:。。。作者Robert C.Martin()提倡单一责任原则,即程序中的每个方法只负责做一件事

他明确表示,处理异常是一回事。因此,如果您编写了一个捕获异常的方法,那么如果第一个方法调用的其他方法中发生了相应的抛出,那么您的代码将更干净

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...
        ...
    }
}
此外,请记住,他们之所以称之为“例外”是有原因的:它们应该是例外的(即不寻常的)。通常,当一个方法抛出异常时,这意味着该方法不能执行它通常应该执行的任何任务

异常允许我们将处理异常情况的代码与正常工作的代码分开。这可以使正常情况更容易阅读。(如果您从未尝试阅读过错误处理始终与正常案例处理混杂在一起的大型C函数定义,那么您可能无法充分体会异常的美妙之处。)

因此,如果目的是将正常和异常区分开来,那么可以通过两种方式来实现:(1)将异常情况(try/catch)的处理程序放在与执行“正常”工作的处理程序不同的方法中,(2)不要对“正常”事情使用异常。(即,在抛出非错误的异常之前,请三思)



†当Bob叔叔说“干净”时,他的意思是“易于阅读”

如果您需要帮助,您应该格式化代码,使其更具可读性。抛出异常并捕获它并不真正有意义。对不起,我不是一个很好的程序员,我正在努力学习,当我进入异常章节时,我不太了解。
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...
        ...
    }
}