从零开始的"E"世界(J2SE)

来源:互联网 发布:java图片base64编码 编辑:程序博客网 时间:2024/05/03 14:58

JavaNote7

    • JavaNote7
      • 异常
        • 1 异常概述
        • 2 异常体系
        • 3 捕获异常
        • 4 finally代码块
        • 5 异常分类
        • 6 抛出异常
        • 7 自定义异常类
        • 8 其他
      • 包package
        • 1 包的概述
        • 2 常见的软件包

1. 异常

1.1 异常概述

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


1.2 异常体系

  • java.lang.Throwable
    • Error:表示错误,一般指JVM相关的不可修复的错误,如,系统崩溃,内存溢出,JVM错误等,由JVM抛出,我们不需要处理.几乎所有的子类都是以Error作为类名的后缀.
    • Exception:表示异常,指程序中出现不正常的情况,该问题可以修复(处理异常).几乎所有的子类都是以Exception作为类名的后缀.

常见的Error:
StackOverflowError:当应用程序递归太深而发生内存溢出时,抛出该错误。
常见的Exception:
NullPointerException:空指针异常,一般指当对象为null的时候,调用了该对象的方法,字段.
ArrayIndexOutOfBoundsException:数组的索引越界,(小于0或者大于等于数组长度)
NumberFormatException:数字格式化异常, 一般指,把非0~9的字符串转换为整数.


1.3 捕获异常

处理方式有两种:1捕捉(try-catch);2抛出(throws)。
对于捕捉:java 有针对性的语句块进行处理。

//使用try-catch捕获单个异常,语法如下:try{     编写可能会出现异常的代码}catch(异常类型  e){     处理异常的代码     //记录日志/打印异常信息/继续抛出异常}注意:trycatch都不能单独使用,必须连用.
//使用try-catch捕获多个异常:try{     编写可能会出现异常的代码}catch(异常类型A  e){  当try中出现A类型异常,就用该catch来捕获.     处理异常的代码     //记录日志/打印异常信息/继续抛出异常}catch(异常类型B  e){  当try中出现B类型异常,就用该catch来捕获.     处理异常的代码     //记录日志/打印异常信息/继续抛出异常}注意:     1:一个catch语句,只能捕获一种类型的异常,如果需要捕获多种异常,就得使用多个catch语句.    2):代码在一瞬间只能出现一种类型的异常,只需要一个catch捕获,不可能同时出现多个异常.
//获取异常信息catch (Exception e) { //e 用于接收 try 检测到的异常对象。    System.out.println("message:"+e.getMessage());//获取的是异常的信息。    System.out.println("toString:"+e.toString());//获取的是异常的名字+异常的信息。    e.printStackTrace();//打印异常在堆栈中信息;异常名称+异常信息+异常的位置。}

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

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


1.4 finally代码块

  • finally语句块表示最终都会执行的代码,无论有没有异常.

  • 什么时候的代码必须最终执行:
    当我们在try语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等),我们都得在使用完之后,最终关闭打开的资源.

  • finally的两种语法:

    • 1):try…finally: 此时没有catch来捕获异常,因为此时根据应用场景,我们会抛出异常,自己不处理.
    • 2):try…catch….finally:自身需要处理异常,最终还得关闭资源.

注意:finally不能单独使用.

当只有在try或者catch中调用退出JVM的相关方法,此时finally才不会执行,否则finally永远会执行.如:System.exit(0);//退出JVM


1.5 异常分类

  • 异常(Exception)的分类:根据在编译时期还是运行时期去检查异常.
    • 1):编译时期异常:checked异常.在编译时期,就会检查,如果没有处理异常,则编译失败.
    • 2):运行时期异常:runtime异常.在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错).运行异常:在编译时期,可处理,可不处理.
      这里写图片描述
  • checked异常和runtime异常的区别:
    • 编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。
      声明的原因:是需要调用者对该异常进行处理。
    • 运行时异常如果在函数内被抛出,在函数上不需要声明。
      不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。

1.6 抛出异常

抛出异常:
throw: 运用于方法内部,用于给调用者返回一个异常对象,和return一样会结束当前方法.
throws: 运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).

throw 和 throws 关键字的区别:
throw 用于返回异常对象,后面跟的是异常对象;throw 用在函数内。
throws 用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws 用
在函数上。
通常情况:函数内容如果有 throw,抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。但是也有特殊情况。

  • 定义异常处理时,什么时候定义 try,什么时候定义 throws 呢?
    • 功能内部如果出现异常,如果内部可以处理,就用 try.
    • 如果功能内部处理不了,就必须声明出来,让调用者处理。使用throws 抛出,交给调用者处理。谁调用了这个功能谁就是调用者.

1.7 自定义异常类

自定义异常的步骤:
1:定义一个子类继承 Exception 或 RuntimeException,让该类具备可抛性(既可以
使用 throw 和 throws 去调用此类)。
2:通过 throw 或者 throws 进行操作。

异常的转换思想:当出现的异常是调用者处理不了的,就需要将此异常转换为一个调用
者可以处理的异常抛出。


1.8 其他

  • 异常转译和异常链:

    • 异常转译:当位于最上层的子系统不需要关心底层的异常细节时,常见的做法是捕获原始的异常,把它转换为一个新的不同类型的异常,再抛出新的异常.

    • 异常链:把原始的异常包装为新的异常类,从而形成多个异常的有序排列,有助于查找身材异常的根本原因.

  • Java7的异常新特性

    • 增强的throw
    • 多异常捕获
    • 自动资源关闭
  • 处理异常的原则:

    • 1:异常只能用于非正常情况,try-catch的存在也会影响性能.
    • 2:需要为异常提供说明文档,比如Java doc,如果自定义了异常或某一个方法抛出了异常,我们应该记录在文档注释中..
    • 3:尽可能避免异常.
    • 4:异常的粒度很重要,应该为一个基本操作定义一个 try-catch 块,不要为了简便,将几百行代码放到一个 try-catch 块中.
    • 5:不建议在循环中进行异常处理,应该在循环外对异常进行捕获处理(在循环之外使用try-catch).
    • 6:自定义异常尽量使用RuntimeException类型的.

2. 包(package)

2.1 包的概述

  • 包:定义包用 package 关键字
    • 1.对类文件进行分类管理。
    • 2.给类提供多层命名空间。
    • 3.写在程序文件的第一行。
    • 4.类名的全称的是 包名.类名。
    • 5.包也是一种封装形式。
package cn.itcast.pack.demo;//定义了一个包。注意:包名的写法规范:所有字母都小写,一般写成公司域名倒写。

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


2.2 常见的软件包


  • 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 小程序。

最后附上Java学习网址

原创粉丝点击