A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨彪 中级黑马   /  2012-8-13 18:13  /  2130 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨彪 于 2012-8-13 18:16 编辑
  1.          import java.util.Scanner;
  2.          public class IfDemo {
  3.         public static void main(String[] args) {
  4.                 Scanner sc = new Scanner(System.in);
  5.                 System.out.println("从键盘输入一个整数:");
  6.                 int x = sc.nextInt();
  7.                 //int y = 0;
  8.                 int y ;
  9.                 if (x < 1) {
  10.                         y = x;
  11.                 }
  12.                 else if(x>=1 && x<10){
  13.                         y = 2*x-1;
  14.                 }
  15.                  //else{
  16.                 else if(x>=10){  
  17.                         y = 3*x-11;
  18.                 }
  19.                 System.out.println(y);
  20.         }
  21. }
复制代码
为什么int y;的时候下面写成else if 就报错 ,但把else if  改成 else 不报错 ,或者给y赋上值,else if不变也不报错 这是怎么回事

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
我运行的没有错
回复 使用道具 举报
import java.util.Scanner;

public class Help01 {

public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);

       System.out.println("从键盘输入一个整数:");

       int x = sc.nextInt();

    //   int y = 0;

       int y ;

       if (x < 1) {

               y = x;

       }

       else if(x>=1 && x<10){

               y = 2*x-1;

       }

        else{

      // else if(x>=10){  

               y = 3*x-11;

       }

       System.out.println(y);

}

}
这是你想要运行的会出错的代码吗?可我运行的没有出错
回复 使用道具 举报
黑马连家华 发表于 2012-8-13 18:19
import java.util.Scanner;

public class Help01 {

请看好我的题 谢谢
回复 使用道具 举报
...不知道你是不是真的需要答案
你需要理解的是变量的初始化的问题
我只能说 else if 有可能不会执行其内部的代码
回复 使用道具 举报
黑马连家华 发表于 2012-8-13 18:36
...不知道你是不是真的需要答案
你需要理解的是变量的初始化的问题
我只能说 else if 有可能不会执行其内部 ...

看你怎分析我的问题了,
回复 使用道具 举报
史龙贤 黑马帝 2012-8-13 19:01:27
7#
本帖最后由 史龙贤 于 2012-8-13 19:48 编辑

楼上连兄已经说到点子上了,只是人家要分析过程,我简单罗嗦几句!

1、为什么int y;的时候下面写成else if 就报错?
答:y只定义了类型而没有赋值,else if语句是可选操作,有可能不执行;Java代码编译时只检查代码的合法性,如果x不满足if...else if语句中的判断条件,也就说直接跳过了该判断结构,直接读最后一句输出y值到控制台。由于y只定义没赋值,自然编译器就报告未初始化错误。
2、但把else if  改成 else 不报错 ?
答:如果你这样改,当前面的if ... elseif ...条件都不满足时,就会执行到else语句内容了,因为else语句已经没有判断条件了,else语句中 y = 3*x-11;初始化了y,那么最后打印结果。这样编译器不会报错。
3、或者给y赋上值,else if不变也不报错
答: 使用前先初始化时最好的,当然这肯定不会报错了,已经初始化过了,无论if...else if那段是否执行,都没问题啊,这个就不再罗嗦了。

还是新手,说的如果有错的,请多指点!

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 徐昌君 于 2012-8-18 21:19 编辑
  1. //先计算(x<1)中的数据,在计算(x>+10)中的数据,剩下的数据就是(x>=10)中的数据了。没必要在最后一个else后还要加上if了;
  2. import java.util.Scanner;
  3. public class IfDemo
  4. {
  5.         public static void main(String[] args)
  6.                 {
  7.                 Scanner sc = new Scanner(System.in);
  8.                 System.out.println("从键盘输入一个整数:");
  9.                 int x = sc.nextInt();
  10.                //int y = 0;
  11.                 int y ;
  12.                 if (x < 1)
  13.                                 {
  14.                         y = x;
  15.                 }
  16.                 else if(x>=10)
  17.                                 {  
  18.                         y = 3*x-11;
  19.                 }
  20.                                 else
  21.                                 {
  22.                         y = 2*x-1;
  23.                 }
  24.                                 System.out.println("y="+y);
  25.         }
  26. }
复制代码
  1. //方法同上,怎么计算简单怎么来;                        
  2. import java.util.Scanner;
  3. public class IfDemo
  4.         {
  5.                 public static void main(String[] args)
  6.                         {
  7.                                 Scanner sc = new Scanner(System.in);
  8.                                 System.out.println("从键盘输入一个整数:");
  9.                                 int x = sc.nextInt();

  10.                                 int y;
  11.                                 if(x<1)
  12.                                 {
  13.                                         y=x;
  14.                                 }
  15.                                 else if(x>=1&&x<10)
  16.                                 {
  17.                                         y=2*x-1;
  18.                                 }
  19.                                 else
  20.                                 {
  21.                                         y=3*x-11;
  22.                                 }
  23.                                 System.out.println("y="+y);
  24.                         }
  25.         }
复制代码
回复 使用道具 举报
个人理解:

楼主需要清楚局部变量的一些特点,第一我们必须声明局部变量,当我们调用局部变量时,必须给局部变量赋值才能调用,当我们不调用的时候可以不用赋初始值。

然后楼主要清楚if(x<10)
{
       
}else
{
       
}


if(x<10)
{
       
}else if(x>=10)
{
       
}
这两个代码也许我们看没有啥区别,可以对于虚拟机是有区别的,当我们在编译时,虚拟机就检查,当我们用第一个时,它的语法特点是,不管怎样都要执行一个,在你的代码里面体现就是都要给y赋值,赋值后我们调用y就不会出错了。当我们用第二个式子时,虚拟机就检查,你这个式子不一定会给y赋值,没有赋值我们就调用y所以编译就出错了
回复 使用道具 举报
我觉得这个问题的关键点在输出y的值
System.out.println(y):
y如果只是定义为整型不初始化值就输出的话就会报错,如
int y;
System.out.println(y);
而楼主的一堆if...else..if如果最后没有一个出口,即最后还是 else if的话,有可能这个判断中所以的判断都不会满足。即相当于:
int y;
{一堆可能全都不会执行的代码}
System.out.println(y);
这样就相当于定义后直接输出了。所以会报错。
新手理解。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马