------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
黑马程序员 java 基础 毕向东 面向对象 异常
1 异常描述
package day09;
public class 异常 {
/*
* 异常:
* 对问题的描述,将问题对象进行封装
* 异常体系:
* Throwable
* |--Error
* |--Exception
* |--RuntimeException
* ---------------------------------------
* 异常体的特点:
* 异常体系中的所有类以及建立的对象都具有可抛性
* 也就是可以被throws 和 throw 关键字 操作
*
* throws 和throw 的特点
* throw 定义在函数内,用于抛出异常对象
* throws 定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开
* 当函数内容有throw 抛出异常对象,并未进行try处理,
* 必须在函数上声明,否则编译失败
* 注意:RuntimeException除外,即throw new RuntimeException可以不
* 声明;
* 如果函数声明 了异常,调用者需要进行处理。处理方式
* 可抛 可 try
* 异常有两种:
* 编译时异常被检查异常
* 该异常在编译时如果没有处理(没有抛出也没有try),
* 则编译失败,
* 运行时异常,编译时不检测;
* 在编译时不需要处理,编译器不检查
* 该异常发生,建议不处理,让程序停止,对代码进行修正
*
* ---------------------------------------
* 异常处理语句:
* try{
* 需要被检查的代码
* }
* catch (Exception e){
* 处理异常的代码
* }
* finally
* {
* 一定会执行的代码
* }
* 三种结合形式:
* 1:try{
*
* }catch(Exception e){
*
* }
* 2:try{
*
* }catch(Exception e){
*
* }finally{
*
* }
* 3:try{
*
* }finally{
*
* }
* 注意:finally 通常定义关闭资源代码,因为资源必须释放
* finally 一种情况不好执行:
* System.exit(0);
*
* ---------------------------------------
* 自定义异常:
* 定义类继承Exception或者RuntimeException
* 1:为了让该类具有可抛性
* 2:让该类具备操作异常的共性方法
* 当要定义自定义异常的信息时,可以使用父类已经定义好的功能
* 异常信息传递给父类 的构造方法
* class MyException extends Exception{
* MyException(String msg){
* super(msg);
* }
*
* ---------------------------------------
* 异常 的好处:将问题封装成对象
* 将正常流程代码和问题处理代码分离,方便阅读
* 异常 的处理原则:
* 1:try 或者 throws
* 2:调用到抛出异常的功能时,抛出几个,就处理几个
* 一个try 对应多个catch
* 3:多个catch 父类的catch 放在下面
* 4:catch 内需要定义针对性的处理方式,不要简单的
* 输出语句,也不要不谢
* 5;当捕获到的异常,本功能处理不了时,可以继续在
* catch 抛出,即:
* try{
* try new AException();
* }catch (AException e)
* {
* throw e'
* }
* 如果该异常处理不了,但并不属于该功能的异常
* 可以讲该异常转化,在抛出相关异常
* 或将异常处理,当需要将异常产生的和本功能相关的问题提供出去
* try{
* throw new AException();
* }catch( AException e){
* throw new BException();
* }
* 比如 :汇款
* 异常的主要事项:
* 1:在 字符类覆盖时,子类抛出 的异常必须是父类的子类或者子集
* 2:如果父类或者接口没有异常抛出,子类覆盖出现异常,只能try不能抛throws
*
*
* */
public static void main(String[] args) {
}
}
2:多 catch
package day09;
/*
*
* 异常:程序在运行时出现的不正常情况
* 问题也封装成类,使用java形式描述
* 其实就是java对不正常情况进行描述后的对象体现
* 问题划分: 两种 严重和不严重的
* 严重的 使用 Error 类描述,一般不编写针对性的代码进行处理
* 不严重的使用 Exception 描述,一般需要编写针对性的代码进行处理
* Throwable
* |--Error
* |--Exception
* java 提供了特有语句进行处理
*
* try{
* 需要被检查的代码;
* }catch(异常类 变量){
* 处理异常 的代码(处理方式)
* }finally{
* 一定会执行的代码
* }
*
* 3 对捕获的异常对象进行常见的方法操作:
* String getMessage();
*
* 对多异常进行处理:
* 1:声明异常时,建议声明更为具体的异常,这样可以处理的更具体
* 2:声明几个异常,就对应几个catch块
* 若多个catch块异常出现继承关系,父类异常放在下边处理
* 不要定义多余的catch块,
* 建立catch处理时,catch中要定义具体的处理方式,
* 不要简单定义e.printStackTrace();
* 也不要简单打印
* */
public class ExceptionDemo {
public static void main(String[] args) {
Demo demo=new Demo();
try {
int x=demo.div(4, 0);//ArithmeticException
System.out.println("x= "+x);
} catch (ArithmeticException e) {
System.out.println("除以 0 了");
e.printStackTrace();//异常名称,异常信息,异常出现的位置
//jvm 默认的异常处理就是调用 printStackTrace()方法
System.out.println(e.toString());//异常名称,异常信息,
System.out.println(e.getMessage());//异常信息,
}catch (ArrayIndexOutOfBoundsException e) {
System.out.println("--数组引用越界");
e.printStackTrace();//异常名称,异常信息,异常出现的位置
//jvm 默认的异常处理就是调用 printStackTrace()方法
System.out.println(e.toString());//异常名称,异常信息,
System.out.println(e.getMessage());//异常信息,
}catch ( Exception e) {
System.out.println("--数组引用越界");
e.printStackTrace();//异常名称,异常信息,异常出现的位置
//jvm 默认的异常处理就是调用 printStackTrace()方法
System.out.println(e.toString());//异常名称,异常信息,
System.out.println(e.getMessage());//异常信息,
}
}
}
class Demo{
int div(int a,int b) throws ArithmeticException,ArrayIndexOutOfBoundsException{
//通过throws关键字声明该功能可能会出现问题
int [] arr=new int[0];
System.out.println(arr[4]);
return a/b;
}
}
3自定义异常
package day09;
/*
* 因为项目中会出现特有的问题
* 而这些问题没有被java描述并封装对象
* 对于特有的问题 可以按照java思想 进行
* 自定义异常封装
*
* 自定义 异常
* 需求:在本程序中 除数不可以为负数 -1,视为不可以运算
* 当在函数内部出现 throw 抛出异常对象,那么 必须给出对应的处理动作
* 1:在内部 try-catch 处理
* 2:在函数后生命,让调用者处理
* 一般情况下,函数内 出现异常,函数上声明
*
* 如何定义呢:
* 因为父类中已经把异常信息的操作都完成了
* 所以子类只要在构造时,将异常信息传递给父类通过super 语句
* 那么就可以直接通过getMessage 方法获取自定义的异常信息
*
* 异常体系特点:因为异常类和异常对象都被抛出
* 他们具有可抛性
* 可抛性是Throwabale体系的独有特点
* 只有这个体系中国的类和对象才可以被Throws 和 Throw 操场
* Throws 和 Throw 的区别:
* throws 使用在函数傻瓜
* throw 使用在函数内
*
* throws 后面跟异常类,可以跟多个,用逗号隔开
* throw 后跟异常对象
* */
public class ExceptionDemo3 {
public static void main(String[] args) {
Demo3 demo=new Demo3();
try {
demo.div(4, -1);
} catch (FushuException3 e) {
System.out.println(e.toString());//toString 调用getMessage方法
System.out.println(e.getMessage());
}
}
}
class Demo3{
int div(int a,int b) throws FushuException3{
//通过throws关键字声明该功能可能会出现问题
if(b<0){
throw new FushuException3("除数为负数"+b);//手动抛出异常
}
return a/b;
}
}
class FushuException3 extends Exception{
private String meg;
public FushuException3(String meg) {
super(meg);
}
}
//class FushuException extends Exception{
//private String meg;
//public FushuException(String meg) {
//this.meg=msg;
//}
//public String getMessage(){
//return meg;
//}
//}
4 finally 应用场景
package day09;
/*
*
* finally 应用场景
*
* 连接数据库
* 数据操作
* 关闭数据库
*
* try{
* 连接数据库
* 数据操作
* }
* catch (Exception e){
* 对数据库进行异常处理//处理本层问题
* throw new NoException();//返回相关信息
* }
* finally
* {
* 关闭数据库
* }
* finally 代码块,定义一定执行的代码
* 通常用于关闭资源
* 否则容易造成资源使用压力
*
* */
class Demo4{
int div(int a,int b) throws FushuException{
//通过throws关键字声明该功能可能会出现问题
if(b<0){
throw new FushuException("除数为负数"+b);//手动抛出异常
}
return a/b;
}
}
class ExceptionDemo4 {
public static void main(String args[]) {
Demo4 demo4=new Demo4();
try {
int x=demo4.div(4, 1);
} catch (FushuException e) {
System.out.println(e.toString());
}finally{
System.out.println("finally");
//finally中存放一定会执行的代码
}
System.out.println("over");
}
}
class NoException extends Exception{
}
class FushuException extends Exception{
private String meg;
public FushuException(String msg) {
this.meg=msg;
}
public String getMessage(){
return meg;
}
}
5 异常 格式
package day09;
/*
* try - catch -finally 的 格式
*1:try -catch
*2:try -catch -finally
*3:try -finally
*4:try -catch-catch
*
*catch 用于处理异常,如果没有catch代表异常
*没有被处理,
*如果该异常为检测时异常,必须声明
**/
/*
* class Demo6{
public void method(){
throw new Exception();
//编译不通过
}
}*/
/*
* class Demo6{
public void method(){
try {
throw new Exception();//编译通过
} catch (Exception e) {
}
}
}*/
/*
class Demo6{
public void method(){
try {
throw new Exception();
} catch (Exception e) {
try {
throw e;//编译通过
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}*/
class Demo6{
public void method() throws Exception{
try {
throw new Exception();
}finally{
//关资源 。必须要执行的代码
}
}
}
public class ExceptionDemo6 {
public static void main(String args[]) {
System.out.println("heo");
}
}
6 异常 在子父类中 的使用
package day09;
/*
* 异常在子父类覆盖中的体现
* 1:子类在覆盖父类时,如果父类发方法抛出异常
* 那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类
*
* Exception
* |--AException
* |--BException
* |--CException
* 2:如果父类方法抛出多个异常,那么子类方法
* 在覆盖方法时,子类只能抛出父类异常的子集
* 3:如果父类或者接口的方法中没有异常抛出,那么子类在方法
* 覆盖方法时,也不可以抛出异常,
* 如果子类方法发生了异常,就必须进行try 处理
* 绝对不能抛;
* */
class AException extends Exception{
}
class BException extends AException{
}
class CException extends Exception{
}
class Fu{
void show() throws AException{
}
}
class Zi extends Fu{
void show() throws BException{
//要么不抛,要么抛A或BException
//不能抛CExecption
}
}
class Test7 {
void fun(Fu fu) {
try {
fu.show();
} catch (AException e) {
}
}
}
public class ExceptionDemo7 {
public static void main(String[] args) {
Test7 test=new Test7();
test.fun(new Fu());
}
}
7 测试
package day09;
/*
* 有一个圆形和长方形
* 都可以获取面积,对于面积出现非法的数值,视为获取面积出现的问题
* 通过异常表示,*/
class NoValueException extends Exception{
public NoValueException(String msg) {
super(msg);
}
}
class NoValueException2 extends RuntimeException{
public NoValueException2(String msg) {
super(msg);
}
}
interface Shape{
void getArea();
}
class Circle implements Shape{
private int radius;
static final double PI=3.14;
Circle(int radius){
if (radius<0) {
throw new RuntimeException("非法值 Circle");
}
this.radius=radius;
}
@Override
public void getArea() {
System.out.println(radius*radius*PI);
}
}
class Res implements Shape{
private int len,wid;
Res( int len,int wid) throws NoValueException {
if (len <0||wid<0) {
throw new NoValueException("出现非法值 Res");
}
this.len=len;
this.wid=wid;
}
@Override
public void getArea() {
System.out.println(len*wid);
}
}
class Res2 implements Shape{
private int len,wid;
Res2( int len,int wid) {
if (len<0||wid<0) {
throw new NoValueException2("非法值 Res2");
}
this.len=len;
this.wid=wid;
}
@Override
public void getArea() {
System.out.println(len*wid);
}
}
public class ExceptionTest1{
public static void main(String args[]) {
Res res = null;
Res2 res2 = null;
/*
try {
res = new Res(-3, 4);
res.getArea();
}
catch (NoValueException e) {
//e.printStackTrace();
System.out.println(e.toString());
}
*/
//
//res2 = new Res2(-3, 4);
//res2.getArea();
//System.out.println("over");
Circle circle=new Circle(-8);
circle.getArea();
}
}
《黑马程序员 java 基础 毕向东 面向对象 异常》
介绍了java中的异常机制,异常的使用场景,自定义异常 的使用以及注意事项。
package pack;
/*
* 包与包之间进行访问,被访问的包中的类以及类中的成员需要public修饰
* 不同包中的子类还可以直接访问父类中被protected权限修饰的成员
*
* 包与包之间可以使用的权限只有两种,public 和 protected
* ———————— |————————|———————————|—————————|——————————|
* | public | protected | defaul | private |
* ———————— |————————|———————————|—————————|——————————|
* 同一个类中 | ok | ok | ok | ok
* 同一个包中 | ok | ok | ok |
* 子类 | ok | ok |
* 不同包中 | ok |
*
*
* 为了简化类名的书写,使用关键字 import
* import pack.haha.*;
* import 导入包中的类,而且只导入class文件
* 建立不要写通配符 *,用哪个类就导入哪个类
* 建立定义包名不要重复,可以使用URL的完成定义
* pack cn.itcast.demo
* pack cn.itcast.test
*
*
* jar 包
* 方便携带,使用
* */
class DemoA {
void show(){
System.out.println("show");
}
}