zoukankan      html  css  js  c++  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);
        }
    }
    -- 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类型的数据,这个我猜想在以后的数据库中会经常使用到的吧

  • 相关阅读:
    Linux makefile 教程 很具体,且易懂
    Java串口通信具体解释
    今年股票注定有一波行情(重申6月10号的观点)
    hotmail邮箱pop3server设置方法
    html的下拉框的几个基本使用方法
    第1次实验——NPC问题(回溯算法、聚类分析)
    【甘道夫】Hive 0.13.1 on Hadoop2.2.0 + Oracle10g部署详细解释
    C该程序生成一个唯一的序列号
    高速分拣(1)的基本算法
    Eclipse项目崩溃,使用MyEclipse解决
  • 原文地址:https://www.cnblogs.com/driverwjd/p/3862982.html
Copyright © 2011-2022 走看看