关于异常捕获的问题 有大神能指点一下小菜鸟吗

Surrin1999 2018-03-18 04:24:16
import java.util.*;
abstract class RedEnvelope{
public double remainMoney; //红包当前金额
public int remainPeople; //当前参与抢红包的人数
public double money; //当前用户抢到的金额
public abstract double giveMoney(); //抽象方法,具体怎么抢由子类完成
}
class RandomRedEnvelope extends RedEnvelope{
double minMoney;
int integerRemainMoney;
int randomMoney;
Random random; //为什么这句不能直接写进try里面
RandomRedEnvelope(double remainMoney,int remainPeople){
random = new Random();
minMoney = 0.01;
this.remainMoney = remainMoney;
this.remainPeople = remainPeople;
integerRemainMoney = (int)(remainMoney*100); //此时整型的剩余金额单位已是"分"
if(integerRemainMoney<remainPeople*(int)(minMoney*100)){
throw new java.io.IOException("你输入的金额过少,请确保每人至少能分到1分钱");
}
}
public double giveMoney(){
if(remainPeople <= 0){
return 0;
}
if(remainPeople == 1){
money = remainMoney;
remainPeople--;
return money;
}
randomMoney = random.nextInt(integerRemainMoney); //金额区间为[0,519)
if(randomMoney<(int)(minMoney*100)){
randomMoney = (int)(minMoney*100);
}
int leftOtherPeopleMoney = integerRemainMoney - randomMoney;
int otherPeopleNeedMoney = (remainPeople-1)*(int)(minMoney*100);
if(leftOtherPeopleMoney < otherPeopleNeedMoney){
randomMoney -= otherPeopleNeedMoney - leftOtherPeopleMoney;
}
integerRemainMoney = integerRemainMoney - randomMoney;
remainMoney = (double)(integerRemainMoney/100.0);
remainPeople--;
money = (double)(randomMoney/100.0);
return money;
}
}
public class Example8_23{
public static void main(String[] args){
try{ RedEnvelope redEnvelope = new RandomRedEnvelope(5.20,5);
System.out.printf("以下用于循环输出%d个人抢%.2f元的随机红包:\n",redEnvelope.remainPeople,redEnvelope.remainMoney);
showProcess(redEnvelope);
}
catch(java.io.IOException e){
System.out.println(e.getMessage());
}

}
public static void showProcess(RedEnvelope redEnvelope){
double sum = 0;
while(redEnvelope.remainPeople>0){
double money = redEnvelope.giveMoney();
System.out.printf("%.2f\t",money);
sum = sum + money;
}
System.out.printf("\n%.2f元的红包被抢完",sum);
}
}


这是一个通过random模拟抢红包的程序,要保证每个人至少都抢到0.01元 请问下 是红字部分出了错吗。。为什么我无论定义多少个人去抢都是报错说没有声明或捕获异常??还是构造方法中抛异常的条件出了问题??但是那个条件是我根据书上打的 应该没错呀 以及,为啥绿字不能直接写成Random random = new Random();放在构造函数里面?
...全文
363 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
__椎名真白 2018-03-20
  • 打赏
  • 举报
回复
多个异常使用throws是因为异常链,它可以保证异常不会丢失,至于这个为什么要用我也不是很明白,只是因为我复制你代码的时候他有出错提示,具体说了什么没注意。真写程序没有这种写法的吧,只要是CheckedException都需要try catch来捕获并处理,runtime异常就没办法了,只能保持逻辑清晰,自己注意。通通throws交给上级处理太不负责了。另外就是Random写在构造函数里,需要它提升声明一个全局变量,不然你在构造函数里定义,他就只在构造函数里生效,别的方法都不知道有这么一号人,本来也没有意义。只能让他的运用域为全局。像你学习java的时候没少见过实体类吧,persen student之类的,没有在构造函数里定义变量的。都是定义好全局变量,构造函数里赋值。
Surrin1999 2018-03-19
  • 打赏
  • 举报
回复
引用 9 楼 Lone1yCode 的回复:
我就不信了,我给你敲一遍,多年不用的eclipse都掏出来了。你看代码,一点变化没有,加了一个throws IOException。 是导包的问题,你试试这样。
RandomRedEnvelope(double remainMoney,int remainPeople) throws java.io.IOException
不用全名直接导包就好了,要不一写就是一大串。 再不能解决,我跟你讲。。。@……&%#&¥%&*。。
哈哈 兄弟你太给力了 原来我忘了导包 话说能说说为什么要throws吗 不是有多个异常时才要用throws吗 还有Random为啥不能写进构造方法里而是要作为全局变量 答得出来我分全给你啦
__椎名真白 2018-03-19
  • 打赏
  • 举报
回复
我就不信了,我给你敲一遍,多年不用的eclipse都掏出来了。你看代码,一点变化没有,加了一个throws IOException。

是导包的问题,你试试这样。
RandomRedEnvelope(double remainMoney,int remainPeople) throws java.io.IOException

不用全名直接导包就好了,要不一写就是一大串。
再不能解决,我跟你讲。。。@……&%#&¥%&*。。

Surrin1999 2018-03-19
  • 打赏
  • 举报
回复




引用 7 楼 Lone1yCode 的回复:
[quote=引用 6 楼 Surrin1999 的回复:]
还有人吗 求救

RandomRedEnvelope(double remainMoney,int remainPeople) throws IOException

后面加上throws IOException
保证你完美运行。[/quote]

并没有。。 如图
__椎名真白 2018-03-19
  • 打赏
  • 举报
回复
引用 6 楼 Surrin1999 的回复:
还有人吗 求救
RandomRedEnvelope(double remainMoney,int remainPeople) throws IOException
后面加上throws IOException 保证你完美运行。
Surrin1999 2018-03-19
  • 打赏
  • 举报
回复
还有人吗 求救
Surrin1999 2018-03-19
  • 打赏
  • 举报
回复
引用 2 楼 Lone1yCode 的回复:
不能写进try里面是因为你在try语句块里定义一个变量,它的运用域就只在这个语句块中。没有声明异常,就对着需要添加的地方加上try catch就行了。手机看不见颜色,你就按我说的做就可以了。
红字部分就是try catch部分
Surrin1999 2018-03-19
  • 打赏
  • 举报
回复
[quote=引用 2 楼 Lone1yCode 的回复:] 不能写进try里面是因为你在try语句块里定义一个变量,它的运用域就只在这个语句块中。没有声明异常,就对着需要添加的地方加上try catch就行了。手机看不见颜色,你就按我说的做就可以了。[/quote ]呃。。 老实说没懂你什么意思。。。我这里的try catch用法有什么问题吗 try中创建对象 然后调用构造方法 构造方法if不符合就抛异常。。逻辑上好像没什么错啊 为什么我无论是否每人能否均分0.01都报错。。
__椎名真白 2018-03-19
  • 打赏
  • 举报
回复
不能写进try里面是因为你在try语句块里定义一个变量,它的运用域就只在这个语句块中。没有声明异常,就对着需要添加的地方加上try catch就行了。手机看不见颜色,你就按我说的做就可以了。
__椎名真白 2018-03-19
  • 打赏
  • 举报
回复
还有你把random写进构造方法,得把Random设置为全局变量才行,然后在里面进行初始化。
Surrin1999 2018-03-18
  • 打赏
  • 举报
回复
有人吗 求救啊

50,560

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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