class T1
{
public static void main(String[] args)
{
int c ;//初始化?
   try
{
int a = 4;
int b = 0;
c = a/b;
} catch(ArithmeticException e)//捕获异常
{
e.printStackTrace();//打印异常的跟踪信息
}

System.out.println(c);

}     
}代码如上,捕获运行时异常的一个简单例子。
如果不初始化c,编译不通过:提示“可能未初始化的变量c”;但如果不做异常处理,是否初始化c编译都是可以通过的。为什么在异常处理的时候必须初始化c呢??

解决方案 »

  1.   

    书上有一句话:  变量可以先定义,不初始化
    还有一句话: 变量在使用前,必须要先初始化。假设你的try语句里面有很多语句,编译器怎么在执行那一句的时候会报错列??
    有可能执行了:c = a/b;再出问题,也有可能在之前就出了问题。。如果之前就出了问题,那你的C相当于没有初始化,那没初始化的的变量能用么?
    System.out.println(c);
      

  2.   

    try里面内容不一定会去不执行的,所以c不一定会有初始值。就像你在try里面定义一个变量或者是类,在外面肯定用不了,编译器会报错说,变量没有定义。比如 在try{}里面定义 String str = "aa";在try{}外面System.out.printon(str);这肯定是不行的,这是同一个道理。
      

  3.   

    如果c=a/b以前就发生异常,那么就会进入exception,c就没有值,System.out.println(c);就无法通过
    如果你在catch处给c赋一个初始值,应该也能编译通过
    如果没有捕捉异常,那么这些代码就是一个整体,没有任何分支,即出异常就整体挂了,也不会走到System.out.println(c)了,也就是说保证了先给c赋值,再打印c,所以能编译通过
      

  4.   

    try的问题,你把System.out.println(c);
    去掉,或者放在try里边就没问题了。
      

  5.   

    你可以这样想,java中的基本类型是与内存相对应的,如果不使用就不分配内存,使用的时候就要分配内存,像你的程序int c ;//初始化?可以不初始化,就和不用它一样,输出也叫用了,c = a/b;明显是要给c一个值吗,而内存中没有对应的内存,所以编译器报告给你一个初始化的错误.提醒一句成员变量都是有默认值的.
    我觉得2楼的大胡子讲的挺好的