首页 > 代码库 > 黑马程序员_Java异常 Java常用库类

黑马程序员_Java异常 Java常用库类

Java异常

1,异常的基本概念

异常是导致程序中断运行的一种指令流,它是在运行时期发生的不正常的情况,在Java中,一切的异常都秉着面向对象的设计思想,所有的异常都是以对象和类的形式存在的.

2,异常类的继承结构

在整个Java的异常结构中,实际上有两个最常用的类,Exception和Error,这两个类分别是Throwable的子类

Exception:一般表示的是程序中出现的问题,可以直接使用try....catch处理

Error:一般之的是JVM的错误,程序中无法处理.

3,Java的异常处理机制

按照面向对象的思想进行处理的,处理的步骤

(1)一旦产生异常,首先会产生一个异常类的实例化对象

(2)在try语句中对异常类进行捕捉

(3)产生的异常对象和catch语句中的各个异常类型进行匹配,如果匹配成功,则执行catch语句中的的代码

异常处理的捕捉形式:
     这是可以对异常进行针对性处理的方式.
    具体格式:
    try{
          //需要被检测异常的代码.
    }catch(异常类 变量){//该变量用于接受发生的异常对象
      //处理异常的代码.
    }finally{
    //一定会被执行的代码
    }

try catch finally代码块组合特点
    (1)try catch finally
    (2)try catch(对个)当没有必要资源需要释放时,可以不用定义finally
    (3)try finally  异常无法直接catch处理,但是资源必须关闭

根据对象的多态性,所有的子类实例可以全部使用父类类型接受,那么可以利用向上转型的概念.让所有异常对象都使用Exception来接受,在Java中,所有捕获范围小的异常必须放在捕获范围大的异常之前,否则程序在编译的时候会出现错误的提示.(捕获范围大的要放在最后)

throws:使用在函数上,它抛出的是异常类,可以抛出多个,用逗号隔开
     throw:使用的函数的内部,抛出的是异常对象

异常处理的原则:
(1)函数内部如果抛出需要检测的异常,那么函数上必须要声明,
  否则必须在函数内部用trycatch进行捕捉,否则编译失败
(2)如果调用到了声明异常的函数,要么trycatch,要么throws,否则编译失败
(3)什么时候catch,什么时候throws?
  功能内部可以解决用catch,不能解决,用throws告诉调用者,让调用者解决
(4)一个功能抛出对个异常,那么调用时,要用多个catch进行针对性的处理

既然Throwable是异常中最大的类,可以直接使用它来捕获所有的异常吗?

不建议这样使用,最大只能捕获Exception,因为在Threowable中,它有两个子类,其中的Error本身是不需要程序处理,而程序中需要处理的是Exception,所以没必要使用Throwable,另外对于一个程序来说,如果有多个异常最好分别进行捕获,而不是直接使用Exception捕获所有的异常.

 

3,throw和throws的应用

package cn.wjd.exception;class Math{    public int div(int x,int y)throws Exception{        int temp = 0;        System.out.println("...计算开始...");        try {            temp = x/y;        } catch (Exception e) {            throw e;        }finally{            System.out.println("...计算结束...");        }        return temp;    }}public class ThrowDemo {    public static void main(String[] args) {        Math m = new Math();        try {            m.div(10, 0);        } catch (Exception e) {            System.out.println("...异常出现..."+e);        }    }}

上述代码中,不管Math类中的div()是否会出现异常,都会执行"计算结束"的语句,如果有异常产生的话,是将异常交给调用者进行处理的.

 

4,Exception类和RuntimeException类

Exception:在程序中必须使用try...catch进行处理

RuntimeException:可以不使用try...catch进行处理,但是如果有异常产生的话,则异常是交给JVM进行处理的

5,finally是在数据库的操作中,这个关键字是非常有作用的,用来关闭数据库的连接

