概要图

异常讲解流程图

一 java 异常和错误层次图

1.1 图1

1.2 图2

二 异常生的过程

1 异常可以结束函数.

  同时也让程序结束了.

三 异常和错误的发生和区别

Java运行时期发生的问题就是异常。

Java中运行时发生的除了异常Exception还有错误Error。

异常:通常发生可以有针对性的处理方式的。如:定义一个数组arr[3],但是你要访问第4个值 .就会发生数组index越界
错误:通常发生后不会有针对性的处理方式如:定义一个数组arr[1024*1024*1024] 发生内存不足
Error的发生往往都是系统级别的问题,都是jvm所在系统发生的并反馈给jvm的。
无法针对处理,只能修正代码。

3.1 异常

如:定义一个数组arr[3],但是你要访问第4个值 .就会发生数组index越界

3.2 错误

如:定义一个数组arr[1024*1024*1024] 发生内存不足

四 异常的的简单应用

异常的应用:

在编写程序时,必须要考虑程序的问题情况。
举例:卖水果功能需要传递钱参数,有可能有假币。
所以定义定义程序需要考虑程序的健壮性。

加入一些逻辑性的判断。

4.1 自己抛异常

class Demo
{
/*
对给定的数组通过给定的角标获取元素。
*/
int getElement(int[] arr,int index)
{
/*
jvm出了问题,自己打包对象并抛出。
但是它所提供的信息不够给力。想要更清晰,需要自己写。
它的抛出不满足我们的要求。准备自己抛
*/
// 自己写的
if(arr==null)
{
throw new NullPointerException("arr指向的数组不存在");
} if(index< || index>=arr.length)
{
// 2
//该条件如果满足,功能已经无法继续运算。这时 就必须结束功能,并将问题告知给调用者。这时就需要通过异常来解决。
//怎么用呢?
//1,创建一个异常对象。封装一些提示信息(自定义)。
//2,需要将这个对象告知给调用者。怎么告知呢?怎么将这个对象传递到调用者处呢?通过关键字throw就可以完成。 throw 异常对象;
//3,throw用在函数内,抛出异常对象,并可以结束函数。
throw new ArrayIndexOutOfBoundsException("错误的角标,"+index+"索引在数组中不存在");
} int element = arr[index];
return element;
}
}
测试
class ExceptionDemo3
{
public static void main(String[] args)
{
Demo d = new Demo();
int[] arr = {,,};
int num = d.getElement(null,); //arr指向的数组不存在
System.out.println("num="+num); System.out.println("over"); } }

4.2 小练习

 4.2.1 问题

public class Test {

    public static void main(String[] args) {
Person p = new Person("qq",-); } }
class Person
{
private String name;
private int age;
Person(String name,int age)
{
//加入逻辑判断。
if(age< || age>)
{ System.out.println("年龄数值错误");
return;//终止初始化。 }
this.name = name;
this.age = age;
}
//定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。
public String toString()
{
return "Person[name="+name+",age="+age+"]";
}
}
结果

这样做虽然可以编译并运行看到提示消息,但是问题却没有发生,程序还在继续执行。并打印p对象。
这是不合理的。

4.2.2改进用异常处理

package test;

public class Test {

    public static void main(String[] args) {
Person p = new Person("qq", -); } } class Person {
private String name;
private int age; Person(String name, int age) {
// 加入逻辑判断。
if (age < || age > ) { throw new IllegalArgumentException(age + ",年龄数值非法"); // 这里发生了变化
}
this.name = name;
this.age = age;
} // 定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。
public String toString() {
return "Person[name=" + name + ",age=" + age + "]";
}
}

结果

五 异常的自定义和体系

5.1 自定义异常思考

能不能定义一个符合我的程序要求的问题名称。

异常的信息都可以自定义,那么异常的名字是否可以定义呢?是否可以定义成更符合自己程序的阅读呢?

之前的几个异常都是java通过类进行的描述。并将问题封装成对象,这是符合面向对象思想。
其实:异常就是将问题封装成了对象。

所以我也准备对自己所需要的问题进行类的描述。

5.2 自己定义并抛出

package test;

public class Test {

    public static void main(String[] args) {
Person p = new Person("qq", -); } }
class NoAgeException{
NoAgeException(){}
NoAgeException(String message){}
} class Person {
private String name;
private int age; Person(String name, int age) {
// 加入逻辑判断。
if (age < || age > ) { throw new NoAgeException(age + ",年龄数值非法");
}
this.name = name;
this.age = age;
} // 定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。
public String toString() {
return "Person[name=" + name + ",age=" + age + "]";
}
}
结果
 

5.3 自定义异常加上父类Throwable

class NoAgeException extends Throwable{
NoAgeException(){}
NoAgeException(String message){}
}
结果

5.4  自定义异常加上父类RunTimeException

加上super(message)得到结果

最新文章

  1. SSH框架使用中存在的诡异异常
  2. Linux系统真正的优势以及学习方法
  3. C# 条形码 生成函数 (Code 128 标准
  4. 由C到C++的学习 ----Essential C++
  5. 在InteliJ IDEA中写Dart及配置IDEA - Dart Plugin
  6. multiSelect 下拉多选插件
  7. Travel 并查集
  8. js实现复制文本内容到剪切板
  9. [nodemon] clean exit - waiting for changes before restart
  10. 数组-在Shell脚本中的基本使用介绍
  11. JavaSE学习总结(十六)—— 泛型与泛型应用
  12. C语言 提取double的每一位
  13. WebRTC开发基础(WebRTC入门系列3:RTCDataChannel)
  14. 数据仓库四个特点(面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant))
  15. 【SQL】SQL 中Select语句完整的执行顺序
  16. Javascript动态操作CSS总结
  17. linux 简单搭建git服务器
  18. 高级IO
  19. history统计命令最多的20条
  20. LightOJ - 1205:Palindromic Numbers (数位DP&amp;回文串)

热门文章

  1. JS的高阶函数
  2. js页面的弹框怎么关闭啊
  3. 国内平台比特币(Bitcoin)搬砖流程教学
  4. 自动安装php7(配置未优化版本)
  5. PAT甲级——A1092 To Buy or Not to Buy【20】
  6. vue表格之:formatter=fun
  7. 使用ResponseEntity进行返回json数据
  8. [转]WPF--模板选择
  9. HZOI20190828模拟32题解
  10. LUOGU P3157 [CQOI2011]动态逆序对(CDQ 分治)