我正在尝试学习基本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;
}
}
答案 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);
}