为何不是异常?
源码如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, AppEvnts;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  I,J:integer;
  E:Exception;
begin
  J := 0;
  try
      for I := 1000 downto 0 do   //<---为何将本行注释就无法显示“被零除”
        J := J + J div I;         //<---还是被零除啊!
  except
    on E:EDivByZero do
    begin
      //raise Exception.Create('被零除!');
      ShowMessage('被零除!');
    end;   // on E:Exception do
  //  begin
   //   showmessage('Exception异常!');
   // end;
  end;
end;end.

解决方案 »

  1.   

    var
      I,J:integer;
      E:Exception;
    begin
      J := 0;      for I := 1000 downto 0 do   //<---为何将本行注释就无法显示“被零除”  try
            J := J + J div I;         //<---还是被零除啊!
      except
        on E:EDivByZero do
        begin
          //raise Exception.Create('被零除!');
          ShowMessage('被零除!');
        end;   // on E:Exception do
      //  begin
       //   showmessage('Exception异常!');
       // end;
      end;
    end;
      

  2.   

    var
      I,J:integer;
      E:Exception;
    begin
      J := 0;      for I := 1000 downto 0 do   //<---为何将本行注释就无法显示“被零除”  
    try
            J := J + J div I;         //<---还是被零除啊!
      except
        on E:EDivByZero do
        begin
          //raise Exception.Create('被零除!');
          ShowMessage('被零除!');
        end;   // on E:Exception do
      //  begin
       //   showmessage('Exception异常!');
       // end;
      end;
    end;
      

  3.   

    不对,将 for注释后,无法显示对话框啊!
      

  4.   

    因为I是局部变量。其初始值是未知的,而且多半不可能是0。由于你注释了循环的代码,所以I就没有地方付初值了。只有给I付了初值,才能出现被零除的例外。
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I,J:integer;
      E:Exception;
    begin
      J := 0;
      I := 0;
      try
          for I := 1000 downto 0 do   //<---为何将本行注释就无法显示“被零除”
            J := J + J div I;         //<---还是被零除啊!
      except
        on E:EDivByZero do
        begin
          //raise Exception.Create('被零除!');
          ShowMessage('被零除!');
        end;   // on E:Exception do
      //  begin
       //   showmessage('Exception异常!');
       // end;
      end;
    end;
      

  5.   

    对阿,你没有try语句:
      var
        I,J:integer;
        E:Exception;
      begin
        J := 0;
        for I := 1000 downto 0 do //<-为何将本行注释就无法显示“被零除”  
          try
            J := J + J div I;         //<---还是被零除啊!
          exception 
            ShowMessage('被零除!');
          end;
      end;
      

  6.   

    to dyf2001():
      注释for以后,不就是
          try
            J := J + J div I;         //<---还是被零除啊!
          exception 
            ShowMessage('被零除!');
          end;
      

  7.   

    个人意见,如果注释掉for I := 1000 downto 0 do ,编译器认为,没有变量被引用,当一个程序块内的所有变量都没有被引用时,编译器不会编译那块。所以不会编译try那块,也就不会出现'被零除!'。
      

  8.   

    to tjlai(西部牛) :
     不对吧
      

  9.   

    to fangchangjiang: 这是我的猜想,估计是编译器对代码优化的结果。
    如下代码显示,try程序块被忘掉了。
    var
      I,J:integer;
      E:Exception;
    begin
      J := 0;
      try
       //   for I := 1000 downto 0 do   //<---为何将本行注释就无法显示“被零除”
         J := J + J div I ;         //<---还是被零除啊!
      except
        on E:EDivByZero do
        begin
          //raise Exception.Create('被零除!');
          ShowMessage('被零除!');
        end;  end;
      ShowMessage('show !'); //added by tjlai 2002.11.18,
    end;
      

  10.   

    to tjlai(西部牛) :
      怎么会?只不过异常未检查出来,所以才显示“show!”罢了。否则,delphi的异常处理机制不就是摆设了!?
      但为何,直接计算就不算异常呢?
      不过,还是谢谢你!
      

  11.   

    to  bingshi(碎石) :
      那么,加上for 行,为何就发现异常了呢?
      

  12.   

    可能是代码被编译器优化的原因:因初始值 J := 0则 “J div I”结果,正常情况下总是为零,故“J div I”被优化为总是零,而不用去检测I的值,所以不会出现被零除的情况。
      

  13.   

    试了终于明白了。这是编译器优化造成的。因为你这段代码中I和J没有任何用处,J虽然付了两次值,但都没有使用,所以编译器优化了。
    请注意这时候,编译器会产生“Vaule assigned to 'J' never used”的Hint。
    消除这个编译优化有两种方法:
    1)在Project|Options的对话框中的Compiler页去掉Optimization这个勾,重新Build程序。
    2)在代码中增加冗余代码,不让编译器优化。如:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I,J:integer;
    begin
      J := 0;
      I := 0;
      try
         // for I := 1000 downto 0 do   //<---为何将本行注释就无法显示“被零除”
            J := J + J div I;         //<---还是被零除啊!
            //ShowMessage(IntToStr(J));
      except
        on E:EDivByZero do
        begin
          //raise Exception.Create('被零除!');
          ShowMessage('被零除!');
        end;   // on E:Exception do
      //  begin
       //   showmessage('Exception异常!');
       // end;
      end;
    end;
      

  14.   

    to  ddqqyy(ddqqyy) :
      将J:=1也不对
      

  15.   

    代码弄错了,应该这样:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I,J:integer;
    begin
      J := 0;
      I := 0;
      try
         // for I := 1000 downto 0 do   //<---为何将本行注释就无法显示“被零除”
            J := J + J div I;         //<---还是被零除啊!
            ShowMessage(IntToStr(J));
      except
        on E:EDivByZero do
        begin
          //raise Exception.Create('被零除!');
          ShowMessage('被零除!');
        end;   // on E:Exception do
      //  begin
       //   showmessage('Exception异常!');
       // end;
      end;
    end;
      

  16.   

    同意: chechy(为程序而奋斗)的!!!
    因为变量j没有被使用,编译器优化掉了
      

  17.   

    看看帮助,就明白
    EDivByZero is raised when an application tries to divide an integer by zero. In practice, this error is easy to trap and correct in a try...except block.
      

  18.   

    to  chechy(为程序而奋斗) :
      没错,将Project|Options的对话框中的Compiler页去掉Optimization这个勾,重新Build程序。即可,不用再showmessage了。
      给分。
      

  19.   

    是的,我就是拷贝了这个。如果不去掉优化,那么就得ShowMessage。
      

  20.   

    TO:fangchangjiang(长江)
    我想可能是编译器只能判断简单的语句,对于FOR之类的循环语句可能就必须编译了,还有把j声明成外部变量时,i的初始值并不是零。