【java笔记】异常处理
目录
异常分类:
区别:
异常产生过程的解析:
异常的处理:
抛出异常thorw关键字
Objects非空判断
声明异常throws
捕获异常try...catch
Throwable类中定义了3个异常处理的方法:
多个异常捕获:
finally代码块:
子父类的异常:
概念:程序执行过程中,出现非正常的情况,最终会导致JVM的非正常停止
在java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理
异常并不是语法错误,语法错误,编译不通过,不会产生字节码文件,根本不能运行
异常体系:
异常的根类(所有异常和错误的超类):java.lang.Throwable。其下有两个子类,java.lang.Error(错误)与java.lang.Exception(异常)。
异常分类:
Exception:编译期异常:进行编译(写代码)java程序出现的问题
RuntimeExcetion:运行期异常,java程序运行过程中出现的问题
Error:错误
区别:
异常处理掉后程序可以继续执行,错误必须修改源代码后程序才可以继续执行
异常产生过程的解析:
public static int getElement(int[] arr,int index){int ele=arr[index];return ele;
}int[]arr={1,2,3};
int e=getElement(arr,0);//1
int e=getElemnet(arr,3);//数组越界异常
1.JVM会根据异常产生的原因创建一个异常对象,包含异常产生的内容,原因和位置
2.在getElement方法中,没有异常处理逻辑(try-catch),那么JVM就会把异常对象抛出给方法的调用者main方法来处理这个异常
3、main方法接受到了异常对象,main方法也没有异常的逻辑处理,继续吧对象抛出给JVM处理
4、JVM接受到了异常对象,(1)把异常对象(内容,原因,位置)以红色字体打印在控制台
(2)JVM会终止当前正在执行的java程序(中断处理)
异常的处理:
抛出异常thorw关键字
使用throw关键字在指定的方法中抛出指定的异常
throw new xxxException("异常产生的原因");
注意:
1、throw关键字必须写在方法的内部
2、throw关键字后边new的对象必须是Excetion或者Exception的子类对象
3、throw关键字抛出指定的异常对象,就必须处理这个异常对象
throw关键字后边创建的是RuntimeException或者是RuntimeException子类对象,可以不处理,默认交给JVM处理
throw关键字后边创建的是编译异常(写代码时报错),就必须处理这个异常,要么throws,要么try....catch
public static int getElement(int[] arr,int index){对传递过来的参数数组,进行合法性校验如果数组arr的值是NULL,那么就抛出空指针异常,告知方法的调用者"传递的数组值是null"
if(arr==null){throw new NullPointerExcetion("传递的数组的值是null");//运行期异常
}
if(index<0||index>arr.length-1){throw new ArrayIndexOutofBoundsException("传递的索引超出了数组的使用范围");//运行期异常
int ele=arr[index];
return ele;
}
int []arr=null;
int e=getElement(arr,0);
sout(e);
}
Objects非空判断
Objects是null-save(空指针安全的)或null-tolerant(容忍空指针的),在它的源码中,对象为null的情况进行了抛出异常操作
Objects类中的静态方法:
public static <T> T requireNonNull(T obj):查看指定引用对象是不是Null
public static <T> T requireNonNull(T obj):查看指定引用对象不是null
{if(obj==null){throw new NullPointerExcetion();return obj;}
}ObJects.requireNonNull(null,"传递的对象是空")
声明异常throws
异常处理的第一种方式,把异常对象声明抛出给方法的调用者处理
格式:
修饰符 返回值 方法名(参数列表) throws AAAException,BBBException{
throw new AAAException("1");
throw new BBBException("2");
}
注意:
(1)throws关键字必须写在方法声明处
(2)throws关键字后面声明的异常必须是Exception或者Exception的子类
(3)方法内部如果抛出了多个异常,那么throws后面必须也声明多个异常
如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可
(4)调用了一个声明抛异常的方法,就出是必须处理声明的异常
使用throws交给方法的调用者处理,或者使用try..catch自己处理异常
public static void readFile(String fileName) throws FileNotFoundFile,IOException{if(!filename.equals("c:\\\\a.txt")){throw new FileNotFoundException("传递的文件路径出错");if(!fileName.endsWith("文件的后缀名不对")){throw new IOException("文件的后缀名不对");
}
}
publc static void main(String[] args)throws FileNotFoundException,IOexception{readFile("d://a.txt");readfile("c://a.xt");
}
FileNotFoundFile是IOException的子类可以只写IOExption
捕获异常try...catch
捕获异常:java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方法的处理
try{
编写可能会出现异常的代码
}
catch(定义一个异常变量,用来接受try中抛出的异常对象){处理异常的代码
//打印日志/打印异常信息/继续抛出异常
}
一般在工作中,会把异常的信息记录到一个日志中
1、try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象
2、如果try中产生了异常,那么就会执行catch中异常处理逻辑,然后执行catch之后的代码
3、如果try中没有异常,那么就不会执行catch中异常的处理逻辑,执行catch之后的代码
public static void readFile(String fileName) throws FileNotFoundFile,IOException{if(!filename.equals("c:\\\\a.txt")){throw new FileNotFoundException("传递的文件路径出错");if(!fileName.endsWith("文件的后缀名不对")){throw new IOException("文件的后缀名不对");
}
}
publc static void main(String[] args){
try{readFile("d://a.txt");readfile("c://a.xt");}catch(IOException e){
Sout(e.toString);//java.io.IOExcption:文件的后缀名不对
Sout(e.getMessage());//文件的后缀名不对
e.printStackTrace();//最全面....}
sout("后续代码");}
Throwable类中定义了3个异常处理的方法:
String getMessage():返回次throwable的简短描述
String toString():返回此throwable的详细消息字符串
void printStackTrace():JVM打印异常对象,默认此方法,打印的异常信息是最全面的
异常注意事项:
多个异常捕获:
(1)多个异常分别处理
(2)多个异常一次捕获,多次处理
注意:
catch里面定义的异常变量,如果有子父类的关系,那么子类的异常变量必须写在上面,否则会报错
(3)多个异常一次捕获,一次处理
运行时异常可以被抛出可以不处理,即不捕获,也不声明抛出
默认交给虚拟机处理,终止程序
finally代码块:
无论是否出现异常都会执行
try{
编写可能会出现异常的代码
}
catch(定义一个异常变量,用来接受try中抛出的异常对象){处理异常的代码
//打印日志/打印异常信息/继续抛出异常
}
finally{}
注意:
1、finally不能单独使用,必须和try一起使用
2、finally一般用于资源释放(资源回收),无论程序是否出现异常,都要资源释放(IO)
3、如果finally有return语句,永远返回finally中的结果,避免该情况
子父类的异常:
注意:父类异常什么样,子类异常就什么样
【java笔记】异常处理相关推荐
- 6.4-全栈Java笔记:异常处理办法(下)
自定义异常 在程序中,可能会遇到任何标准异常类都没有充分的描述清楚的问题,这种情况下可以创建自己的异常类. 从Exception类或者它的子类派生一个子类即可 . 习惯上,定义的类应该包含2个构造器: ...
- 【连载】Java笔记——欲品香醇先度根叶
我是灼灼,一只初学Java的大一金渐层. 向往余秀华和狄兰·托马斯的疯狂,时常沉溺于将情感以诗相寄:追逐过王尔德.王小波的文字,后陷于毛姆和斯蒂芬·金不可自拔:热爱文学的浪潮,白日梦到底却总在现实里清 ...
- 【连载】Java笔记——是了解咖啡小可爱的第一周呢
我是灼灼,一只初学Java的大一金渐层. 向往余秀华和狄兰·托马斯的疯狂,时常沉溺于将情感以诗相寄:追逐过王尔德.王小波的文字,后陷于毛姆和斯蒂芬·金不可自拔:热爱文学的浪潮,白日梦到底却总在现实里清 ...
- 云计算学习笔记---异常处理---hadoop问题处理ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.lang.NullPoin
云计算学习笔记---异常处理---hadoop问题处理ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.lang.NullPoin ...
- 【java读书笔记】——java的异常处理
程序在实际环境的执行过程中.安全成为须要首先考虑的重要因素之中的一个.这也是用户和程序猿最关心的问题.同一时候,Java语言健壮性也体如今了可以及时有效地处理程序中的错误.准确的说是Java的异常处理 ...
- 【Java笔记+踩坑】SpringBoot——基础
导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 ...
- java笔记1/3 (B站hsp学java)
JAVA基础 文章目录 JAVA基础 变量 整形(INT) 浮点型(float/double) 字符型(char) 布尔类型(boolean) 基础数据类型的转换 自动类型转换 强制类型转换 重载 可 ...
- Java笔记(学习中。。)
Java笔记 eclipse的使用 常用的dos指令 预备知识 基本语法 变量 关于字符型 关于String 进制转换 运算符 流程控制 数组 数组的内存解析: 数组的Arrays工具类 面向对象 对 ...
- Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)
Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...
- 11.3-全栈Java笔记:线程的生命周期
一个线程对象在它的生命周期内,需要经历5个状态. 新生状态(New) 用new关键字建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态 ...
最新文章
- 基本数据结构篇(三万字总结)
- 代码 控制unity 暂停 编辑器_Unity3D 报错解决方案及常用功能收集
- 求根号m(巴比伦算法)
- 修改webpack配置,在react中使用less
- CentOS 6.2安装配置pacemaker
- eclipse中如何远程java debug配置
- matlab排序函数 下标,Matlab自带排序函数sort用法
- 脉冲触发器和边沿触发器的区别
- cnzz.php,CNZZ站长统计代码报错解决方法
- 密码应用安全性评估实施要点之三密钥管理要求与实现要点
- opencv边缘检测加提取(圆形和矩形)
- android wifi热点设置用户数,android 如何获取连接wifi热点的设备数量
- linux: It seems that scikit-learn has not been built correctly.
- MySQL顺序读写和随机读写磁盘_随机读写与顺序读写的深入理解
- 一个小游戏的代码(猜数字)
- JQ数据库查询时间转换
- ARM Cortex-M3内核结构
- (C语言详解)11-散列1 电话聊天狂人(小白实现详细解释)
- arm linux ip配置文件,手动修改ARM Linux的静态IP和用QT获取和修改IP
- 蓝汛之GPIO基本操作寄存器【篇】
热门文章
- Chapter 04-Using Conversion Functions and Conditional Expressions-Conditional Expressions
- Lansys PV 1.2 1CD(化工容器强度计算软件)
- 排序二叉树的插入、删除操作(递归方式)。
- SQLite 事务控制
- 短信猫软件的实现(C#)九7bitPDU的编码
- 判断操作系统多久没有任何操作.e
- UVA10880 Colin and Ryan【整除】
- UVA11554 Hapless Hedonism【数学计算+大数】
- CCF NOI1142 质数
- POJ NOI MATH-7656 李白的酒