求大神帮忙,关于自定义Java异常,新手不懂得理解

Souyl 2016-11-03 12:39:19
用eclipse编写,分三个板块,1是自定义一个异常,2是定义一个圆形的类,其中半径是负数时抛出异常,3是主函数;如下:
1. InvalidRadiusException.java
public class InvalidRadiusException extends Exception{
public double radius;//半径

public InvalidRadiusException(double radius) { //自定义异常的构造函数
super("Invalid radius " + radius);//覆盖父类方法
this.radius = radius;
}

public double getRadius(){
return radius;
}
}
自定义异常没问题;
2. CircleWithException.java (注:2中有些代码不明白,求解释)
public class CircleWithException {
private double radius;//半径

public CircleWithException() throws InvalidRadiusException {//无参构造函数
this(1.0);//初始化半径,间接调用setRadius()方法
}

public CircleWithException(double radius) throws InvalidRadiusException {//有参数构造函数
setRadius(radius);//直接调用setRadius()方法
}

public void setRadius(double radius) //有可能产生异常,用throws抛出异常
throws InvalidRadiusException{
if(radius >= 0)
this.radius = radius;
else
throw new InvalidRadiusException(radius);
}

public double getRadius(){
return radius;
}

public double getArea(){
return radius * radius * Math.PI;
}
}
以上红字加粗部分,我不明白,去掉红字加粗部分显示错误,加上就对,为什么在这两个地方也要加上throws抛出异常???我很不明白,个人有以下理解,不知道对不对?::凡是调用了有可能产生异常方法(也就是上例中的setRadius()方法)的方法,都要进行异常抛出或者捕获处理,在CircleWithException类中,两处构造函数都间接或者直接调用setRadius()方法,不需处理异常,只是抛出到主函数,再在主函数处理进行处理。
我这样理解对不对??求解释,以下是主函数的调用
3. TestCircleException.java
public class TestCircleException {
public static void main(String[] args){
try {
CircleWithException c1 = new CircleWithException(2);
c1.setRadius(-5);
CircleWithException c2 = new CircleWithException(-2);
}
catch (InvalidRadiusException e) {
System.out.println("The invailed radius is " + e.getRadius());
}
finally{
System.out.println("over");
}
}
}

各位大神,看得懂我的问题吗?我不知道throws的使用,不知道哪里需要抛异常,哪里不需要抛异常。。。我上面的理解对不对???
...全文
308 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Souyl 2016-11-06
  • 打赏
  • 举报
回复
引用 8 楼 it_junior 的回复:
public CircleWithException() public void setRadius(double radius) 都是在调用public void setRadius(double radius)方法; 而public void setRadius(double radius)方法抛出异常了,那你说你上面两个调用这个方法的函数是不是 也相应的要抛出异常呢,thorws仅仅是在函数声明时抛出异常,但并不捕获异常,捕获异常的话应该用 try{} catch(){} 语句啊,建议你看看书吧,首先把最基本的概念理清
好的,谢谢你
「已注销」 2016-11-04
  • 打赏
  • 举报
回复
public CircleWithException() public void setRadius(double radius) 都是在调用public void setRadius(double radius)方法; 而public void setRadius(double radius)方法抛出异常了,那你说你上面两个调用这个方法的函数是不是 也相应的要抛出异常呢,thorws仅仅是在函数声明时抛出异常,但并不捕获异常,捕获异常的话应该用 try{} catch(){} 语句啊,建议你看看书吧,首先把最基本的概念理清
Souyl 2016-11-03
  • 打赏
  • 举报
回复
引用 6 楼 qq_20632237的回复:
这个应该是你含参构造时调了抛出异常的setRadius方法,无参构造又调了含参构造的构造方法,所以两个都要抛出异常,你去的setRadius方法的异常抛出应该就不用写你红色部分的异常抛出了
我试过了,只是构造函数用throws,而setRadius方法不用throws的话,编译错误
Souyl 2016-11-03
  • 打赏
  • 举报
回复
引用 2 楼 家里敷泥呀的回复:
InvalidRadiusException 是个编译时期异常,需要在编译期(写代码期间)处理,或捕获(catch) 或 申明抛出(throws) 具体情况可百度 “java 异常处理” 等关键字。 参考: 深入理解java异常处理机制 - guisu,程序人生。 逆水行舟,不进则退。 - 博客频道 - CSDN.NET http://blog.csdn.net/hguisu/article/details/6155636
好,我看看,有不明白的还请多多指教,谢谢!
Souyl 2016-11-03
  • 打赏
  • 举报
回复
引用 2 楼 家里敷泥呀的回复:
InvalidRadiusException 是个编译时期异常,需要在编译期(写代码期间)处理,或捕获(catch) 或 申明抛出(throws) 具体情况可百度 “java 异常处理” 等关键字。 参考: 深入理解java异常处理机制 - guisu,程序人生。 逆水行舟,不进则退。 - 博客频道 - CSDN.NET http://blog.csdn.net/hguisu/article/details/6155636
我好像搞错了一点,throws是声明异常,不是抛出异常,那么为什么在那两个构造函数也要声明这个异常??不声明就出错?
Souyl 2016-11-03
  • 打赏
  • 举报
回复
补充一下,在电脑网页版可以显示红字加粗,手机版好像看不出来,红字加粗部分是:圆形类中两个构造方法都用了“throws InvailRadiusException”
家里敷泥呀 2016-11-03
  • 打赏
  • 举报
回复
InvalidRadiusException 是个编译时期异常,需要在编译期(写代码期间)处理,或捕获(catch) 或 申明抛出(throws) 具体情况可百度 “java 异常处理” 等关键字。 参考: 深入理解java异常处理机制 - guisu,程序人生。 逆水行舟,不进则退。 - 博客频道 - CSDN.NET http://blog.csdn.net/hguisu/article/details/6155636
解开者 2016-11-03
  • 打赏
  • 举报
回复
基本上是这么回事,不过编译器强制处理的只有受检异常,而对于非受检异常(继承自RuntimeException),不显式处理也可以通过编译。
S亦是戯 2016-11-03
  • 打赏
  • 举报
回复
这个应该是你含参构造时调了抛出异常的setRadius方法,无参构造又调了含参构造的构造方法,所以两个都要抛出异常,你去的setRadius方法的异常抛出应该就不用写你红色部分的异常抛出了

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