JAVA异常【笔记】

【回顾】
1.   对象由状态(属性)和行为(方法)组成
2.  类是具有相同属性和行为的一组对象的集合
3.  类的变量和方法可被该类的实例访问
4.  圆点符号用于访问对象的成员
5.  构造函数在创建对象时初始化对象
6. 封装、继承和多态是面向对象的主要特征
7. 继承可提高代码的重用性,使用extends关键字来实现。除了构造方法之外
    父类的所有方法和属性都被子类的对象继承
8.多态性是不同的实例对象以不同的方式对相同的信息作出不同的表现
9.四种访问修饰符:public,protected,默认,private
10.Java 常用修饰符有 static、final、abstract
11.接口是Java编程一项重要的技术,同过它可以实现多态,同时它也弥补了Java单一       继承的不足
12.Object类是所有的类的父类
13.内部类隶属于外部类,可以使用private、默认、protected、public和static来修饰       内部类(详情(6条消息) public/private/protected的具体区别_莫等闲的博客-CSDN博客
14.内部类分为:成员内部类、局部内部类、匿名内部类和静态内部类。
成员内部类可以访问外部类的属性和方法。
-------------------------------------------------------------------------------------------------------------------
先来了解几个英语单词:
Exception 异常、例外、异议
RuntimeException 运行时异常
ArithmeticException 算法异常
ArrayIndexOutOfBoundsException 数组下标越界异常
NumberFormatException 数字格式异常
NullPointerException 空指针异常
IOException 输入输出异常
try 尝试
catch 抓,捕获
finalize 定案(把最后定下来)
finally 最后的
error 错误
interrupt 中断
negative 否定、负数
nested 嵌套的
throw 抛、掷
User-defined 用户自定义的
----------------------------------------------------------------------------------------------------------------

         1.错误的分类

编译错误运行错误其他错误

也称为语法错误,是

由于编写的程序存在

语法问题,未能通过

源代码到字节码的编

译产生的;

运行错误是在程序运

行过程中产生的错误

根据性质不同,运行

错误还可以分为语义

错误和逻辑错误;

其他逻辑错误是指

程序不能实现编程

人员的设计意图和

设计功能需求而产

生的错误

每个高级语言都有自

己的语言规范,编译

系统根据这个规范来
检查编程人员所书写
的源代码是否符合规

定;

一个没有编译错误的

可执行代码,还有可

能在运行时报错;

例如人员的年龄不能

为负值、排序时不能

正确处理数组头尾的

元素,图形界面的事

件处理不正确等

例如:

string a=new string(“abc”);
int b[] =[1,2,3]
System.out.printin(a);

语义错误:

1)

程序在语法上正确,

在语义上存在错误。

入数学错误(除数

为0)、输入数据

格式错误、数组下

标越界等等。语义错

误不能被编译系统检

测出来

2)

JAVA解释器在运行时

能够发现语义错误,一

旦发现语义错误,JAVA

将停止程序的运行,并

给出错误位置和性质

3)

有些语义错能被程序事先

处理,如除数为0,下标

越界等

原因:不符合软件需求

要求、算法考虑不周,

或编码过程中的疏忽

逻辑错误:

1)一般逻辑错误是指程序

在执行过程中引发了操作系

统的问题

2)现象:出现死循环,死机

3)一般逻辑通常比较隐蔽,

排除时应根据错误的现象,结

合源程序仔细判断

4)for (int i=5;i>0;) {  }  //死循环

while (true) //永循环,需要根据

条件有break

5)死循环:应该检测程序的

循环语句和终止条件

6)出现死机:应该检测程序中

的内存分配处理语句

---------------------------------------------------------------------------------------------------------------------------------

 2.理解异常和异常处理的概念

 在程序运行时发生的错位称为异常

在运行时捕获这些异常,并加以处理,称之为"异常处理"

实例:

 

(1)异常类概念和异常处理机制含义

JAVA类库里预先定义了异常类,每个异常类都代表一种运行错误

类中包含了该运行错误的方法等内容

异常处理机制含义

程序运行时,一旦系统检测到了不可能执行的操作,会抛出一个异常对象,系统中久一定要有相应的机制去处理它,确保不会产生无法释放资源或内存资源的耗费,这个机制就是异常处理机制 

 

 

ThreadDeath 线程终止

VirtualMachineError 虚拟机错误

OutOfMemoryError 内存不足错误

StackOverflowError 堆栈溢出错误

EOFException 文件异常结束

FileNotFoundExcetion 文件未找到异常

IllegalArgumentException 非法参数异常

 JAVA异常类

异 常

说 明

Exception

异常层次结构的根类

RuntimeException

许多 java.lang 异常的基类

ArithmeticException

算术错误情形,如以零作除数

ArrayIndexOutOfBoundsException

索引小于或大于实际的数组大小

NullPointerException

尝试访问  null 对象成员

ClassNotFoundException

不能加载所需的类

NumberFormatException

数字转化格式异常

IOException

I/O 异常的根类

FileNotFoundException

找不到文件

异常类的层次结构2-1

Throwable 具有两个子类,它们是

