异常概述

异常: 是在运行时期发生的不正常情况.

在 java 中用类的形式对不正常情况进行了描述和封装.

描述不正常情况的类, 就称为异常类.

异常体系

父类: Throwable (JDK 文档)

子类: 1. 一般不可处理: Error

2. 可以处理: Exception

该体系的特点:

  1. 在用 Throwable 及其所有子类都具有可抛性.可抛性通过 throws 和 throw

    两个关键字体现, 凡是可以被这两个关键字所操作的类和对象都具备可抛性.
  2. 子类的后缀都是用其父类名作为后缀, 例如 xxxException, xxError.
  3. Error 使用 JVM 抛出的, 属于严重性问题,这种问题的发生一般不针对性处理, 直接修改程序.

自定义异常

如果让一个类成为异常类, 必须要继承异常体系, 因为只有成为异常体系的子类才有资格具备可抛性,

才可以被两个关键字所操作: throws, throw

// 数组负数角标异常
class FuShuIndexException extends Exception
{
// 空参数构造函数
FuShuIndexException()
{} // 带参数的构造函数
FuShuIndexException(String msg)
{
super(msg); // 直接调用父类处理 msg 的方法
}
} class Demo
{
pulic int method(int[] arr, int index) throws FuShuIndexException
{
if(arr==null)
throw new NullPointerException("数组的引用不能为空!"); if(index<0)
throw new FuShuIndexException("角标变成负数啦!"); return arr[index];
}
} class ExceptionDemo
{
public static void main(String[] args) throws FuShuIndexException
{
int[] arr = new int[3]; Demo d = new Demo();
int num = d.method(arr,-30);
System.out.println("num=" + num);
}
}
Exception 下的异常分为两种:
  1. 编译时被检测异常

    • 除了特殊子类 RuntimeException, 其他都是.
    • 特点: 这种问题一旦出现, 是希望在编译时就进行检测, 让这种问题有对应的处理方式.
  2. 编译时不检测异常(运行时异常)
    • Exception 中的 RuntimeException 和其子类
    • 这种问题的发生, 无法让功能继续, 更多是因为调用者的原因导致的或者引发了内部状态的改变导致的.

      那么这种问题一般不处理, 直接编译通过, 在运行时, 让调用者调用时的程序强制停止, 让调用者对

      代码进行修正.
throw 和 throws 的区别
  1. throws 使用在函数上, throw 使用在函数内
  2. throws 抛出的是异常类, 可以抛出多个, 用逗号隔开

    throw 抛出的是异常对象.

异常的捕捉

具体格式:

try
{
// 需要被检测已成的代码
}
catch(异常类 变量) // 该变量用于接收发生的异常对象
{
// 处理异常的代码
}
finally // 通常用于关闭(释放)资源
{
// 一定会被执行的代码
}

异常处理的原则

  1. 函数内部如果抛出需要检测的异常, 那么函数上必须要声明.

    否则必须在函数内用 trycatch 捕捉, 否则编译失败.
  2. 如果调用到了声明异常的函数, 要么 trycatch 要么 throws, 否则编译失败.
  3. 函数内部可以解决的异常, 用 catch

    解决不了的异常, 用 throws 告诉调用者, 由调用者解决
  4. 一个功能如果抛出了多个异常, 那么调用时, 必须要对应多个 catch 进行针对性处理.

    内部有几个需要检测的异常, 就抛出几个异常, 抛出几个, 就 catch 几个.

    多 catch 异常, 父类的 Exception 放在 catch 的最下面.
//  示例1:写出程序结果
class Exc0 extends Exception{}
class Exc1 extends Exc0{} class Demo
{
public static void main(String[] args)
{
try
{
throw new Exc1();
}
catch(Exception e)
{
System.out.println("Exception"); // 编译失败. 多 catch 时, 父类的 catch 放在最下面
}
catch(Exc0 e)
{
System.out.println("Exc0");
}
}
} // 示例2: 写出程序结果
class Test
{
public static String output="";
public static void foo(int i)
{
try
{
if(i==1)
throw new Exception();
output += "1";
}
catch(Exception e)
{
output += "2";
return;
}
finally
{
output += "3";
}
output += "4";
}
public static void main(String[] args)
{
foo(0);
System.out.println(output); // 134 , 注意是字符串
foo(1);
System.out.println(output); // 13423, output 是静态全局变量
}
}

异常转换(具体看视频)

异常注意事项

  1. 子类在覆盖父类方法时, 父类的方法如果抛出了异常,

    那么子类的方法只能抛出父类的异常或者该异常的子类或者不抛出异常.
  2. 如果父类抛出多个异常, 那么子类只能抛出父类异常的子集.
  3. 如果父类的方法没有抛出异常, 那么子类覆盖时绝对不能抛出异常, 只能 try.
