JAVA异常处理机制之throws/throw使用情况的区别

JAVA中throw和throws的区别:https://www.cnblogs.com/xiohao/p/3547443.html

区别:(摘自上面的博客)
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

也就是异常处理是会一层层往上抛的,直到遇到了某个方法处理了这个异常或者最后抛给了JVM,让JVM去处理。这个是不太好的,因为JVM对异常的处理肯定是比较宽泛的,它无法具体到一些细节的问题上。简单的说就是如果你生病了,不管你生什么病,让你多喝温水总是没错的,但是没办法给你开出具体的治疗方案。因此最后是我们自己定义一个catch去处理这个异常。

一、使用throws的基本格式

	public int Abnormal() throws myException{

	}
	public int Abnormal() {
		if(age<0) {
			throw new myException("年龄不能负数");
		}
	}

二、throws的异常声明

这里的throws抛出的是一个异常类对象,这个对象带有所发生异常的信息。我们可以直接使用JAVA中已经封装好的异常信息类,也可以自己去定义一个异常类。

A、JAVA中已经定义好的异常类:

IOException:输入输出流异常

NullPointException:空指针异常

具体可以看下这篇博客,里面包含了JAVA中定义好的大部分异常:https://blog.csdn.net/yw_1207/article/details/79147468

我们可以来测试看看它抛出异常的情况:

package abnormalTest;
import java.io.IOException;

//定义一个测试类,检查JAVA中的异常处理机制
public class Test {
	int age;

	public void Abnormal() throws IOException{
		int i=0;
		int x=5/i;
		System.out.println(x);
	}

	//主函数入口
	public static void main(String[] args) throws IOException {
		Test t=new Test();
		t.Abnormal();
	}

}

程序运行结果:

分析:我们这里直接使用了JAVA中的IOException对象,由于我们在main函数中没有对这个异常进行处理,所以我们要给main函数加上throws IOException,指明我不想处理这个异常,请帮我把它抛给上一级。于是这个异常就被抛给了JAVA虚拟机,JAVA虚拟机根据IOException所带的异常信息,判断这是一个整数除以0的异常,于是终止程序,并且打印出"/ by zero"的报错信息。

B、自己定义一个异常类,这个用得比较少。如果我们需要抛出一个具体的异常信息可以用JAVA中已有的异常类构造一个新的异常类对象,把相应的异常信息传给它就可以了。如下图

这样子我们就可以打印出任何我们所想要的具体异常信息了。

三、异常处理

如果我们要对上一级方法中抛出来的异常进行处理,那么必须用到try...catch的结构。测试样例如下:

package abnormalTest;
import java.io.IOException;

//定义一个测试类,检查JAVA中的异常处理机制
public class Test {
	int age;
	public void Abnormal() throws IOException {
		int i=0;
		if(i==0) {
			throw new IOException("除以0错误");
		}
		int x=5/i;
		System.out.println(x);
	}

	//主函数入口
	public static void main(String[] args) {
		try {
			Test t=new Test();
			t.Abnormal();
		}catch(IOException e){
			System.out.println("出现了IOException异常");
		}catch(NullPointerException e) {
			System.out.println("出现了空指针异常");
		}
	}
}

运行结果如下。这里打印出的是catch中的异常处理信息“出现了IOException”,而没有打印出"除以0错误",说明这个异常在main函数中处理完就终止了,没有继续往上抛给JVM,这和我们前面的分析是一致的。然后我们这里定义两个catch方法分别来处理IOException和NullPointerException两种不同的异常

四、小结

throw/throws就是一个甩手掌柜,它只会把异常一层层地往上抛,直到有人去处理它。而try...catch就是那个劳苦工人,负责获取相应的异常并对它进行处理。

到此这篇关于JAVA异常处理机制之throws/throw使用情况的区别的文章就介绍到这了,更多相关JAVA异常处理机制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-07-15

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

Java throw:异常的抛出 程序可以用throw语句抛出明确的异常.Throw语句的通常形式如下: throw ThrowableInstance; 这里,ThrowableInstance一定是Throwable类类型或Throwable子类类型的一个对象.简单类型,例如int或char,以及非Throwable类,例如String或Object,不能用作异常.有两种可以获得Throwable对象的方法:在catch子句中使用参数或者用new操作符创建. 程序执行在throw语句之后立即

