黑马程序员——异常与包



------- android培训java培训、期待与您交流! ----------




异常


异常:就是不正常。程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。 


Throwable可抛出的。

    |--Error错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。

    |--Exception异常,可以有针对性的处理方式。 


如何标示呢?通过throws关键字完成,格式:throws 异常类名,异常类名...

这样标示后,调用者,在使用该功能时,就必须要处理,否则编译失败。


出现的问题有很多种,比如角标越界(ArrayIndexOutOfBoundsException),空指针(NullPointerException)等都是。就对这些问题进行分类。而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系。 


图例:


运行结果:算术异常,除数为0了。

 


异常的处理 


java提供了特有的语句进行处理

try

{

   需要被检测的代码;

}

catch(异常类 变量)

{

   处理异常的代码;(处理方式)

}

finally

{

   一定会执行的语句;

}


对捕获到的异常对象进行常见方法操作。

getMessgae():获取异常信息。

toString():异常名称: 异常信息

printStackTrace():异常名称,异常信息,异常出现的位置。

其实jvm默认的异常处理机制,就是在调用printStackTrace方法,打印异常的堆栈的跟踪信息。

int div(int a,int b) throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题

在函数上声明异常。

便于提高安全性,让调用出进行处理,不处理编译失败。 


对多异常的处理。

1、声明异常时,建议声明更为具体的异常,这样处理。

2、对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。

    如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

建立在进行catch处理时,catch中一定要定义具体处理方式。

不要简单定义一句e.printStackTrace()

也不要简单的就书写一条输出语句。

因为项目中会出现特有的问题。

而这些问题并未被java所描述并封装对象。

所以对于这些特有的问题可以按照java的对问题封装的思想。

将特有的问题,进行自定义的异常封装。 


异常处理原则:功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。


特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。 


throw throws关键字的区别:

throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。

throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。


异常分两种:

1:编译时被检查的异常,只要是Exception及其子类都是编译时被检测的异常。

  2:运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常。 


定义异常处理时,什么时候定义try,什么时候定义throws呢?

功能内部如果出现异常,如果内部可以处理,就用try

如果功能内部处理不了,就必须声明出来,让调用者处理。 


自定义异常:当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。


对于除法运算,0作为除数是不可以的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在我们项目中,除数除了不可以为0外,还不可以为负数。可是负数的部分java并没有针对描述。所以我们就需要自定义这个异常。 


RuntimeException

Exception中有一个特殊的子类异常RuntimeException运行时异常。

 如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。

 如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。

之所以不用在函数上声明,是因为不需要让调用者处理。

当该异常发生,希望程序停止,因为运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。

自定义异常时,如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException 


自定义异常的步骤:

1:定义一个子类继承ExceptionRuntimeException,让该类具备可抛性。

2:通过throw 或者throws进行操作。


finally代码块:定义一定执行的代码。

通常用于关闭资源。


第一种格式:

try

{}

catch()

{}

第二种格式:

try

{}

catch()

{}

finally

{}

第三种格式:

try

{}

finally

{}


记住:

catch是用于处理异常,如果没有catch就代表异常没有被处理过,如果该异常是检测时异常,那么必须声明异常。


 

当异常出现后,在子父类进行覆盖时,有了一些新的特点:

1、子类要覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。


Exception

   |--AException

      |---BException

   |--CException

父类抛出A异常,子类可以抛出A或者B异常,不能抛出C异常。


2、如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。


*3、如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。

    如果子类方法发生了异常,就必须要进行try处理,绝对不能抛。


注意:

如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws

如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。


练习:


运行结果:B C 5 



运行结果:

A//可以,覆盖了

B//不可以,权限不够

C//可以,和父类不一样,没有覆盖,相当于重载

D//不可以,因为该函数不可以和给定函数出现在同一函数中,或者子父类中。

E//不可以,静态只能覆盖静态。

 


 


包:定义包用package关键字。


1:对类文件进行分类管理。

2:给类文件提供多层名称空间。


如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中即可。

一般在定义包名时,因为包的出现是为了区分重名的类。所以包名要尽量唯一。怎么保证唯一性呢?可以使用url域名来进行包名称的定义。

packagepack;//定义了一个包,名称为pack注意:包名的写法规范:所有字母都小写。

//package cn.itcast.pack.demo;


类的全名称是 包名.类名 


  编译命令:javac –d 位置(.当前路径)java源文件 (就可以自动生成包)

包是一种封装形式,用于封装类,想要被包以外的程序访问,该类必须public

类中的成员,如果被包以外访问,也必须public 


包与包之间访问可以使用的权限有两种:

1public

   2protected:只能是不同包中的子类可以使用的权限。 


            public   protected  default   private


同一个类中    ok     ok         ok     ok


同一个包中   ok       ok         ok


子类         ok       ok        


不同包中     ok


为了简化类名的书写,就使用一个关键字,import

import 包名; 或者 import 包名.*;

import 导入的是包中的类。

建议不要写通配符*,需要用到包中的哪个类,就导入哪个类。

建议定包名不要重复,可以使用url来完成定义,url是唯一的。


例:www.itcast.cn 


常见的软件包:

java.lang : language java的核心包,Object System  String Throwable jdk1.2版本后,该包中的类自动被导入。

java.awt : 定义的都是用于java图形界面开发的对象。

javax.swing: 提供所有的windows桌面应用程序包括的控件,比如:Frame , Dialog, Table, List 等等,就是java的图形界面库。

java.net : 用于java网络编程方面的对象都在该包中。

java.io : input  output 用于操作设备上数据的对象都在该包中。比如:读取硬盘数据,往硬盘写入数据。

java.util : java的工具包,时间对象,集合框架。

java.applet: application+let 客户端java小程序。server+let  --> servlet 服务端java小程序。 


jar java的压缩包,主要用于存储类文件,或者配置文件等。

命令格式:jar –cf 包名.jar 包目录

   解压缩:jar –xvf包名.jar

 jar包目录列表重定向到一个文件中:jar –tf 包名.jar>c:\1.txt

 


 


 


 


 



黑马程序员的tb_brand是指在JavaWeb基础教程中创建的一个表。这个表是用来存储品牌信息的,具体的表结构和数据类型需要和JavaBean类中的成员变量保持一致。\[1\]在这个教程中,使用了Maven来构建项目,并且使用了MyBatis作为持久层框架,通过配置pom.xml文件来引入相关依赖。\[2\] Maven是一个用于管理和构建Java项目的工具,它提供了一套标准化的项目结构、构建流程和依赖管理机制。\[3\] #### 引用[.reference_title] - *1* [【JAVAWEB开发】黑马程序员java web案例资料(含Element的删除与修改)](https://blog.csdn.net/aasd23/article/details/126940147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [黑马程序员-MyBatis 框架-最全入门笔记、阿伟看了都得说真大、真细、真全!!!](https://blog.csdn.net/qq_57383364/article/details/128103058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [JavaWeb——黑马程序员课程笔记](https://blog.csdn.net/King_ZACC/article/details/128573804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值