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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Tesla时光 中级黑马   /  2012-9-4 21:30  /  1522 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 翁发达 于 2012-9-4 22:14 编辑

这段代码编译没有出错,但运行却抛个异常出来,
没有任何结果,按理说我程序就算有异常,finally也是必须执行的,那现在是为什么?
import java.io.*;
public class Test3
{
public static void main(String args[])
{
  int a=5;
  int b=0;
  System.out.println(a/b);
  try
  {
   System.out.println(a/b);
  }
  catch(ArithmeticException e)
  {
   System.out.println("除数不可以为0");
  }
  finally
  {
   System.out.println("程序结束");
  }
}
}

8 个回复

倒序浏览
本帖最后由 方志亮 于 2012-9-4 21:39 编辑

finally 块必须与 try 或 try/catch 块配合使用。此外,不可能退出 try 块而不执行其 finally 块。如果 finally 块存在,则它总会执行。(无论从那点看,这个陈述都是正确的。有一种方法可以退出 try 块而不执行 finally 块。如果代码在 try 内部执行一条 System.exit(0); 语句,则应用程序终止而不会执行 finally 执行。另一方面,如果您在 try 块执行期间拨掉电源,finally 也不会执行。)

import java.io.*;
public class Test3{public static void main(String args[]){
  int a=5;
int b=0;
System.out.println(a/b);//因为这里 系统在就抛出了异常 所以就停止了
  try  {
System.out.println(a/b);
}  catch(ArithmeticException e)
{  
System.out.println("除数不可以为0");
}
finally  {
System.out.println("程序结束");  
}
}
}
回复 使用道具 举报
public class Test3
{
public static void main(String args[])
{
  int a=5;
  int b=0;
  //System.out.println(a/b); //这句话是关键,导致你还是异常报错。你都放到try里面了怎么还在主函数里面放一份
  try
  {
   System.out.println(a/b);
  }
  catch(ArithmeticException e)
  {
   System.out.println("除数不可以为0");
  }
finally
  {
  System.out.println("程序结束");
  }
}
}


你小子都这么超前啦,老师今天还在复习接口实现啊
我表示那个老师我是听不懂。

回复 使用道具 举报
import java.io.*;
public class Test3
{
public static void main(String args[])
{
  int a=5;
  int b=0;
  System.out.println(a/b);  try
  {
   System.out.println(a/b);
  }
  catch(ArithmeticException e)
  {
   System.out.println("除数不可以为0");
  }
  finally
  {
   System.out.println("程序结束");
  }
}
}
在红线处就已经有异常了,后面的根本不会读到,你写的有问题,如果把红色的注释掉如下:
import java.io.*;
public class Test3
{
public static void main(String args[])
{
  int a=5;
  int b=0;
  //System.out.println(a/b);
  try
  {
   System.out.println(a/b);
  }
  catch(ArithmeticException e)
  {
   System.out.println("除数不可以为0");
  }
  finally
  {
   System.out.println("程序结束");
  }
}
}
这样就能成功
回复 使用道具 举报
System.out.println(a/b);这一步错了,因为b=0,所以在这一步就会抛出异常Exception in thread "main" java.lang.ArithmeticException: / by zero
抛出异常后,就不会再往下执行,所以try、catch代码块就不会执行
回复 使用道具 举报
同意二楼的,try再向上移一行,放在System.out.println()前面去
回复 使用道具 举报
对于有可能发生异常的功能要在函数上声明出去,通过throws Exception来实现,调用这个函数时也要做出相应
的处理:抛出异常(throws Exception)或者try{}catch(){}

try
{
需要被检测的代码
}
catch (异常类变量)
{
处理异常的代码(处理方式)
}
finally
{
一定要执行的语句
}

楼主你的代码:
import java.io.*;
public class Test3
{
public static void main(String args[])
{
  int a=5;
  int b=0;
  System.out.println(a/b); //这一行有可能发生异常,所以处理的话应该放在try语句里面。
  try
  {
   System.out.println(a/b);
  }
  catch(ArithmeticException e) //ArithmeticException异常属于运行时异常RuntimeException的子类,如果抛出这个异常可以不用处理一样通过。在这直接用Exception就行或自定义异常
  {
   System.out.println("除数不可以为0");
  }
  finally
  {
   System.out.println("程序结束");
  }
}
}



回复 使用道具 举报
虚拟机读到这句 System.out.println(a/b);的时候直接通不过程序停止。或者可以将System.out.println(a/b)封装成方法先进性异常抛出声明在进行捕获处理
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马