Exception是所有异常类的,分为派生自RuntimeException类的异常非派生自RuntimeException类的异常。这时,可以写代码来处理异常并继续程序执行,而不是让程序中断 

Error: 被认为是不能恢复的严重错误,如系统内部错误和资源耗尽错误等。不应该捕获处理这种类型的错误,而是让程序中断

 构造器的定义:

Public Exception();
Public Exception(String s); // 带有异常的描述信息的构造器;

 主要的三个重要方法:

Public String toString(); //返回描述当前异常信息的字符串。
Public Stirng getMessage() //显示异常错误名称信息
Public void printStackTrace() //无返回值,完成一个打印操作,输出异常对象的堆栈调用顺序。

因为继承关系的特性,任何异常子类对象都会继承上述三个方法。

 如果一个异常抛出并没有处理,其实系统会隐式自动地来调用其中的toString()printStackTrace()目的是让程序使用者知道发生的错误信息和位置。(对照handled那个例子)并立即中止程序运行,异常位置后面的代码就不再执行了。  

-------------------------------------------------------------------------------------------------------------------------------- 

3、运用 try、catch 和 finally 块处理异常(重点)

Java异常处理机制的代码块

try和catch块

 

//try和catch块
class ThrowsDemo {
   public void calculate(int operand1, int operand2)  {
	//try{
	    int result = operand1 / operand2; 
               System.out.println(result);
	//}catch(ArithmeticException ex){
	//    ex.printStackTrace(); 	           
	//}
    }
}

 相关try和catch处理的异常例子

 针对上次课所见到的 算术错误 以零作除数 ArithmeticException 索引小于或大于实际的数组大小ArrayIndexOutOfBoundsException 数字转化格式异常NumberFormatException的捕获处理例子。

 finally块

无论是否发生异常, finally 块里的代码一定会执行,一般用于释放不需要使用的内存空间。

异常处理块的一般结构

try{
	// 要监控错误的代码块
    methodGeneratingException();
}catch (Exception e) {
	// Exception e 的异常处理程序
}finally{
	// 在 try 结束前要执行的代码块
   cleanup();
}

---------------------------------------------------------------------------------------------------------------------------------

4、运用多重 catch 块处理异常(重点)
多重catch块

段代码可能会生成多个异常。当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个类型与异常类型匹配的catch语句块

找到匹配的catch块,执行其中的处理语句后,其他的 catch 语句块将被忽略

try{
  …….
} catch(ArrayIndexOutOfBoundsException e) {
  ……
} catch(NumberFormatException e) {
  ……
} catch(ArithmeticException e) {
  ……
}
一段代码可能会生成多个异常。 当有些可能出现的异常可能不能都考虑到, 就可能出现 漏捕获的情况方法
为了避免这种情况, 把最后一个捕获块类型设置为父类型 Exception 这样 根据异常子类对象具有多态性,可以有效防止漏捕获
try{
  …….
} catch(ArrayIndexOutOfBoundsException e) {
  ……
} catch(NumberFormatException e) {
  ……
} 

catch(Exception e) {
  ……
}

 使用多重 catch 语句时,异常子类一定要位于异常父类之前

---------------------------------------------------------------------------------------------------------------------------------

 5、用户自定义异常

 1)概念:使用自定义异常的时候,JavaAPI提供的内置异常不一定总能捕获程序中发生的所有错误。有时会需要创建用户自定义异常,特别是一些逻辑错误

自定义异常类必须是Exception类的子类或Exception子类的子类

 2)创建用户自定义异常类---必须继承Exception或其子类

class MyException extends Exception {
     /** 构造方法。 */
     MyException()  {
         super("您传递的数组大小非法");
    }
}

3)检验异常和非检验异常

检验异常是指程序代码中必须要捕获的异常,否则无法通过编译。

检验异常可以不捕获程序仍可以通过编译的异常

前者:RuntimeException及其子类都属于非检验异常JVM可以自动捕获,即每个方法的参数后面默认有throws RuntimeException(不用写出来,隐式机制)

后者:其它非继承RuntimeException的异常一般均为检验异常

(例如文件输入输出操作相关的IOException,和用户自定义异常类)

 --------------------------------------------------------------------------------------------------------------------------------

 6、运用关键字 throw 和 throws 处理异常(难点)

  -------------------------------------------------------------------------------------------------------------------------------

 总结:

异常是程序运行时发生的错误
Java 中可使用 try catch throw throws finally 来管理 Java 异常处理。
要监控的程序语句包含在 try 块内, catch 块中的代码用于捕获和处理异常。在方法返回之前绝对必须执行的代码应放置在 finally 块中
要手动引发异常使用关键字 throw 。任何被抛到方法外部的异常都必须用 throws 子句指定,非检验异常不用,因为隐式机制。
多重 catch 块的子类异常 catch 块必须放在父类异常 catch 块的前面,防止漏捕获情况发生。

        用户自定义异常必须继承ExceptionException的子类

检验异常 是指程序代码中必须要捕获的异常,否则无法通过编译。 非检验异常 是可以不捕获
程序仍可以通过编译的异常,一般指运行时异常 RuntimeException

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值