Java异常 Java常用库类

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

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);

    }

}
-- listing properties --

java.runtime.name=Java(TM) SE Runtime Environment

sun.boot.library.path=D:\jdk\jdk1.7.0_45\jre\bin

java.vm.version=24.45-b08

java.vm.vendor=Oracle Corporation

java.vendor.url=http://java.oracle.com/

path.separator=;

java.vm.name=Java HotSpot(TM) Client VM

file.encoding.pkg=sun.io

user.script=

user.country=CN

sun.java.launcher=SUN_STANDARD

sun.os.patch.level=Service Pack 1

java.vm.specification.name=Java Virtual Machine Specification

user.dir=D:\workspace\OtherApi

java.runtime.version=1.7.0_45-b18

java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment

java.endorsed.dirs=D:\jdk\jdk1.7.0_45\jre\lib\endorsed

os.arch=x86

java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\

line.separator=



java.vm.specification.vendor=Oracle Corporation

user.variant=

os.name=Windows 7

sun.jnu.encoding=GBK

java.library.path=D:\jdk\jdk1.7.0_45\bin;C:\Windows\Sun...

java.specification.name=Java Platform API Specification

java.class.version=51.0

sun.management.compiler=HotSpot Client Compiler

os.version=6.1

user.home=C:\Users\Administrator

user.timezone=

java.awt.printerjob=sun.awt.windows.WPrinterJob

file.encoding=GBK

java.specification.version=1.7

user.name=Administrator

java.class.path=D:\workspace\OtherApi\bin

java.vm.specification.version=1.7

sun.arch.data.model=32

java.home=D:\jdk\jdk1.7.0_45\jre

sun.java.command=cn.wjd.system.SystemDemo2

java.specification.vendor=Oracle Corporation

user.language=zh

awt.toolkit=sun.awt.windows.WToolkit

java.vm.info=mixed mode, sharing

java.version=1.7.0_45

java.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 Corporation

file.separator=\

java.vendor.url.bug=http://bugreport.sun.com/bugreport/

sun.cpu.endian=little

sun.io.unicode.encoding=UnicodeLittle

sun.desktop=windows

sun.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);

    }

 

    /*

     * 对日期对象进行格式化 

     * 将日期对象-->日期格式的字符串,使用的是DateFormat中的format方法

     */

    private static void methodDemo_2() {

        Date date = new Date();

        // 获取日期格式对象 Full LONG等指定风格的

        DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);

        // 获取日期加时间

        // dateFormat = dateFormat.getDateTimeInstance();



        // 自定义风格

        dateFormat = new SimpleDateFormat("yyyy--MM--dd");

        String str_date = dateFormat.format(date);

        System.out.println(str_date);

    }



    /*

     * 日期对象和毫秒值之间的传唤 1,毫秒值-->日期对象 可以通过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类型的数据,这个我猜想在以后的数据库中会经常使用到的吧

你可能感兴趣的:(JAVA异常)