为什么这里变量不赋初值会报错?

MikeDDT009 2017-03-14 10:38:00
不知道为什么会报错,按照提示点了下,直接给accrual变量赋了个初值0就解决了问题,虽然解决了,但是还是很奇怪报错,因为貌似我并没有直接使用这个变量,按照我的逻辑,虽然我声明的变量,但是我打算在经过下面一系列判断后就能给予初值,然后才会调用,那么应该没什么问题吧。然而却报错,我查看了半天没找到原因,最后按照提示点了下,发现给accrual变量赋了个初值0就不会有问题了。于是问问这里逻辑是哪里有了问题
import java.util.Scanner;
public class Study7 {
public static void main(String[] args){
//开启扫描仪
Scanner input = new Scanner(System.in);
//定义变量用来放本金
double capital;
//提示提示输入本金
System.out.println("请输入本金");
capital = input.nextDouble();
//定义变量用于存取年份
int year;
//提示输入年份
System.out.println("请输入定期存款年年限");
year = input.nextInt();
//定义变量存取利息
double accrual;
//判断存款年限选择不同的利率,计算利息
if(year == 1){
accrual = capital * 0.025 * 1;
}
if(year == 2){
accrual = capital * 0.027 * 2;
}
if(year == 3){
accrual = capital * 0.034 * 3;
}
if(year == 5){
accrual = capital * 0.036 * 5;
}
//定义变量存放本息,本息=本金+利息
double trueCapital = capital + accrual ;
//打印结果
System.out.println("本金=%s"+capital);
System.out.println("利息=%s"+accrual);
System.out.println("本息=%s"+trueCapital);
//关闭输入口
input.close();
}
}
...全文
446 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ToT8901 2017-03-17
  • 打赏
  • 举报
回复
反正你得写到一块
  • 打赏
  • 举报
回复
语法规范 约定, 使用局部变量之前需要初始化 或者被赋值 jls chapter16 Each local variable (§14.4) and every blank final field (§4.12.4, §8.3.1.2) must have a definitely assigned value when any access of its value occurs.
zs808 2017-03-15
  • 打赏
  • 举报
回复
因为编译器不知道你的year有可能会为什么值,所以它也就不会明白
//判断存款年限选择不同的利率,计算利息
        if(year == 1){
            accrual = capital * 0.025 * 1;
        }
        if(year == 2){
            accrual = capital * 0.027 * 2;
        }
        if(year == 3){
            accrual = capital * 0.034 * 3;
        }
        if(year == 5){
            accrual = capital * 0.036 * 5;
        }
这几个if会不会执行(比如year=6时,就不会accrual的赋值语句)。 然后下面你再用accrual时,编译器就会给你警告,你这个accrual没有值就用啦,容易出问题哦,赶紧改了。 再给你举个例子吧,如果你的代码改成下面这样:
// 定义变量存取利息
		double accrual;
		// 判断存款年限选择不同的利率,计算利息
		if (year == 1) {
			accrual = capital * 0.025 * 1;
		}
		else if (year == 2) {
			accrual = capital * 0.027 * 2;
		}
		else if (year == 3) {
			accrual = capital * 0.034 * 3;
		}
		else if (year == 5) {
			accrual = capital * 0.036 * 5;
		}else{
			System.out.println("年限无效");
			input.close();
			return;
		}
		// 定义变量存放本息,本息=本金+利息
		double trueCapital = capital + accrual;
编译器就可以放心的让你用accrual这个变量啦,因为编译器可以确定,如果你走到了capital + accrual这一句,accrual是肯定有值的。
ryuugu_rena 2017-03-15
  • 打赏
  • 举报
回复
可以把accrual定义到main外面,用作全局变量就不用非要赋值为0了,会默认为0.
MikeDDT009 2017-03-14
  • 打赏
  • 举报
回复
引用 1 楼 pany1209 的回复:
因为得所有的if有可能一个都没有命中。。。。
。。。。。原来如此,没想到编译会考虑到这步,以前没遇到过这种情况,才知道这样,还怀疑自己理解的先定义后是使用有什么地方理解错了
李德胜1995 2017-03-14
  • 打赏
  • 举报
回复
因为得所有的if有可能一个都没有命中。。。。

62,628

社区成员

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

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