第33节:Java面向对象中的异常
Java中的异常和错误
Java
中的异常机制,更好地提升程序的健壮性
throwable
为顶级,Error
和Exception
Error
:虚拟机错误,内存溢出,线程死锁
Exception
:RuntimeException
为空指针异常,数组下标越界异常,算数异常,类型转换异常等,IO异常(IOException
),SQL异常(SQLException
)。
异常处理,在Java
中异常处理机制为:抛出异常
和捕捉异常
异常的描述:
class ExceptionDemo{
public static void main(String[] args){
int[] arr = new int[3];
System.out.println(arr[0]);
// 结果 为 0
System.out.println(arr[3]);
// 结果 为 图1
}
}
System.out.println(arr[3]);
编译没问题,语法没有问题,编译完内存中没数组,运行的时候才在堆内存中开辟数组空间。arr[3]
没有这个下标,所以在运行时找不到结果。
图1,表示数组下标越界异常,System.out.println(arr[3]);
运行时发生了异常为ArrayIndexOutOfBoundException
,导致了程序无法运行,程序终结,不在执行。
错误的描述
class ExceptionDemo{
public static void main(String[] args){
int[] arr = new int[1024*1024*1024];
System.out.println(arr[0]);
// 结果 为 0
System.out.println(arr[3]);
// 结果 为 图1
}
}
图2,表示运行时发生的错误,堆内存溢出。
异常和错误的区别
对于异常是由解决方案的,Java中提供了对应的处理机制,而错误没有,是没有办法去针对性的解决,唯一方法就是错误出现,修改代码。
异常的过程
在异常情况,运行时发生的问题,是数组下标越界异常,在异常抛出的问题为名称,内容,发生的位置等,多种信息进行了封装到对象中。
ArrayIndexOutOfBoundsException
public class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException
构造方法
ArrayIndexOutOfBoundsException()
ArrayIndexOutOfBoundsException(int index)
ArrayIndexOutOfBoundsException(String s);
ArrayIndexOutOfBoundsException
可以new
对象,有构造方法,就可以new
对象。创建对象,如果遇到问题就抛出,new ArrayIndexOutOfBoundsException(index)
。
如何抛出呢?利用关键字throw
,出现异常,在Java
虚拟机,jvm
中需要把问题抛出,给调用者main
,主函数收到抛出的异常对象,但主函数没有办法处理,继续抛出调用者jvm
,jvm
收到异常问题后,将异常信息显示在屏幕上。
异常概述(意外、例外)
什么是异常呢?常见:
try-catch-finally
// try-catch-finally
public void method(){
try {
// 代码段
// 产生异常的代码段
}catch (异常类型 ex) {
// 对异常进行处理的代码段
}finally{
// 代码段
}
}
throw
throws
throws
声明时要进行抛出的异常
throw
要手动将产生的异常抛出
public void method() throws Exception1,Exception2,...,ExceptionN {
// 产生异常代码
}
// throw new IOException();
// 自己抛出的问题自己进行异常解决。
// 在抛出异常处,通过throws关键字标明异常类型
public void method() throws 异常类型{
// 代码 抛出
throw new 异常类型();
}
自定义异常
异常链
异常处理分类为:
- 抛出异常
- 捕捉异常
简单案例
public class Test{
public static void main(String[] args){
try{
String msg = redText(“C:\\a.txt”);
}catch(PathNotExistException e){
// 进行处理
}
}
}
Throwable异常的顶级父类
异常Exception
处理方式有两种,一为捕获
,二为继续抛出编译时的异常
。
RuntimeException
运行时异常,只有在运行的时候才会出现,可以处理,也可以不处理。
自定义异常,可以自己定义异常,自己定义一个类,如果这个类继承某个异常类,继承的是Exception
或其他异常,即定义了一个编译时异常
,如果继承的是运行时异常RuntimeException
或是它的子类,就定义了一个运行时异常
。
Throwable
类是Java
中所有错误或异常的超类,只有当对象是这个类的实例时,能通过虚拟机或是Java
中throw
语句抛出。
Exception分为两大类
- 非检查异常(
Unchecked Exception
):编译器不要求强制处理异常 - 检查异常(
Checked Exception
):编译器要求必须处理的异常,如IO
异常等
捕获异常
try
:执行可能产生异常的代码catch
:捕获异常finally
:无论是否发生异常代码总能执行
声明异常,抛出异常
throws
:声明可能要抛出的异常throw
:手动抛出异常
如果某方法出现了异常,却是没有能力的处理,可以在方法处用throws
来声明抛出异常,谁调用这个方法,谁就去处理这个异常。
public void method() throws Exception1,Exception2,...,ExceptionN {
// 异常的代码
}
Java中的异常处理情况
JAVA 异常
try...catch...finally
结构的使用方法
class Test{
public static void main(String args[]){
try{
int i = 1 / 0;
}
catch(Exception e){
e.printStackTrace();
}
finally{
System.out.println("finally");
}
System.out.println(5);
}
}
class Test{
public static void main(String args[]){
try{
Thread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
}
}
throw
和throws
的作用区别:
class Person{
private int age;
public void setAge(int age) throws Exception{
if(age<0){
RuntimeException e = new RuntimeException("年龄不能小于0");
throw e;
}
this.age = age;
}
}
class Test{
public static void main(String args[]){
Person person = new Person();
try{
person.setAge(-1);
}
catch(Exception e){
System.out.println(e);
}
}
}
Error和Exception的区别
Error
是Throwable
的子类,用于标记严重错误Exception
是Throwable
的子类,指示合理的程序想去catch
的条件,非严重错误
try/catch的执行过程
如果出现异常,系统则会抛出一个异常,
进行捕捉(catch
操作),或在最后(finally
)来进行处理。
throw和throws的区别
throws
出现在方法声明上,throw
出现在方法体内。
异常分类
异常分类:可查异常
,运行时异常
和错误
异常链
异常链为我们捕获一个异常后再抛出另一个异常
one
-> two
-> three
结语
- 下面我将继续对
Java
、Android
中的其他知识 深入讲解 ,有兴趣可以继续关注 - 小礼物走一走 or 点赞
第33节:Java面向对象中的异常的更多相关文章
- 第35节:Java面向对象中的多线程
Java面向对象中的多线程 多线程 在Java面向对象中的多线程中,要理解多线程的知识点,首先要掌握什么是进程,什么是线程?为什么有多线程呢?多线程存在的意义有什么什么呢?线程的创建方式又有哪些?以及 ...
- Java thread中对异常的处理策略
转载:http://shmilyaw-hotmail-com.iteye.com/blog/1881302 前言 想讨论这个话题有一段时间了.记得几年前的时候去面试,有人就问过我一个类似的问题.就是j ...
- JAVA 线程中的异常捕获
在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...
- 第2课第5节_Java面向对象编程_异常_P【学习笔记】
摘要:韦东山android视频学习笔记 java的异常处理的原则如下: 1.我们先写一个没有对异常处理的程序,在进行除法运算的时候,除数是非零的话,运行时没有问题的,但是除数为零的时候,运行就会有问 ...
- java面向对象中四种权限(private,protected,public,友好型)详解
转自http://blog.csdn.net/a1237871112/article/details/50926975 及http://blog.csdn.net/blackmanren/articl ...
- JAVA 面向对象中的多态
多态是继封装.继承之后,面向对象的第三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一个 ...
- Java面向对象中this关键字详解 意义+实例讲解【hot】
this关键字 >>>便于理解简单的定义 this关键字可以简单的理解为,谁调用this所在的方法,this就是谁. 类的构造函数与getter.setter方法常用到this关键字 ...
- java面向对象中的关键字
1,super关键字 super:父类的意思 1. super.属性名 (调用父类的属性) 2. super.方法名 (调用父类的方法) 3. super([参数列表])(调用父类的构造方法) 注意: ...
- java面向对象中的String类中12种常用的方法
1.字符串与字符数组的转换 字符串可以使用toCharArray()方法变成一个字符数组,也可以使用String类的构造方法把一个字符数组变成一个字符串. public class StringAPI ...
随机推荐
- Windows Server 2012 正式版/标准版/数据中心版安装序列号密钥
Windows Server 2012(开发代号:Windows Server 8)是微软发布的一款服务器操作系统,也是Windows 8对应的服务器版本,属于是Windows Server 2008 ...
- Linux初次修改环境变量
对于刚刚从windows系统跳到Linux的小白们,相信多少都会出现一些强迫症,希望能将Linux的Terminal能调出点色彩,让其好看些.之前自己也不知道怎么按着百度的教程操作完成的,直到组里新来 ...
- hashmap源码研究
概述 在官方文档中是这样描述HashMap的: Hash table based implementation of the Map interface. This implementation pr ...
- 关于python的感想和turtle作图
第一次知道有python这个东西是在去年七月份,就是一堆编程语言,当时我想它应该离我很远,也没对它有什么兴趣.直到在三月份的某一天我真正接触了它,其实也不是我主动,环境下学期必须学这东西.我有它的必修 ...
- java 多线程中的wait方法的详解
java多线程中的实现方式存在两种: 方式一:使用继承方式 例如: PersonTest extends Thread{ String name; public PersonTest(String n ...
- Java实现多线程生产者消费者模型及优化方案
生产者-消费者模型是进程间通信的重要内容之一.其原理十分简单,但自己用语言实现往往会出现很多的问题,下面我们用一系列代码来展现在编码中容易出现的问题以及最优解决方案. /* 单生产者.单消费者生产烤鸭 ...
- PEM证书加密方法(python)
1. 常见网络登录现在都使用了rsa加密,一般而言客户会提供模(mo)和指数(e). 2. 通过模和指数获取到证书PEM(方法见:https://www.cnblogs.com/luo30zhao/p ...
- 移动端布局:视口viewport的理解
移动端开发中,有一些基本概念需要理解清楚,才能更好的组织编程逻辑.在刚接触时,移动端视口的缩放和rem单位的缩放搞混淆了,弄得自己很蒙圈.所以仔细总结下自己的理解. 移动端的适配,我理解为两点: 第一 ...
- ie9 css文件大小限制
使用webpack生成CSS对于一些有趣的定义很有趣.不幸的是,当你拥有一个大型应用程序并且需要IE9支持时,乐趣就会停止,因为IE9会忽略你生成的CSS包中的大于4000个选择器的部分.解决方案是将 ...
- python xss相关的编码解码小脚本
1.功能分析: 实际工作中经常会遇到alert()之类的函数被防火墙过滤,而把alert()转化为ascii码放到String.fromCharCode()中就可以绕过,之前会一个一个查ascii表, ...