java300集要看多久_java300集——异常机制

异常引入

49230bdc51c75696eead6158d36cf0c0.png

面对异常该怎么办呢?

• 生活中, 我们会根据不同的异常进行相应的处理, 而不会就此中断我们的生活

10ed73b2aa63558024afdd3e39fe4015.png

程序中的异常

示例1: 给出除数和被除数, 求商

• 如果除数为0, 出异常

• 如果除数或者被除数不是数字, 出异常

示例2: 将d:/a.txt复制到e:/a.txt

• 如果d:/a.txt不存在

• 如果e:/存在a.txt

• 如果e盘空间不足

• 如果复制过程中出错

ae9ded8cd614edd2c145075f6a71d23f.png

真正的代码, 只有红色部分的一 行! 其余都是用于处理例外情况的代码!

面对异常该怎么办呢?

• 方式1: 由开发者通过if-else来解决异常问题

• 代码臃肿: 业务代码和异常处理代码放一起

• 程序员要花很大精力"堵漏洞“

• 程序员很难堵住所有“漏洞” , 对程序员本身要求较高

• 方式2: 开发者不需要通过if-else来解决异常问题, 而是Java提供异常处理机制。 它将异常处理代码和和业务代码分离, 使程序更优雅, 更好的容错性, 高键壮性

6acb4b633691a0b81c263b5d2e47cfc9.png

异常(Exception 也称例外) 就是在程序的运行过程中所发生的不正常的事件, 它会中

断正在运行的程序

• 所需文件找不到

• 网络连接不通或中断

• 算术运算错 (被零除…)

• 数组下标越界

• 装载一个不存在的类或者对null对象操作

• 类型转换异常

• ……

• 当Java程序出现以上的异常时, 就会在所处的方法中产生一个异常对象。 这个异常对象包括异常的类型, 异常出现时程序的运行状态以及对该异常的详细描述。

• Java的异常处理是通过5个关键字来实现的: try、 catch、 finally、 throw、 throws

683f564cb52d12370e9c454a880a1a0f.png

异常处理

try-catch

• 情况1: try块中代码没有出现异常

• 不执行catch块代码, 执行catch块后边的代码

• 情况2: try块中代码出现异常, catch中异常类型匹配(相同或者父类)

• 执行catch块代码, 执行catch块后边的代码

• 情况3: try块中代码出现异常, catch中异常类型不匹配

• 不执行catch块代码, 不执行catch块后边的代码, 程序会中断运行

注意:

• 出现异常后, Java会生成相应的异常对象, Java系统寻找匹配的catch块, 找到后将异常对象付给catch块异常参数

• 出现异常后, try块中尚未执行的语句不会执行

• 出现异常后并处理后, catch块后面的语句还会执行

catch块中如何处理异常 :

• 输出用户自定义异常信息:

• System.err.println(“除数不能为零。”);

• System.err.println(“被除数和除数必须是整数。”);

• 调用异常对象的方法输出异常信息 :

• toString ( )方法,显示异常的类名和产生异常的原因

• void printStackTrace() 输出异常的堆栈信息

• String getMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分

• 继续向上抛出异常 :

• throw e

异常类型

8717689f1b50b5e0084c3a99cd429a3b.png

package cn.bjsxt.exception.test;

import java.io.File;

import java.io.FileNotFoundException;

