详解Java编程中throw和throws子句的使用方法

 更新时间:2015年09月28日 16:33:03   投稿:goldensun  
这篇文章主要介绍了详解Java编程中throw和throws子句的使用方法,是Java入门学习中的基础知识,需要的朋友可以参考下

Java throw:异常的抛出
程序可以用throw语句抛出明确的异常。Throw语句的通常形式如下:

 throw ThrowableInstance;


这里,ThrowableInstance一定是Throwable类类型或Throwable子类类型的一个对象。简单类型,例如int或char,以及非Throwable类,例如String或Object,不能用作异常。有两种可以获得Throwable对象的方法:在catch子句中使用参数或者用new操作符创建。

程序执行在throw语句之后立即停止;后面的任何语句不被执行。最紧紧包围的try块用来检查它是否含有一个与异常类型匹配的catch语句。如果发现了匹配的块,控制转向该语句;如果没有发现,次包围的try块来检查,以此类推。如果没有发现匹配的catch块,默认异常处理程序中断程序的执行并且打印堆栈轨迹。

下面是一个创建并抛出异常的例子程序,与异常匹配的处理程序再把它抛出给外层的处理程序。

// Demonstrate throw.
class ThrowDemo {
 static void demoproc() {
  try {
   throw new NullPointerException("demo");
  } catch(NullPointerException e) {
   System.out.println("Caught inside demoproc.");
   throw e; // rethrow the exception
  }
 }

 public static void main(String args[]) {
  try {
   demoproc();
  } catch(NullPointerException e) {
   System.out.println("Recaught: " + e);
  }
 }
}

该程序有两个机会处理相同的错误。首先,main()设立了一个异常关系然后调用demoproc( )。 demoproc( )方法然后设立了另一个异常处理关系并且立即抛出一个新的NullPointerException实例,NullPointerException在下一行被捕获。异常于是被再次抛出。下面是输出结果:

Caught inside demoproc.
Recaught: java.lang.NullPointerException: demo

该程序还阐述了怎样创建Java的标准异常对象,特别注意下面这一行:

 throw new NullPointerException("demo");


这里,new用来构造一个NullPointerException实例。所有的Java内置的运行时异常有两个构造函数:一个没有参数,一个带有一个字符串参数。当用到第二种形式时,参数指定描述异常的字符串。如果对象用作 print( )或println( )的参数时,该字符串被显示。这同样可以通过调用getMessage( )来实现,getMessage( )是由Throwable定义的。

Java throws子句
如果一个方法可以导致一个异常但不处理它,它必须指定这种行为以使方法的调用者可以保护它们自己而不发生异常。做到这点你可以在方法声明中包含一个throws子句。一个 throws 子句列举了一个方法可能抛出的所有异常类型。这对于除Error或RuntimeException及它们子类以外类型的所有异常是必要的。一个方法可以抛出的所有其他类型的异常必须在throws子句中声明。如果不这样做,将会导致编译错误。

下面是包含一个throws子句的方法声明的通用形式:

type method-name(parameter-list) throws exception-list{
 // body of method
}

这里,exception-list是该方法可以抛出的以有逗号分割的异常列表。

下面是一个不正确的例子。该例试图抛出一个它不能捕获的异常。因为程序没有指定一个throws子句来声明这一事实,程序将不会编译。

// This program contains an error and will not compile.
class ThrowsDemo {
 static void throwOne() {
  System.out.println("Inside throwOne.");
  throw new IllegalAccessException("demo");
 }
 public static void main(String args[]) {
  throwOne();
 }
}

为编译该程序,需要改变两个地方。第一,需要声明throwOne( )引发IllegalAccess Exception异常。第二,main( )必须定义一个try/catch 语句来捕获该异常。正确的例子如下:

// This is now correct.
class ThrowsDemo {
 static void throwOne() throws IllegalAccessException {
  System.out.println("Inside throwOne.");
  throw new IllegalAccessException("demo");
 }
 public static void main(String args[]) {
  try {
   throwOne();
  } catch (IllegalAccessException e) {
   System.out.println("Caught " + e);
  }
 }
}

下面是例题的输出结果:

inside throwOne
caught java.lang.IllegalAccessException: demo

相关文章

  • spring多个事务管理器踩坑及解决

    spring多个事务管理器踩坑及解决

    这篇文章主要介绍了spring多个事务管理器踩坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java+MySQL前后端连接新手小白教程

    Java+MySQL前后端连接新手小白教程

    Java作为一种广泛使用的编程语言之一,在开发Web应用程序时经常需要连接MySQL数据库进行数据操作,下面这篇文章主要给大家介绍了关于Java+MySQL前后端连接的相关资料,需要的朋友可以参考下
    2024-03-03
  • springboot2.0.0配置多数据源出现jdbcUrl is required with driverClassName的错误

    springboot2.0.0配置多数据源出现jdbcUrl is required with driverClassN

    这篇文章主要介绍了springboot2.0.0配置多数据源出现jdbcUrl is required with driverClassName的错误,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 基于java枚举类综合应用的说明

    基于java枚举类综合应用的说明

    一个枚举类,可以看成包括它的一些子类(枚举)的一个类,而且枚举类的构造方法只能是私有的
    2013-05-05
  • java实现把一个List集合拆分成多个的操作

    java实现把一个List集合拆分成多个的操作

    这篇文章主要介绍了java实现把一个List集合拆分成多个的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 关于Spring3 + Mybatis3整合时多数据源动态切换的问题

    关于Spring3 + Mybatis3整合时多数据源动态切换的问题

    这篇文章主要介绍了关于Spring3 + Mybatis3整合时多数据源动态切换的问题,需要的朋友可以参考下
    2017-04-04
  • 深入浅析Java常用的格式化Json工具类

    深入浅析Java常用的格式化Json工具类

    这篇文章主要介绍了Java常用的格式化Json工具类的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • RocketMq事务消息发送代码流程详解

    RocketMq事务消息发送代码流程详解

    这篇文章主要介绍了RocketMq事务消息发送代码流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot处理form-data表单接收对象数组的方法

    SpringBoot处理form-data表单接收对象数组的方法

    form-data则是一种更加灵活的编码方式,它可以处理二进制数据(如图片、文件等)以及文本数据,这篇文章主要介绍了SpringBoot处理form-data表单接收对象数组,需要的朋友可以参考下
    2023-11-11
  • Java中BigDecimal与0比较的一个坑实战记录

    Java中BigDecimal与0比较的一个坑实战记录

    BigDecimal属于大数据,精度极高,不属于基本数据类型,属于java对象,下面这篇文章主要给大家介绍了关于Java中BigDecimal与0比较的一个坑的相关资料,需要的朋友可以参考下
    2022-12-12

最新评论