黑马程序员_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 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\Templine.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类

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

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类型的数据,这个我猜想在以后的数据库中会经常使用到的吧

黑马程序员_Java异常 Java常用库类,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。