java处理异常的机制关键字throw和throws使用解析

在异常处理的过程中,throws和throw的区别是? throws:是在方法上对一个方法进行声明,而不进行处理,而是向上传,谁调用谁处理. throw:是在具体的抛出一个异常类型. throws的栗子: throws的话,就是这个方法有可能会产生异常,而我只是将它声明出去,我自己不处理,如果有人调用的时候,可以知道,这个方法,有可能会抛出异常,我要是调用的话,我就得处理,或者接着throws. 格式是:方法名(参数)throws 异常类1,异常类2,..... class Math{ publ

详解Java异常处理中throw与throws关键字的用法区别

抛出异常 抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常.下面它们之间的异同. 系统自动抛异常 当程序语句出现一些逻辑错误.主义错误或类型转换错误时,系统会自动抛出异常.如: public static void main(String[] args) { int a = 5, b =0; System.out.println(5/b); //function(); } 系统会自动抛出ArithmeticException异常: Exception in threa

如何区分JAVA中的throws和throw

throws和throw: throws:用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁. 用在方法声明后面,跟的是异常类名 可以跟多个异常类名,用逗号隔开 表示抛出异常,由该方法的调用者来处理 throws表示出现异常的一种可能性,并不一定会发生这些异常 throw:则是用来抛出一个具体的异常类型. 用在方法体内,跟的是异常对象名 只能抛出一个异常对象名 表示抛出异常,由方法体内的语句处理 throw则是抛出了异常,执行throw则一定抛出了某种异常 分别

简单讲解java中throws与throw的区别

Java中throws和throw的区别讲解 当然,你需要明白异常在Java中式以一个对象来看待. 并且所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,但是一般情况下Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 直接进入正题哈: 1.用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常. 1.1   throw是语句抛出一个异常. 语法:throw (异常对象);         

Java throw和throws使用区别分析

代码实例: 问题:为什么testRunntimeException()方法没有出现编译错误提示,而testCheckedException()方法却出现unhandle exception? 分析: Excepiton分两类:checked exception.runtime exception:直接继承自Exception就是checked exception,继承自RuntimeException就是runtime的exception. 你可以简单地理解checked exception就是

java中throws与try...catch的区别点

throws是将异常抛出,后续代码不再执行.而try-catch是将异常抛出,并且要继续执行后面的代码. package com.oracle; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Demo01Exception { /*Exception:编译期间异常,进行编译(写代码的过程) * runtimeException:运行期异

简单了解Java关键字throw和throws的区别

这篇文章主要介绍了简单了解Java关键字throw和throws的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 抛出异常有三种形式 throw throws 系统自动抛异常 一.系统自动抛异常 当程序语句出现一些逻辑错误.主义错误或类型转换错误时,系统会自动抛出异常:(举个栗子) public static void main(String[] args) { int a = 5, b =0; System.out.println(5/b

基于Java中throw和throws的区别(详解)

系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常. throw是语句抛出一个异常. 语法:throw (异常对象); throw e; throws是方法可能抛出异常的声明.(用在声明方法时,表示该方法可能要抛出异常) 语法:[(修饰符)](返回

Java异常处理与throws关键字用法分析

本文实例讲述了Java异常处理与throws关键字用法.分享给大家供大家参考,具体如下: Java异常处理 认识异常: 1.异常是导致程序中断运行的一种指令流,如果不对异常进行正确处理,则可能导致程序的中断执行,造成不必要的损失. 2.异常范例 空指针异常 Exc e=null; System.out.println(e.i); 除0异常 int a=10; int b=0; System.out.println(a/b); 3.处理异常 异常格式: try{ 异常语句: } catch(Exc

JAVA中的final关键字用法实例详解

本文实例讲述了JAVA中的final关键字用法.分享给大家供大家参考,具体如下: 根据上下文环境,java的关键字final也存在着细微的区别,但通常指的是"这是无法改变的."不想改变的理由有两种:一种是效率,另一种是设计.由于两个原因相差很远,所以关键子final可能被误用. 接下来介绍一下使用到final的三中情况:数据,方法,类 final数据 许多编程语言都有某种方法,来向编译器告知一块数据是恒定不变的.有时数据的恒定不变是很有用的,例如: 1. 一个编译时恒定不变的常量 2.

java中transient关键字用法分析

本文实例分析了java中transient关键字用法.分享给大家供大家参考.具体分析如下: java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原这个文件时,你可以将它转换为它本身.这可以极大地方便网络上的一些操作,但同时,因为涉及到安全问题,所以并不希望把类里面所有的东西都能存储(因为那样,别人可以通过序列化知道类里面的内容),那么我们就可以用上transient这个关键字,它的意思是临时的,即不会随类一起序列化到本地,所以当还原后

C#中var关键字用法分析

本文实例分析了C#中var关键字用法.分享给大家供大家参考.具体方法如下: C#关键字是伴随着.NET 3.5以后,伴随着匿名函数.LINQ而来, 由编译器帮我们推断具体的类型.总体来说,当一个变量是局部变量(不包括类级别的变量),并且在声明的时候初始化,是使用var关键字的前提.具体什么时候使用,什么时候不使用,以下是个人浅见. 1.声明匿名函数时使用var关键字 复制代码 代码如下: var temp = new {Name="", Category=""};

Java线程调度之线程休眠用法分析

本文实例分析了Java线程调度之线程休眠用法.分享给大家供大家参考.具体分析如下: Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率.   这里要明确的一点,不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制.   线程休眠的目的是使线程让出CPU的最简单的做法之一,线程休眠时候,会将CPU资源交给其他线程,以便能轮换执行,当休眠一定时间后,线程会苏醒,进入准备状态等待执行.   线程休眠的方法是Thread.sleep

PHP面向对象程序设计中的self、static、parent关键字用法分析

本文实例讲述了PHP面向对象程序设计中的self.static.parent关键字用法.分享给大家供大家参考,具体如下: 看到php里面有关于后期静态绑定的内容,虽然没有完全看懂,但是也收获不少东西. php官方手册介绍: http://php.net/manual/zh/language.oop5.late-static-bindings.php 不存在继承的时候 不存在继承的意思就是,就书写一个单独的类来使用的时候.self和static在范围解析操作符 (::) 的使用上,并无区别. 在静

Java 的抽象类原理与用法分析

本文实例讲述了Java 的抽象类原理与用法.分享给大家供大家参考,具体如下: Java 的抽象类 用abstract关键字来修饰一个类时,这个类叫做抽象类: 用abstract来修饰一个方法时,该方法叫做抽象方法. 抽象方法:只有方法的声明,没有方法的实现.以分号结束:abstract int abstractMethod(int a ); 含有抽象方法的类必须被声明为抽象类. 抽象类不能被实例化.抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体.若没有重写全部的抽象方法,

php中this关键字用法分析

本文实例讲述了php中this关键字用法.分享给大家供大家参考,具体如下: 下面定义了一个Cart类 <?php class Cart { var $items; // 购物车中的项目 // 把 $num 个 $artnr 放入车中 function add_item ($artnr, $num) { $this->items[$artnr] += $num; } // 把 $num 个 $artnr 从车中取出 function remove_item ($artnr, $num) { if

php中final关键字用法分析

本文实例讲述了php中final关键字用法.分享给大家供大家参考,具体如下: final关键字只能用来定义类和定义方法. 使用final关键字标记的类不能被继承 final class Person{ ....... } class Student extends Person{ ....... } 会出现错误提示.Fatal error :Class Student may not inherit from final class(Person) 使用final关键字标记的方法不能被子类覆盖

java中最大的整数用法分析

本文实例讲述了java中最大的整数用法.分享给大家供大家参考,具体如下: 8种基本数据类型中,long类型所能表示的整数范围是最大的,但还是有限的.另外,基本数据类型中的整数还有一个问题,那就是不是每个数都能够正确的取负数.例如,对int型而言,"-2147483648"取负就不能得到正确的结果,对其他整数类型也有这个问题. 为了解决这些问题,Java中专门提供了用来进行不限制大小的整数计算的类--java.math.BigInteger.该类可以对任意大小的整数进行操作,不过在进行计