public static void main(String[] args) {
// TODO Auto-generated method stub
int[] x = new int[3];
Scanner inputScan = new Scanner(System.in);
for(int i = 0; i < x.length;){
System.out.println("Please input the "+i+" integer:");
String inputInt = inputScan.nextLine();   

try {
x[i++] = Integer.parseInt(inputInt);  //1.和下面的两行有区别吗?
//x[i] = Integer.parseInt(inputInt);
                                               //i++;

} catch (NumberFormatException e) {
System.out.println("您输入的日期格式有误,请重新输入");
}
}
System.out.println(Arrays.toString(x));
}假设现在i=0,按照分析,如果在第一行注释那边输入一个字符串"a",那么将会产生异常,应该执行不到i++
可是现在的情况是,即使异常发生,也会执行到同一行的i++。但是如果写成下面这两行就没有问题

解决方案 »

  1.   

     
     51:  astore  4
     53:  aload_1
     54:  iload_3
     55:  iinc    3, 1
     58:  aload   4
     60:  invokestatic    #59; //Method java/lang/Integer.parseInt:(Ljava/lang/Str
    g;)字节码显示在第一种情况下,i++的操作会先于parseInt转换。
    如果这时候报错,i++已经执行了。
    暂时没找到相关的语言规范,如果有人看到的话,通知一声。
      

  2.   

    编译器对于赋值语句是人左向向生成代码的(C/JAVA都是如此)。
    如:x[3+a-b]=x+y;编译器在生成目标代码时,是遵守大多数编译原理中讲解的处理方式:(原理性示范)
    t1=3+a;
    t2=t1-b;
    //此时x[3+a-b]已编译处理成基本形式:x[t2]
    t3=x+y;
    x[t2]=t3;对于楼主的程序中:x[i++] = Integer.parseInt(inputInt);
    其处理方式是:i++在JAVA中处理成:t=i;i=i+1;然后用t代替原i++。
    t1=i;
    i=i+1;
    //此时x[i++] 编译处理成x[t]
    call ..... 设返回值存放在t2中
    x[t]=t2
      

  3.   

    人左向向:从左向右这个是怎么来看的啊?求教
    方法
    用javap程序,如:javap -s -v -l MyJavaProgram
    从MyJavaProgram.class文件中得到JAVA的汇编代码。
      

  4.   

    x[i++] = Integer.parseInt(inputInt);
    是先执行i++.然后再执行Integer.parseInt(inputInt)