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