黑马程序员技术交流社区

标题: if else 的问题 [打印本页]

作者: 杨彪    时间: 2012-8-13 18:13
标题: if else 的问题
本帖最后由 杨彪 于 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不变也不报错 这是怎么回事
作者: 黑马连家华    时间: 2012-8-13 18:18
我运行的没有错
作者: 黑马连家华    时间: 2012-8-13 18:19
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:26
黑马连家华 发表于 2012-8-13 18:19
import java.util.Scanner;

public class Help01 {

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

看你怎分析我的问题了,
作者: 史龙贤    时间: 2012-8-13 19:01
本帖最后由 史龙贤 于 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那段是否执行,都没问题啊,这个就不再罗嗦了。

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


作者: 徐昌君    时间: 2012-8-18 21:09
本帖最后由 徐昌君 于 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.         }
复制代码

作者: 官文昌    时间: 2012-8-18 22:38
个人理解:

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

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


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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2