public class TestException {

public static void main(String[] args) {

//int i = 1/0;

//Computer c = null;

//if(c!=null){

//c.start(); //对象是null,调用了对象方法或属性!

//}

//String str = "1234abcf";

//Integer i = new Integer(str);

//try{

//Thread.sleep(3000); //checked Exception

//}catch(Exception e){

//e.printStackTrace();

//}finally{

//System.out.println("aaa");

//}

File f = new File("c:/tt.txt");

if (!f.exists()) {

try {

throw new FileNotFoundException("File can't be found!"); //手动抛出异常

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

}

}

class Computer{

void start(){

System.out.println("计算机启动!");

}

}

try-catch-finally

• 在try-catch块后加入finally块, 可以确保无论是否发生异常, finally块中的代码总能被执行

• 无异常 try-finally

• 有异常 try-catch-finally

• 通常在finally中关闭程序块已打开的资源, 比如: 文件流、 释放数据库连接等。

• finally块中语句不执行的唯一情况

• 异常处理代码中执行System.exit(1)退出Java虚拟机

• Finally块的具体执行过程

• 执行try或catch中代码

• 遇到return/throw, 先执行finally中语句块

• 执行return/throw

多重catch

• 一段代码可能会引发多种类型的异常

• 当引发异常时, 会按顺序来查看每个 catch 语句, 并执行第一个与异常类型匹配的catch语句

• 执行其中一条 catch 语句后, 其后 catch 语句将被忽略

• 在安排catch语句的顺序时, 首先应该捕获最特殊的异常, 然后再逐渐一般化, 即先子类后父类

package cn.bjsxt.exception.test;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.text.ParseException;

class A {

public void method() throws IOException {}

}

class B extends A {public void method() throws FileNotFoundException {}

}

class C extends A {public void method() {}

}

//class D extends A {public void method() throws Exception {} //超过父类异常的范围,会报错!

//}

class E extends A {public void method() throws IOException, FileNotFoundException { }

}

class F extends A {public void method() throws IOException, ArithmeticException { }

}

//class G extends A {public void method() throws IOException, ParseException {} //报错

//}

异常分类

69d36aaf7314c73a8f654d6a4784df10.png

Error

• Error类层次描述了Java运行时系统内部错误和资源耗尽错误, 一般指与JVM或动态加载等相关的问题, 如虚拟机错误, 动态链接失败, 系统崩溃等。

• 这类错误是我们无法控制的, 同时也是非常罕见的错误。 所以在编程中, 不去处理这类错误。

• 打开JDK包: java.lang.Error, 查看他的所有子类

• 注: 我们不需要管理Error!

Exception

• 所有异常类的父类, 其子类对应了各种各样可能出现的异常事件。

Exception分类

• 运行时异常Runtime Exception(unchecked Exception)

• 可不必对其处理, 系统自动检测处理

• 一类特殊的异常, 如被 0 除、 数组下标超范围等, 其产生比较频繁, 处理麻烦, 如果显式的声明或捕获将会对程序可读性和运行效率影响很大

• 检查异常 Checked Exception

• 必须捕获进行处理, 否则会出现编译错误

注意: 只有Java提供了Checked异常, 体现了Java的严谨性, 提高了Java的健壮性。 同时也是一个备受争议的问题。

声明异常throws

• 当Checked Exception产生时, 不一定立刻处理它, 可以再把异常Throws出去

• 如果一个方法抛出多个已检查异常, 就必须在方法的首部列出所有的异常, 之间以逗号隔开

• 子类声明的异常范围不能超过父类声明范围

• 父类没有声明异常, 子类也不能

• 不可抛出原有方法抛出异常类的父类或上层类

package cn.bjsxt.exception.test;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

public class TestReadFile {

public static void main(String[] args) throws FileNotFoundException, IOException { //全部抛给JRE

String str;

str = new TestReadFile().openFile();

System.out.println(str);

}

String openFile() throws FileNotFoundException,IOException {

FileReader reader = new FileReader("d:/a.txt");

char c = (char)reader.read();

System.out.println(c);

return ""+c;

}

}

手动抛出异常throw

• Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出, 也可根据需要手工创建并抛出。

• 在捕获一个异常前, 必须有一段代码先生成异常对象并把它抛出。 这个过程我们可以手工做,也可以由JRE来实现, 但是他们调用的都是throw子句。

• 注意抛出运行时异常和Checked异常的区别

• 抛出Checked异常, 该throw语句要么处于try块中, 要么方法签名中石油throws抛出

• 抛出运行时异常, 没有以上要求

自定义异常

• 在程序中, 可能会遇到任何标准异常类都没有充分的描述清楚的问题, 这种情况下可以创建自己的异常类

• 从Exception类或者它的子类派生一个子类即可

• 习惯上, 定义的类应该包含2个构造器: 一个是默认构造器, 另一个是带有详细信息的构造器

package cn.bjsxt.exception.test;

/**

*

* @author Administrator

*

*/

public class MyException extends Exception {

public MyException(){

}

public MyException(String message){

super(message);

}

}

class TestMyException{

void test()throws MyException{

///

}

public static void main(String[] args) {

try {

new TestMyException().test();

} catch (MyException e) {

e.printStackTrace();

}

}

}

• 注意

• try-finally也可以呀

• 遇到了return和throw还会执行finally语句; 遇到System.exit()就不会执行finally语句了

• throw了运行时异常, 则方法声明中不需要throws

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值