Java异常及异常处理
如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。此时,这个方法会立刻退出同时不返回任何值。另外,调用这个方法的其他代码也无法继续执行,异常处理机制会将代码执行交给异常处理器。
异常的分类
Throwable是Java语言中所有错误或异常的超类。下一层分为Error和Exception。
Throwable的常用方法:
String getMessage() 返回此throwable的详细消息字符串;
void printStackTrace() 将此throwable及其追踪输出至标准错误流;
String toString() 返回此throwable的简短描述;
Error
Error类是指Java运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止,它是由Java虚拟机抛出的。
Exception(RuntimeException、CheckedException)
Exception又有两个分支,一个是运行时异常RuntimeException,一个是检查时异常CheckedException。
RuntimeException如:NullPointerException、ClassCastException;一个是检查异常CheckedException,如IO错误导致的IOException、SQLException。RuntimeException是那些可能在Java虚拟机正常运行期间抛出的异常的超类。如果出现RuntimeException,那么一定是程序员的错误。
检查异常CheckedException:一般是外部错误,这种异常都发生在编译阶段,Java编译器会强制程序去捕获此类异常,即会出现要求你把这段可能出现异常的程序进行try...catch,该类异常一般包括几个方面:
1)试图在文件尾部读取数据;
2)试图打开一个错误格式的URL;
3)试图根据给定的字符串查找class对象,而这个字符串表示的类并不存在;
异常的处理方式
抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常。
1)对代码块用try...catch进行异常捕获处理
单个异常的处理
try {
这里写可能出错的代码
} catch (Exception e) {
这里写可能出现的错误异常的处理
}finally{
这里写一定会执行的代码,有些资源需要关闭的时候
}
多个异常的处理
try{
可能出现问题的代码
}catch(异常类名1 对象名1){
//异常处理
}catch(异常类名2 对象名2(){
//异常处理
}
Jdk7以后出现另一种方式处理多个异常:
try {
String strDate = "2018-6-20" ;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
//解析
Date d = sdf.parse(strDate) ;
System.out.println(d);
}catch(ParseException e) { //创建一个异常对象:PareException e = new ParseException() ;
//使用throwable里面的一些方法
String str = e.getMessage() ;
System.out.println(str);//Unparseable date: "2018-6-20"
String str = e.toString() ;//简单描述
System.out.println(str);//包名.类名: getMessage() ;
e.printStackTrace();
}
finally{
//里面的代码一定会被执行,除非jvm退出了
}
public static void main(String[] args) {
String s = "abc";
if(s.equals("abc")) {
throw new NumberFormatException();
} else {
System.out.println(s);
}
}
int div(int a,int b) throws Exception{
return a/b;
}
2)在该代码的方法体外用throws(表示可能出现的异常)进行抛出声明,告知此方法的调用者这段代码可能会出现这些异常,你需要谨慎处理。此时有两种情况:
如果声明抛出的异常是非运行时异常,此方法的调用者必须显式地用try...catch块进行捕获或者继续向上层抛出异常。
如果声明抛出的异常是运行时异常,此方法的调用者可以选择地进行异常捕获处理。
throws也是表示抛出异常,它后面跟的异常类名,并且可以多个异常类名中间用逗号隔开;
xxx 返回值 方法名()throws 异常类名{}
例如:
public void show() throws IOException,ClassNotFoundException{...}
3)在代码块用throw手动抛出一个异常对象,此时也有两种情况:
如果抛出的异常对象是非运行时异常,此方法的调用者必须显式地用try...catch块进行捕获或者继续向上层抛出异常(使用throws)。
如果抛出的异常对象是运行时异常,此方法的调用者可以选择地进行异常捕获处理。(如果最终将异常抛给main方法,则相当于交给JVM自动处理,此时JVM会简单地打印异常信息)。
## throw和throws的区别
位置不同
1)throws用在函数上,后面跟的是异常类,可以跟多个;而throw用在函数内,后面跟的是具体的异常对象。
功能不同
2)throws用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方式;throw抛出具体的问题对象,执行到throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。也就是说throw语句独立存在时,下面不要定义其他语句,因为执行不到。
3)throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
4)两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
throws:用来声明一个方法可能产生的所有异常,不做任何处理而是将异常上传,谁调用我我就抛给谁。
用在方法声明后面,跟的是异常类名;
可以跟多个异常类名,用逗号隔开;
表示抛出异常,由该方法的调用者来处理;
throws表示出现异常的一种可能性,并不一定会发生这些异常;
package com.xinkaipu.Exception;
class Math{
public int div(int i,int j) throws Exception{ int t=i/j; return t; }
}
public class ThrowsDemo {
public static void main(String args[]) throws Exception{ Math m=new Math(); }
}
throw:用来抛出一个具体的异常类型
用在方法体内,跟的是异常对象名;
只能抛出一个异常对象名;
表示抛出异常,由方法体内的语句处理;
throw则是抛出了异常,执行throw则一定抛出了某种异常;
package com.xinkaipu.Exception;
public class TestThrow
{
public static void main(String[] args)
{
try
{
//调用带throws声明的方法,必须显式捕获该异常。否则,必须在main方法中再次声明抛出
throwChecked(-3);
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
//调用抛出Runtime异常的方法既可以显式捕获该异常,也可不理会该异常
throwRuntime(3);
}
public static void throwChecked(int a)throws Exception
{
if (a > 0)
{
//自行抛出Exception异常。该代码必须处于try块里,或处于带throws声明的方法中
throw new Exception("a的值大于0,不符合要求");
}
}
public static void throwRuntime(int a)
{
if (a > 0)
{
//自行抛出RuntimeException异常,既可以显式捕获该异常。也可完全不理会该异常,把该异常交给该方法调用者处理
throw new RuntimeException("a的值大于0,不符合要求");
}
}
}
try...catch...finally 语句执行顺序
1)finally语句总会执行。不管前面try..catch语句中是否有return,是否有异常,finally都会执行!
2)如果try...catch中有return语句,finally中没有return,那么在finally中修改除包装类型和静态变量、全局变量以外的数据都不会对try...catch中返回的变量有任何影响
3)尽量不要在finally中使用return语句,如果使用的话,会忽略try、catch中的返回语句,也会忽略try、catch中的异常,屏蔽了错误的发生
4)finally中避免再次抛出异常,一旦finally中发生异常,代码执行将会抛出finally中的异常信息,try、catch中的异常将被忽略
5)finally不能单独使用
异常中的注意事项
1)运行到try块中,如果有异常抛出,则转到catch块,catch块执行完毕后,执行finally块的代码,再执行finally块后面的代码。如果没有异常抛出,执行完try块,也要去执行finally块的代码,然后执行finally块后面的语句。
2)throw是语句抛出一个异常;throws是方法抛出一个异常;
3)throws可以单独使用,但throw不能,throw要么和try...catch...finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。
4)如果finally有return语句,永远返回finally中的结果,避免该情况。
Java异常及异常处理的更多相关文章
- 第11章 Java异常与异常处理
1.Java异常简介 1.什么是异常异常出现的时候代码会无法正常运行下去,会产生各种问题2.捕捉异常的作用提早发现异常,方便查找问题,并给出解决方法3.Java中的异常1.Java中所有不正常的类都是 ...
- java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类
package cn.kecheng; import java.util.Scanner; /**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中 ...
- Java异常与异常处理简单使用
异常就是程序运行过程中阻止当前方法或作用域继续执行的问题: 任何程序都不能保证完全正常运行,当发生异常时,需要我们去处理异常,特别是一些比较重要的场景,异常处理的逻辑也会比较复杂,比如:给用户提示.保 ...
- 那些年,我们不懂的却又不得不提的 JAVA异常和异常处理!
---恢复内容开始--- 首先,我是个小小的菜鸟,最近突然突发奇想,想研究一下java的异常和异常的处理,稍有些理解,老鸟们莫要嘲笑... 既然要讲异常和异常的处理,我们就要先了解异常,那么,什么是异 ...
- JAVA异常与异常处理详解
一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1.Java中的所有不正常类都 ...
- JAVA异常及其异常处理方式
异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用Syste ...
- Java异常与异常处理
异常体系结构 1.所有异常都继承于Throwable类,其下有两大子类: (1)Error类:错误,一般编程人员不太接触,如虚拟机错误.线程死锁.硬伤:使程序崩溃 (2)Exception类:异常,编 ...
- JAVA异常与异常处理详解【转】
感谢!!!原文地址:https://www.cnblogs.com/knightsu/p/7114914.html 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在ja ...
- JAVA 异常和异常处理
目录 一.异常 1.基本概念 2.异常体系图 3.五大运行时异常 4.编译异常 二.异常处理 1.异常处理的方式 1.1try-catch异常处理 注意事项 课堂练习题 1.2throws异常处理 注 ...
随机推荐
- 华为云 AI 实战营计划,带你迈上 AI 之路
当今,AI的开发人才需求呈现极大的供需不平衡.所有开发者都关心,要如何从一名开发者晋升为AI开发者?AI开发能力,是主要的进入障碍.不用慌,华为云推出了 <华为云ModelArts-Lab AI ...
- 给一线讲产品·8期|VPC、子网、安全组,是什么关系?
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...
- OA思维导图(第一次画)
- CF 17E Palisection 求相交回文串个数
In an English class Nick had nothing to do at all, and remembered about wonderful strings called pal ...
- POJ 3660 cow contest (Folyed 求传递闭包)
N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we ...
- WebGPU学习(五): 现代图形API技术要点和WebGPU支持情况调研
大家好,本文整理了现代图形API的技术要点,重点研究了并行和GPU Driven Render Pipeline相关的知识点,调查了WebGPU的相关支持情况. 另外,本文对实时光线追踪也进行了简要的 ...
- intellij idea使用tomcat maven plugin
环境 java 1.8.0_111 tomcat tomcat-8.5.11 maven 3.2.5 intellij idea 14.0.3 命令行使用 建maven工程 mvn archetype ...
- usb2.0高速视频采集之68013A寄存器配置说明
任何的固件编程离不开与与原理图参考,图纸中所采用的是USB的Slave_fifo传输方式,具体配置与图纸对应即可. •USB_IFCLK:同步Slave_FIFO模式,输入频率范围5M-48M,在FP ...
- Linux环境(服务器)下非root用户安装Python3.6
Linux环境(服务器)下非root用户安装Python3.6 在管理实验室集群时候,遇到的问题--非root用户在搭建自己环境时候,如何搭建. 注意: root用户的根目录是root,非root用户 ...
- python学习-for
# 对字典的遍历. key-value# dict_my = {"class":"python17","goal":"翻倍&quo ...