class NoDateException extends Exception{
    
}
void addDate(Date d)throws NoDateException{
    try{
      添加数据出现异常,出现SQLException异常
      这个异常应该在内部处理掉,假如不处理向外抛出的话,addDate它并不知道SQL数据库的异常,这个时候就
      需要进行异常转化,新定义一个未添加成功数据的异常类
    }catch(SQLException e){
      throw new NoDateException();
    
    }finally{
       关闭数据库
    
    }
  }

 

 

Java常用库类

1,System类

System类是一些与系统相关的属性和方法的集合,而且在System中所有的属性和方法都是静态的.

package cn.wjd.system;public class SystemDemo2 {    public static void main(String[] args) {        System.getProperties().list(System.out);    }}
java.runtime.name=Java(TM) SE Runtime Environmentsun.boot.library.path=D:\jdk\jdk1.7.0_45\jre\binjava.vm.version=24.45-b08java.vm.vendor=Oracle Corporationjava.vendor.url=http://java.oracle.com/path.separator=;java.vm.name=Java HotSpot(TM) Client VMfile.encoding.pkg=sun.iouser.script=user.country=CNsun.java.launcher=SUN_STANDARDsun.os.patch.level=Service Pack 1java.vm.specification.name=Java Virtual Machine Specificationuser.dir=D:\workspace\OtherApijava.runtime.version=1.7.0_45-b18java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironmentjava.endorsed.dirs=D:\jdk\jdk1.7.0_45\jre\lib\endorsedos.arch=x86java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Templine.separator=java.vm.specification.vendor=Oracle Corporationuser.variant=os.name=Windows 7sun.jnu.encoding=GBKjava.library.path=D:\jdk\jdk1.7.0_45\bin;C:\Windows\Sun...java.specification.name=Java Platform API Specificationjava.class.version=51.0sun.management.compiler=HotSpot Client Compileros.version=6.1user.home=C:\Users\Administratoruser.timezone=java.awt.printerjob=sun.awt.windows.WPrinterJobfile.encoding=GBKjava.specification.version=1.7user.name=Administratorjava.class.path=D:\workspace\OtherApi\binjava.vm.specification.version=1.7sun.arch.data.model=32java.home=D:\jdk\jdk1.7.0_45\jresun.java.command=cn.wjd.system.SystemDemo2java.specification.vendor=Oracle Corporationuser.language=zhawt.toolkit=sun.awt.windows.WToolkitjava.vm.info=mixed mode, sharingjava.version=1.7.0_45java.ext.dirs=D:\jdk\jdk1.7.0_45\jre\lib\ext;C:\Win...sun.boot.class.path=D:\jdk\jdk1.7.0_45\jre\lib\resources....java.vendor=Oracle Corporationfile.separator=java.vendor.url.bug=http://bugreport.sun.com/bugreport/sun.cpu.endian=littlesun.io.unicode.encoding=UnicodeLittlesun.desktop=windowssun.cpu.isalist=pentium_pro+mmx pentium_pro pentium+m...

以上是用System列出了本机的全部环境属性,在上面的属性中有两点需要注意

(1)文件默认编码:  file.encoding = GBK

(2)文件分割符:  file.separate=\

 

 

2,日期操作类

在Java中,对于日期的操作提供了良好的支持,主要使用java.util包中的Date,Calendar以及java.text包中的SimpleDateFormat,下面是关于日期操作类,我整理的一些知识点

(1) Date类

Date类是一个比较简单的日期类,其只要使用它默认的构造方法就能得到一个完整的时间,
 

