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类
该类是个抽象类,它可以将取得的时间精确到毫秒,该类中有一个方法,可以得到该类的一个对象
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类型的数据,这个我猜想在以后的数据库中会经常使用到的吧
来源:https://www.cnblogs.com/driverwjd/p/3862982.html
