学习啦 > 知识大全 > 知识百科 > 百科知识 > java中try语句和throw的区别

java中try语句和throw的区别

时间: 映芳735 分享

java中try语句和throw的区别

  在编程的时候往往会出现系统编译时无法检测到的错误,可是在运行时会出错,如果在可能出错的地方抛出异常,那样便严整了代码的正确性.比如数组越界,分母为0,文件等。 编程中会用try语句和throw语句来对编程运行过程中出现的异常情况进行处理。那么这两种有什么区别呢?下面小编带你去了解一下。

  Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。

  Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。

  用try来指定一块预防所有“异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的“异常”的类型。

  throw语句用来明确地抛出一个“异常”。throws用来标明一个成员函数可能抛出的各种“异常”。

  Finally为确保一段代码不管发生什么“异常”都被执行一段代码。可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。

  每当遇到一个try语句,“异常”的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种“异常”进行处理,堆栈就会展开,直到遇到有处理这种“异常”的try语句。

  try和throw的区别

  try:出现在方法体中,它自身是一个代码块,表示尝试执行代码块的语句。如果在执行过程中有某条语句抛出异常,那么代码块后面的语句将不被执行。

  throw:出现在方法体中,用于抛出异常。当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw。

  补充throws和catch语句

  throws:出现在方法的声明中,表示该方法可能会抛出的异常,允许throws后面跟着多个异常类型

  catch:出现在try代码块的后面,自身也是一个代码块,用于捕获异常try代码块中可能抛出的异常。catch关键字后面紧接着它能捕获的异常类型,所有异常类型的子类异常也能被捕获。

  小编举例

  package book.exception;

  /**

  * 抛出异常和声明异常

  * @author joe

  *

  */

  public class ThrowAndThrows {

  /**

  * 计算一个数字的平方根

  * @param nStr 以字符串的形式提供数字

  * @return 返回平方根

  * @throws Exception 当用户输入的字符串为空,

  * 或者字符串无法转换成数字,或者转换成的数字小于0,都会抛出异常

  */

  public static double sqrt(String nStr) throws Exception {

  if (nStr == null) {

  //用trow关键字抛出异常,当异常被抛出时,程序会跳出该方法

  throw new Exception("输入的字符不能为空!");

  }

  double n = 0;

  try {

  n = Double.parseDouble(nStr);

  } catch(NumberFormatException e) {

  //将parseDouble方法可能抛出的异常NumberFormatException捕获,

  //然后将捕获的异常重新封装并输出

  throw new Exception("输入的字符串必须能够转化成数字!", e);

  }

  if (n < 0 ){

  throw new Exception("输入的字符串转化成的数字必须大于0!");

  }

  return Math.sqrt(n);

  }

  public static void main(String[] args) throws Exception {

  try{

  ThrowAndThrows.sqrt("-124.56");

  } catch(Exception e) {

  //将sqrt方法声明的可能抛出的Exception异常捕获

  //打印捕获的异常的堆栈信息,从堆栈信息中可以发现异常发生的位置和原因

  System.out.println("Got a Exception:" + e.getMessage());

  e.printStackTrace();

  throw e; //不做进一步处理,将异常向外抛出

  }

  //将sqrt声明了可能会抛出的异常向外抛出,必须在方法声明中使用throws

  ThrowAndThrows.sqrt("-124.56");

  }

  }

  程序输出结果:

  Got a Exception:输入的字符串转化成的数字必须大于0!

  java.lang.Exception: 输入的字符串转化成的数字必须大于0!

  at book.exception.ThrowAndThrows.sqrt(ThrowAndThrows.java:30)

  at book.exception.ThrowAndThrows.main(ThrowAndThrows.java:37)

  Exception in thread "main" java.lang.Exception: 输入的字符串转化成的数字必须大于0!

  at book.exception.ThrowAndThrows.sqrt(ThrowAndThrows.java:30)

  at book.exception.ThrowAndThrows.main(ThrowAndThrows.java:37)

  源码分析:

  在main方法里,由于sqrt方法的声明中有throws关键字,所以,在调用该方法时,必须对throws后面声明的异常进行处置,处置的方法有两种:

  (1)main方法处理该异常,使用try.....catch语句,将可能会出现的异常的代码放在try块内,将处理异常的代码放在catch块内,并指明catch能够捕获的异常的类型,当异常被捕获时,执行catch块内的语句。

  (2)main方法不处理该异常,将异常向外层程序抛出。在方法声明中使用throws关键字抛出异常,方法体中不需要使用try...catch语句。

  异常类Exception的getMessage方法用来获取一场的描述信息,printStackTrace方法用来打印异常的堆栈信息,通过堆栈信息能够查明异常发生的原因和位置,在调试的时候常用。

537257