package cn.wjd.system;import java.util.Date;public class DateDemo02 {    public static void main(String[] args) {        Date date = new Date();        System.out.println(date);//Wed Jul 23 13:53:52 CST 2014    }}

从上面的代码已经得到了当前系统的准确时间,但是这个格式不符合我们日常所看到的日期格式,所以需要按照用户自己的格式来显示时间的话,就比较使用到Calendar类完成操作

(2)Calendar类

该类是个抽象类,它可以将取得的时间精确到毫秒,该类中有一个方法,可以得到该类的一个对象

1

package cn.wjd.system;import java.util.Calendar;public class CalendarDemo {    public static void main(String[] args) {        Calendar c = Calendar.getInstance();        int year = c.get(Calendar.YEAR);        int month = c.get(Calendar.MONTH)+1;        int day = c.get(Calendar.DAY_OF_MONTH);        int week = c.get(Calendar.DAY_OF_WEEK);        System.out.println(week);        System.out.println(year+"年"+month+"月"+day+"日"+getWeek(week));    }    public static String getWeek(int week) {        String[] weeks = {"","星期日","星期1","星期2","星期3","星期4","星期5","星期6"};        return weeks[week];    }}

(3)DateFormat类

该类是用于对时间进行格式化的,将其变为更符合于中国人习惯的日期格式,该类也是一个抽象类,不过提供了一个静态的方法,可以直接获取本类的实例

DateFormat类和MessageFormat类都是属于Format类的子类,它们都是专门用于格式化数据使用的.

package cn.wjd.system;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class DateDemo {    public static void main(String[] args) throws ParseException {        // methodDemo_1();        methodDemo_2();        //methodDemo_3();    }/* * 将日期格式的字符串-->日期对象 * 使用的是DateFormat中的parse方法 */    public static void methodDemo_3() throws ParseException {        String str_date = "2013-11-11";        DateFormat dateFormat = DateFormat.getDateInstance();        Date date = dateFormat.parse(str_date);        System.out.println(date);    }     /*     * 对日期对象进行格式化      * 将日期对象MM>日期对象 可以通过date中的构造函数完成 通过setTime设置     * 可以通过Date对象中的方法对日期中的字段(年,月,日等)进行操作 2日期对象-->毫秒值 getTime方法     * 可以通过毫秒值,通过具体的数值进行计算     */    private static void methodDemo_1() {        long time = System.currentTimeMillis();        System.out.println(time);// 1404527032257        Date date = new Date();// 当前的日期和时间封装成对象        System.out.println(date);// Sat Jul 05 10:25:13 CST 2014        Date date2 = new Date(1404527032257l);// 将指定的毫秒值封装成对象        System.out.println(date2);    }}

(4)SimpleDateFormat类

该类的作用是将一个日期格式转换成另一个日期格式,它不是抽象类,可以实例化

package cn.wjd.system;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class SimpleDateDemo {    public static void main(String[] args) throws ParseException {        String strDate = "2009-1-2 11:11:11";        String part1 = "yyyy-MM-dd HH:mm:ss";        String part2 = "yyyy年MM月dd日 HH时mm分ss秒";        SimpleDateFormat sdf1 = new SimpleDateFormat(part1);        SimpleDateFormat sdf2 = new SimpleDateFormat(part2);        Date d = new Date();        d = sdf1.parse(strDate);  //将给定字符串中的日期提取出来        String newDate = sdf2.format(d);//将日期变成新的格式        System.out.println(newDate);    }}

在以上代码中,首先先使用第一个模板,将字符串中的日期数字取出,然后再使用第二个模板将这些日期数字转化成新的格式来表示

在SimpleDateFormat类经常用于将String变成Date型的数据

在实际的开发中,用户所输入的各个数据都是以String的方式接受的,所以此时为了可以正确的将String变为Date型数据,可以依靠SimpleDateFormat来完成

package cn.wjd.system;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class SimpleDateFormatDemo {    public static void main(String[] args) throws ParseException {        String str = "2011-11-11 11:11:11";        String part ="yyyy-MM-dd HH:mm:ss";        SimpleDateFormat sdf = new SimpleDateFormat(part);        Date d = sdf.parse(str);        System.out.println(d);//Fri Nov 11 11:11:11 CST 2011    }}

以上代码就实现了将一个String类型的日期变成了Date类型的数据,这个我猜想在以后的数据库中会经常使用到的吧