// A 异常
class A extends Exception
{ } class B extends A
{ } class C extends Exception
{ } class Fu
{
void show throws A
{}
} class Zi extends Fu
{
// 子类覆盖父类 show()方法, 并抛出 C 异常
void show() throws C
} class Test
{
void method(Fu f) // Fu f = new Zi(); 此时, 子类中有 C 异常,
// 而 C 异常既没有在函数上声明, 也没有捕捉.
{
try
{
f.show();
}
catch(A a)
{ }
}
}
示例1: 写出程序结果
class Demo
{
public static void main(String[] args)
{
try
{
showExe();
System.out.println("A");
}
catch(Exception e)
{
System.out.println("B");
}
finally
{
System.out.println("C");
}
System.out.println("D"); // 异常已经被解决, 最后肯定会输出 D
}
public static void showExe()throws Exception
{
throw new Exception();
}
}
// 结果: B C D //示例2: 写出程序结果
class Demo
{
public static void func()
{
try
{
throw new Exception();
System.out.println("A"); // 该条语句无法被执行, 废话! 编译失败
}
catch(Exception e)
{
System.out.println("B");
}
} public static void main(String[] args)
{
try
{
func();
}
catch(Exception e)
{
System.out.println("C");
}
System.out.println("D");
}
}

_参考资料_
- [JavaSE 基础视频](https://www.bilibili.com/video/av3100959/#page=1)

Java 之异常的更多相关文章

  1. java的异常

    下面是我对Java异常知识的几个小总结,也算是资源回收一下 一.Java异常的知识 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运 ...

  2. 《java中异常和错误》

    异常和错误的区别. 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发 ...

  3. Atitit java的异常exception 结构Throwable类

    Atitit java的异常exception 结构Throwable类 1.1. Throwable类 2.StackTrace栈轨迹1 1.2. 3.cause因由1 1.3. 4.Suppres ...

  4. Java ConcurrentModificationException异常原因和解决方法

    Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...

  5. java 异常

    异常简介 java中有Error和Exception Error:是程序无法处理的错误,表示运行应用程序中较严重问题.大多数错误与代码编写者执行操作无关,而表示运行时JVM出现的问题. Excepti ...

  6. Java基础——异常体系

    在Java中,异常对象都是派生于Throwable类的一个实例,Java的异常体系如下图所示: 所有的异常都是由Throwable继承而来,在下一层立即分解为两个分支,Error和Exception. ...

  7. Java并发编程:Java ConcurrentModificationException异常原因和解决方法

    Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...

  8. 【转】Java ConcurrentModificationException异常原因和解决方法

    原文网址:http://www.cnblogs.com/dolphin0520/p/3933551.html Java ConcurrentModificationException异常原因和解决方法 ...

  9. JAVA基础——异常详解

    JAVA异常与异常处理详解 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1 ...

  10. 你真的会阅读Java的异常信息吗?

    给出如下异常信息: java.lang.RuntimeException: level 2 exception at com.msh.demo.exceptionStack.Test.fun2(Tes ...

随机推荐

  1. Atitit.随时间变色特效 ---包厢管理系统的规划

    Atitit.随时间变色特效 ---包厢管理系统的规划 1 流程滴定仪 定义的参数 颜色.位置(开始值,结束值,当前比值) >>返回数值 可以后期处理转成双位16进制码 分别定义复合颜色的 ...

  2. VS编译duilib项目时候的错误解决方法整理

    @1:找不到Riched20.lib 用everything等软件搜索下磁盘.找到所在的文件夹加入到vs的库文件夹就可以.我得是C:\Program Files (x86)\Microsoft SDK ...

  3. makefile之目录搜索&自动依赖

    目录搜索 在一个大工程中,一般会将源文件和中间生成文件放在不同的目录,而且不会污染源码所在的目录.当需要编译不同目录下的源文件时,就需要指定路径,那么怎样让路径的表示以及源文件的引用更加灵活.就要用到 ...

  4. iOS音频合并

    iOS音频合并 最近遇到一个需求,客户录音试听一下可以,就继续向下录制,当客户录制完成后,需要把前面录制的试听音频和后面的音频进行合并.最初想到的方法,使用NSData对两个音频文件进行合并,但是合并 ...

  5. 什么是ETag

    ETag 是 Entity Tag 的缩写,中文译过来就是实体标签的意思.在HTTP1.1协议中其实就是请求HEAD中的一个属性而已. HTTP/1.1 200 OK Date: Mon, 23 Ma ...

  6. CentOS6.2下Qt5.1.0无法输入中文

    因为在程序中需要在界面上输入中文,但是系统是英文系统,没有预装中文输入法,于是从网上搜了一下输入法的安装,但是输入法安装好之后,可以再系统中输入中文,但是却无法再Qt中输入中文,只能继续找解决办法 安 ...

  7. PYTHON中 赋值运算的若干问题总结

    1.PYTHON中没有自增自减操作(++,——): 因为PYTHON中对于字符.数值等不可变的对象来说,自增自减没有意义. 2.PYTHON中l连接操作总是创建一个新对象. 举例: L=[1,2] M ...

  8. python zlib压缩存储到mysql列

    数据太大压缩存储,可以使用zlib中的压缩函数,代码如下: import ujson import MySQLdb import zlib import base64 kwargs = { 'host ...

  9. ifconfig配置网络时,出现“SIOCSIFADDR: No such device”

    最近刚学习linux,参考教学视频,试着使用ifconfig命令来设置网卡参数,命令为“ifconfig eth0 192.168.11.2”. 但结果显示“SIOCSIFADDR: No such ...

  10. css3动画4

    效果: 代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head&g ...