package programList;public class TestCircleWithException{
public static void main(String[] args){
try{
CircleWithException c1 = new CircleWithException(5);
CircleWithException c2 = new CircleWithException(-5);
CircleWithException c3 = new CircleWithException(0);
}
catch(IllegalArgumentException ex){
System.out.println(ex);
}

System.out.println("Number of objects created: " + CircleWithException.getNumberOfObjects());
}
}class CircleWithException{
private double radius;
private static int numberOfObjects = 0;

public CircleWithException(){
this(1.0);
}

public CircleWithException(double newRadius){
setRadius(newRadius);
numberOfObjects++;
}

public double getRadius(){
return radius;
}

public void setRadius(double newRadius)throws IllegalArgumentException{
if(newRadius >= 0)
radius = newRadius;
else
throw new IllegalArgumentException("Radius cannot be negative");
}

public static int getNumberOfObjects(){
return numberOfObjects;
}

public double findArea(){
return radius * radius *Math.PI;
}
}想问下numberOfObjects为啥是1;Java

解决方案 »

  1.   

    因为在CircleWithException c2 = new CircleWithException(-5)这一句的时候由于是 -5 所以就报异常了,结果后两句的new根本就没起作用。你在numberOfObjects++;后面加一句System.out.println(numberOfObjects);就验证出来了。你把-5改为正的就可以出3了。
      

  2.   

    可是即使是-5不也应该先调用的构造方法么,再调用setRadius(),然后抛异常么?
      

  3.   


    是调用了构造方法,只是没执行完呀,第一行代码就异常了,结果直接出了try了,构造方法中和try中剩余的代码都没被运行到呀
      

  4.   

    自己debug下就知道, 这个逻辑还是比较清晰的, 
      

  5.   


    是调用了构造方法,只是没执行完呀,第一行代码就异常了,结果直接出了try了,构造方法中和try中剩余的代码都没被运行到呀
    你是说在执行setRadius(newRadius);这句的时候就有异常抛出,然后numberOfObjects++;这句就没有机会执行了,是这意思么?意思就是有了异常之后就直接跳出try块,try块中的其他代码都不执行了。
      

  6.   


    很明显的,你换一下代码顺序就知道了
                      numberOfObjects++;
    System.out.println(numberOfObjects);
    setRadius(newRadius);
      

  7.   


    很明显的,你换一下代码顺序就知道了
                      numberOfObjects++;
    System.out.println(numberOfObjects);
    setRadius(newRadius);
    其实明白了就感觉挺清晰的,那些点都知道,但是有时候就有些懵,谢谢!