异常---编译时异常和运行时异常:IO异常、NullPointerException、ArrayIndexOutBoundsException、ClassCastExoeption
一、概述
1、定义:
程序运行过程中的发生了不正常的情况
2、异常处理机制和作用----JVM虚拟机打印的
java语言时很完善的语言,提供了异常处理方式,出现异常,将异常信息打印到输出控制台,供程序员参考。
作用:增强程序的健壮性
3、异常的存在形式----类----java.lang中
每一个异常类都可以创建一个对象出来。
4、异常的继承结构
(1)Throwable的两个子类:
<1>Error---错误,都是不可处理的,直接退出JVM
<2>Exception---异常,可以处理
所有的异常都是发生在运行阶段,因为只有运行阶段才可以new对象
两个子类:
- Exception的直接子类:编译时异常,要求程序员在编写程序时必须预先对这些异常进行处理
- RuntimeException:运行时异常,编写程序阶段程序员可以预先处理,也可以不管(空指针异常那些)
(2)老杜总结图
- 整体结构
- 编译时异常----预先处理的异常
- 运行时异常----控制台报错
5、编译时异常和运行时异常区别
编译时异常一般发生的概率比较高----运行之前预处理(受检异常,受控异常)
运行时异常一般发生的概率比较低-----没必要在运行之前预处理(未受检异常,非受控异常)
二、编译时异常
1、编写程序时程序画红线的的错
---必须处理,处理后才能正常执行,不然就程序中止了
2、两种处理方式
(1)throws上抛--交给上一级调用者处理(异常上抛)
(2)try...catch -----异常捕捉,自己处理(真正的处理)
3、处理方式选择标准
看这个错误是否需要上报,需要选择throws,其他都用catch
【注】
- 若异常每一级都选择异常上抛,都没有解决,最终抛给了JVM,只能中止java程序的执行
- 异常处理机制的作用---增强程序的健壮性,希望异常发生了也不影响程序的执行,因为异常捕捉了之后不会影响后续程序的运行
故一般main方法建议使用try...catch处理
- throws后面和catch()内的抛出的异常类,可以写具体对应的异常类,也可以写其父类
4、编译时异常处理的目的
让程序编译通过,通过后,再根据运行时提示信息去调程序,而不是异常不处理,JVM运行时直接中止,控制台报错
即:主要目的是让程序顺利运行,控制台打印出异常而不是不报错中止,
虽然有异常,但是通过异常处理方式给出来,只是待进一步进行问题的解决
(一)try catch语句
1、基本形式
try{程序正常要执行的语句
}catch (具体异常类 e){处理语句
}finally{有无异常都必执行的语句,一般放资源释放语句
}
- 一般根据异常提示,编写软件自动生成
- 这种方式下,try语句块中,某一行有异常,该行后面内容不会执行,
catch捕捉到异常后才会执行catch内及后续的代码
2、基本规则
(1)main方法中一定用try catch语句
(2)catch可以写多个,也可以不写
每个catch可以对应一个具体类,精确的一个一个处理,有利于程序的调试
catch写多个时,异常类从上到下必须遵循从小到大(异常具体类在上---异常父类在下)
(3)finally相关
- finally中的语句最后一定会执行的,即使try语句块中代码出现了异常
- finally必须和try catch一起出现,不能单独编写
- finally语句必须与try 语句连用,没有catch也可以
- finally相当于try语句跳过异常的 延续代码部分
- fianlly中使用return或throws语句会让try 和catch中return或throws语句失效
(4)return语句
- return语句执行----代表方法的结束
return语句一定最后执行的,无论是return;还是return i
- finally中有return try中return失效,因为finally语句块一定会执行的
3、异常的追踪和调错--catch中
(1)两个重要的方法
e.getMessage()---获取异常的简单描述信息
只是获得简单描述,对调错没有指导性作用
e.printStackTrace()----打印异常追踪的堆栈中信息(开发中用比较多)
e是异常对象
(2)e.printStackTrace()--打印堆栈中错误信息
异常处理时,catch语句中必须加e.printStackTrace()
这样控制台才能在正常运行程序的情况下,还能打印出异常信息,否则,异常抛出或捕捉后,没有异常提示信息,会以为没有异常
(3)查看异常追踪信息,快速调试程序:
- 从上往下看,一行一行看(下面的异常是由上面的异常导致的,所以从上往下看)
- SUN写的代码不用看,主要问题出现在自己编写的代码上(由包名可以看出是SUN的还是自己的代码)
(二)throws上抛
在方法声明的位置上,加上throws关键字,抛给上一级调用者(异常上抛)
上一级调用者同样也有这两种处理方式---throws和catch
【注】这种方式有异常情况下,该方法下的后续代码不会执行,通过 [方法名 throws 异常类名] 直接跳到上级调用方法
(三)throw 手动抛异常----自定义异常
1、自定义异常类
(1)编写一个类继承Exception或RuntimeException
(2)提供两个构造方法,一个无参数的,一个带有String参数的
有参的构造方法用来传递提示信息----e.getMessage
//1、自定义异常类
public class MyException extends Exception{//无参构造public MyException (); //有参构造public MyException (String s);
}//2、使用异常类
public class Test{puiblic static void main(String[] args){//创建自定义异常对象MyException e=new MyException ("密码错误!");//打印堆栈信息e.printStackTrace();//获取并输出异常的描述信息String msg=e.getMessage();System.out.println(msg);}
}
这样控制台不仅会输出自定义异常的堆栈信息,还会输出 描述信息
2、自定义异常的作用
通过使用自定义异常类,来中止不满足条件的情况,不是用return终止的方式
一般方式:不满足条件,return; 终止方法
调用异常方式: throw new MyException ("密码错误!"),不满足条件,抛异常并终止
(三)常见编译时异常
io异常
FileNotFoundException
ClassNotFoundException
SQLException
NoSuchFieldException
NoSuchMethodException
ParseException
三、运行时异常
1、数组下标越界异常---ArrayIndexOutBoundsException
2、空指针异常---NullPointerException
避免空指针异常的两个经验:
(1)判断一个对象是否为null最好放在条件的最前面
(2)判断一个对象是否等于null,最好用【null==对象名】 或 【”某值“.equals(对象)】
因为 对象==null,容易误写成 对象=null,就成赋值----空指针异常
对象.equals(”某值“)----如果对象的值一旦是空----空指针异常
3、类转换异常---Java.lang.ClassCastExoeption
(1)出现条件:
强制类型转换出错----两个对象没有继承关系
(2)避免方法----instanceof运算符
4、数字格式化异常---NumberFormatException
异常---编译时异常和运行时异常:IO异常、NullPointerException、ArrayIndexOutBoundsException、ClassCastExoeption相关推荐
- C++编译时多态和运行时多态
C++编译时多态和运行时多态 作者:melonstreet 出处:https://www.cnblogs.com/QG-whz/p/5132745.html 本文版权归作者和博客园共有,欢迎转载,但未 ...
- java 运行 对象_java实例对象的编译时类型和运行时类型
为什么要区分编译时类型和运行时类型? 看这样一句代码:Person p=new Women()(Women类继承自Person类)那么,假如p的属性修饰符为public 访问属性时得到的是Person ...
- 编译时类型和运行时类型到底是什么?
最近在看多态,里面有一句话困扰了我很久,就是 编译时类型和运行时类型 ps:多态定义:把子类对象直接赋给父类的引用时,当运行时调用该引用类型的方法时,其方法行为总是表现出子类的行为特征,而不是父类的行 ...
- java面向对象三大特性之多态---编译时多态和运行时多态详解
一.引言 1.什么是多态? 说到重载和重写,大家可能都知道.它们都是多态性的体现,那么说什么是多态呢?多态是指允许不同子类型的对象对同一行为作出不同的响应.例如在生活中,比如跑的动作,小猫.小狗和大象 ...
- java编译时多态和运行时多态_运行时多态、编译时多态和重载、重写的关系(不区分Java和C#,保证能看懂!)...
以前在大学学习OOP的时候,知道了重载和重写的区别,但如果要把他们和多态联系起来,我想很多新手朋友和我当初一样是死记的,可是时间长了,自然而然就忘记了,最近在写测试的时候,终于"开窍&quo ...
- 编译时多态和运行时多态
在JAVA中有两种多态是指:运行时多态和编译时多态. 关于类的多态性简介如下: 多态(polymorphism)意为一个名字可具有多种语义.在程序设计语言中,多态性是指"一种定义,多种实现& ...
- 编译时类型 和运行时类型的 区别(1)
class T{ void f(int x){ System.out.println("int in T:" +x); } void f(double x){ System.out ...
- C# WPF 项目中无法使用Console输出时出现句柄无效的IO异常解决方法
如以下代码,重点看:ConsoleManager.Show()的位置注释即可: using System; using System.Collections.Generic; using System ...
- Angular Component 开发时属性和运行时属性的对照
看个具体的例子: @Component({selector: 'cx-carousel',template: `<ng-container *ngFor="let item$ of i ...
最新文章
- (传送门)linux命令总结dd命令详解
- JavaWeb:JSP
- IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的...
- 软件工程之快速原型模型
- 一键截图_教你一键为iPhone截图加上手机外壳,新技能快学起来!
- 常见的 Error 和 Exception
- 农业部部署农业大数据发展工作 评:对农业现代化很重要
- Python url编码、url解码
- Spring 实践 -拾遗
- [论文阅读][经典ICP] A Method For Registration Of 3D Shapes
- 吴恩达|机器学习作业2.0Logistic 回归
- sr锁存器 数电_数字电路第5章(1SR锁存器)_2.ppt
- bind 绑定标签的用法
- http://blog.csdn.net/evankaka/article/details/45155047
- MEGA-X 3D打印机教程:01_我的第一台3D打印机参数
- 七号信令系统在GSM中的应用
- java 建立临时文件夹
- ENVI:标准库中光谱(.sli)重采样
- 对二维数组的数组名取地址,a,a+1的理解
- 3G无线网卡速度的小测试
热门文章
- 调用百度汇率api 获取各国的汇率值
- 2021-07-27 百度飞桨AI达人创造营手账
- 什么叫手机或设备的ID
- powerpoint预览_如何添加,删除和重新排列PowerPoint幻灯片
- 合成分红游戏源码_旅行世界遛狗养狗恐龙源码,分红龙源码、红包龙、合成龙...
- 鸿蒙系统功能,华为HarmonyOS2.0系统功能都有哪些呢-华为鸿蒙系统HarmonyOS2.0功能介绍[图文]_咖绿茵手游站...
- vue解决打开新窗口被拦截的的实战方法
- 人人的互联网时代——读娱乐致死和未来是湿的
- 微生物群也有记忆 | 微生物群能被“训练”
- U盘无法在磁盘管理器中删除,显示不支持该操作的时候可以用以下的办法,亲测可以解决