Java之异常处理,日期处理
Java异常处理
异常:异常就是Java程序在运行过程中出现的错误。
异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象。其实就是Java对不正常情况进行描述后的对象体现。
异常分类图解:
Throwable
1--Error 严重问题,我们不处理。
2--Exception
(1)--RuntimeException 运行期异常,我们需要修正代码
(2)--非RuntimeException 编译期异常,必须处理的,否则程序编译不通过
Java虚拟机默认处理
public class ExceptionTest1 { public static void main(String[] args) { int a=10; int b=0; System.out.println(a/b); System.out.println("通过!"); } }
这是一个除数为0造成的典型的运行异常
这是Java虚拟机默认的处理,将异常的名称,原因,出现的问题输出在控制台
同时也中断程序
自己处理异常
try...catch...finally
自己编写处理代码,后面的程序可以继续执行
throws
抛出,把自己处理不了的,在方法上声明,告诉调用者,这里有问题
注意:try里面的代码越少越好
将问题包在try中,程序可以运行,但是catch里必须有代码,不然只能是隐藏问题而不是处理异常
public class ExceptionTest1 { public static void main(String[] args) { int a=10; int b=0; try{ System.out.println(a/b); }catch(ArithmeticException Ex){ System.out.println("异常!除数不能为0"); } System.out.println("通过!"); } }
//多个异常的情况 public class ExceptionTest1 { public static void main(String[] args) { int a=10; int b=0; int i[]={0,1,2}; try{ System.out.println(i[3]); System.out.println(a/b); }catch(ArithmeticException Ex){ System.out.println("异常!除数不能为0"); }catch(ArrayIndexOutOfBoundsException Ex){ System.out.println("异常!访问无效!"); } System.out.println("通过!"); } }
我们可以看到并没有输出第一个catch中的异常处理语句,这是因为一旦try 里出了问题就会把这个异常抛出去到 catch 中匹配异常,匹配到之后执行 catch 里的语句,然后结束 try...catch 在执行下面的语句
public class ExceptionTest1 { public static void main(String[] args) { int a=10; int b=0; int i[]={0,1,2}; try{ System.out.println(i[3]); System.out.println(a/b); System.out.println("未知的异常!"); }catch(ArithmeticException Ex){ System.out.println("异常!除数不能为0"); }catch(ArrayIndexOutOfBoundsException Ex){ System.out.println("异常!访问无效!"); }catch(Exception Ex){//Exception可以匹配所有的异常类型 System.out.println("异常!未知!"); } System.out.println("通过!"); } }
在catch()中我们应该写异常类型,能明确的尽量明确以节约资源,不能明确的也可以写 Exception
注意:Exception 可以匹配所有异常,所有不能写在前面,否则后面的无效,所以,平级关系的异常前后顺序无所谓,父子关系的异常父类必须在后面。
try...catch...finally的格式变形
* A:try...catch...finally
* B:try...catch
* C:try...catch...catch...
* D:try...catch...catch...finally
* E:try...finally 这种做法的目前是为了释放资源。
JDK7的新特性,可以再catch中将多个异常用 | 隔开
public class ExceptionTest1 { public static void main(String[] args) { int a=10; int b=0; int i[]={0,1,2}; try{ System.out.println(i[3]); System.out.println(a/b); System.out.println("未知的异常!"); }catch(ArithmeticException | ArrayIndexOutOfBoundsException Ex){ System.out.println("异常!"); } System.out.println("通过!"); } }
这种方法的局限性,只能给出一个解决方案,多个异常要是平级关系
编译期异常和运行期异常的区别?
编译期异常 必须要处理的,否则编译不通过
运行期异常 可以不处理,也可以处理
Throwable类的常见方法
getMessage
public String getMessage()
- 返回此 throwable 的详细消息字符串。
- 返回:
- 此 Throwable 实例(可以为 null)的详细消息字符串。
toString
public String toString()
- 返回此 throwable 的简短描述。如果此
Throwable
对象是利用非空详细消息字符串创建的,则结果是三个字符串的串联:
- 此对象的实际类的名称
- ": "(冒号和空格)
- 此对象的
getMessage()
方法的结果如果此
Throwable
对象利用 null 详细消息字符串创建,则返回此对象的实际类的名称。
- 返回:
- 该 throwable 的字符串表示形式。
printStackTrace
public void printStackTrace()
- 将此 throwable 及其追踪输出至标准错误流。此方法将此
Throwable
对象的堆栈跟踪输出至错误输出流,作为字段System.err
的值。输出的第一行包含此对象的toString()
方法的结果。剩余行表示以前由方法fillInStackTrace()
记录的数据。此信息的格式取决于实现,但以下示例是最常见的:java.lang.NullPointerException at MyClass.mash(MyClass.java:9) at MyClass.crunch(MyClass.java:6) at MyClass.main(MyClass.java:3)本示例通过运行以下程序生成:
class MyClass { public static void main(String[] args) { crunch(null); } static void crunch(int[] a) { mash(a); } static void mash(int[] b) { System.out.println(b[0]); } }对于带初始化非空 cause 的 throwable 的追踪,通常应该包括 cause 的追踪。此信息的格式取决于实现,但以下示例是最常见的:
HighLevelException: MidLevelException: LowLevelException at Junk.a(Junk.java:13) at Junk.main(Junk.java:4) Caused by: MidLevelException: LowLevelException at Junk.c(Junk.java:23) at Junk.b(Junk.java:17) at Junk.a(Junk.java:11) ... 1 more Caused by: LowLevelException at Junk.e(Junk.java:30) at Junk.d(Junk.java:27) at Junk.c(Junk.java:21) ... 3 more注意,存在包含字符 "..." 的行。这些行指示此异常的椎栈跟踪的其余部分匹配来自异常(由 "enclosing" 异常引起)的堆栈跟踪底部的指定数量的帧。这种简便方法可以大大缩短通常情况下的输出长度,这里抛出了包装的异常,其方法与捕获“作为 cause 的异常”的方法相同。上述示例通过运行以下程序生成:
public class Junk { public static void main(String args[]) { try { a(); } catch(HighLevelException e) { e.printStackTrace(); } } static void a() throws HighLevelException { try { b(); } catch(MidLevelException e) { throw new HighLevelException(e); } } static void b() throws MidLevelException { c(); } static void c() throws MidLevelException { try { d(); } catch(LowLevelException e) { throw new MidLevelException(e); } } static void d() throws LowLevelException { e(); } static void e() throws LowLevelException { throw new LowLevelException(); } } class HighLevelException extends Exception { HighLevelException(Throwable cause) { super(cause); } } class MidLevelException extends Exception { MidLevelException(Throwable cause) { super(cause); } } class LowLevelException extends Exception { }
public class ExceptionTest1 { public static void main(String[] args) { int a=10; int b=0; int i[]={0,1,2}; try{ System.out.println(i[3]); }catch(Exception Ex){ System.out.println(Ex.getMessage()); //异常的消息字符串 System.out.println(Ex.toString()); //异常消息简单描述 Ex.printStackTrace(); //获取异常类名和异常信息,以及异常出现在程序中的未知,void,把信息输出在控制台 } System.out.println("通过!"); } }
throws
定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在方法上标识。
public void show() throws ParseException { String s="2017-07-23"; SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d=sdf.parse(s); System.out.println(sdf.format(d)); }
try { d.show(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); }
注意:编译期异常抛出将来调用者必须处理
运行期异常抛出,将来调用者可以不处理
throws后也可以跟多个异常
throw
在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。这时抛出的应该是异常的对象。
int a=10; int b=0; if(b==0){ throw new ArithmeticException(); }else{ System.out.println(a/b); }
throws和throw的区别
throws
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
总结
如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
区别:
后续程序需要继续运行就try
后续程序不需要继续运行就throws
举例:
感冒了就自己吃点药就好了,try
吃了好几天药都没好结果得了H7N9,那就的得throws到医院
如果医院没有特效药就变成Error了
finally
特点:
被finally控制的语句体一定会执行
特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
作用:用于释放资源
String s="2017-07-23"; SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d=null; try{ d=sdf.parse(s); }catch(ParseException ex){ ex.printStackTrace(); }finally{ System.out.println("!这里的语句一定会执行!"); } System.out.println(d);
常见问题:
final,finally和finalize的区别
final:最终的意思,可以修饰类,成员变量,成员方法
修饰类,类不能被继承
修饰变量,变量是常量
修饰方法,方法不能被重写
finally:是异常处理的一部分,用于释放资源。
一般来说,代码肯定会执行,特殊情况:在执行到finally之前jvm退出了
finalize:是Object类的一个方法,用于垃圾回收
如果catch里面有return语句,finally里面的代码还会执行吗?
如果会,是在return前,还是return后。
会。前。
准确的说,应该是在中间。
public static int getInt() { int a = 10; try { System.out.println(a / 0); a = 20; } catch (ArithmeticException e) { a = 30; return a; /* * return a在程序执行到这一步的时候,这里不是return a而是return 30;这个返回路径就形成了。 *它发现后面还有finally,所以继续执行finally的内容,a=40 * 再次回到以前的返回路径,继续走return 30; */ } finally { a = 40; return a;//如果这样结果就是40了。 } return a; //这里的语句不会执行
自定义异常
Java中定义了很多常见的异常类,但是在实际运行中也需要我们自己定义异常类。
自定义的异常类需要继承自继承自Exception或者RuntimeException,只需要提供无参构造和一个带参构造即可
//自定义异常类 public class MyException extends Exception { public MyException() { } public MyException(String message) { super(message); } }
//老师类 public class Teacher { public void check(int score) throws MyException { if (score > 100 || score < 0) { throw new MyException("分数必须在0-100之间"); } else { System.out.println("分数没有问题"); } } }
//主方法 import java.util.Scanner; public class StudentDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入学生成绩:"); int score = sc.nextInt(); Teacher t = new Teacher(); try { t.check(score); } catch (MyException e) { e.printStackTrace(); } } }
如果继承自RuntimeException
public class Teacher { public void check(int score) throws MyException { //针对MyException继承自RuntimeException public void check(int score) { if (score > 100 || score < 0) { throw new MyException(); } else { System.out.println("分数没有问题"); } } }
public class MyException extends RuntimeException { }
异常的注意
A:父的方法有异常抛出,子的重写方法在抛出异常的时候必须要小于等于父的异常
B:父的方法没有异常抛出,子的重写方法不能有异常抛出
C:父的方法抛出多个异常,子的重写方法必须比父少或者小
Java之异常处理,日期处理的更多相关文章
- Java自学-异常处理 处理
Java的异常处理办法 try catch throws 异常处理常见手段: try catch finally throws 步骤 1 : try catch 1.将可能抛出FileNotFound ...
- Java的异常处理
Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally.JB的在线帮助中对这几个关键字是这样解释的: Throws: Lists the ...
- Java Hour 50 日期类型
Plan List: 1 Java 中的日期类型 2 mysql 相关 3 java code style 鉴于本问题太过普通,所以参考文章满大街都是,因此本文内容基本为转载和验证. java.sql ...
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- java的异常处理机制(try…catch…finally)
1 引子try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话.不信 ...
- JAVA格式化时间日期
JAVA格式化时间日期 import java.util.Date; import java.text.DateFormat; /** * 格式化时间类 * DateFormat.FULL = 0 * ...
- Delphi与Java中的日期互换
在最近做的一个项目中用到了Java和Delphi,发现它们不能正确读取对方的日期类型,如在Java中写入一个值为“2007-12-1”的日期值,通过Delphi读取却不是这个值了.通过查阅资料,发现两 ...
- java的异常处理简介
异常概述 任何一种程序设计语言设计的程序在运行时都有可能出现错误,例如除数为0,数组下标越界,要读写的文件不存在等等. 捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生. 对于这些错误,一 ...
- Java中的日期操作
在日志中常用的记录当前时间及程序运行时长的方法: public void inject(Path urlDir) throws Exception { SimpleDateFormat sdf = n ...
- Java 8 时间日期库的20个使用示例
java 8是如何处理时间及日期的 有人问我学习一个新库的最佳途径是什么?我的回答是,就是在实际项目中那样去使用它.在一个真实的项目中会有各种各样的需求,这会促使开发人员去探索和研究这个新库.简言之, ...
随机推荐
- Go从入门到精通(一)go语言初始
一.第一个go程序 package main import ( "fmt" ) func main(){ fmt.Println("hello world") ...
- [原创]adb使用教程v1.0-----by-----使用logcat快速抓取android崩溃日志
原文再续,书接上回:<使用logcat快速抓取android崩溃日志>中提到的工具包可以下载拉~ <使用logcat快速抓取android崩溃日志>:http://www.cn ...
- 用php+mysql+ajax实现淘宝客服或阿里旺旺聊天功能 之 后台页面
在上一篇随笔中,我们已经看了如何实现前台的对话功能:前台我限定了店主只有一人,店铺只有一个,所有比较单一,但后台就不一样了,而后台更像是我们常见的聊天软件:当然,前台也应该实现这种效果,但原理懂了,可 ...
- 文件描述符与FILE
1. 文件描述符(重点) 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创 ...
- JAVA下JSON的类型输出及使用
JSON类型的输出: import java.util.ArrayList; import java.util.HashMap; import net.sf.json.JSONArray; impor ...
- iOS 转场动画探究(二)
这篇文章是接着第一篇写的,要是有同行刚看到的话建议从前面第一篇看,这是第一篇的地址:iOS 转场动画探究(一) 接着上一篇写的内容: 上一篇iOS 转场动画探究(一)我们说到了转场要素的第四点,把那个 ...
- jquery提交form表单插件jquery.form.js
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- shell 中最常使用的 FD (file descriptor)
在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是: 0 是一个文件描述符,表示标准输入(stdin)1 是一个文件描述符,表示标准输出(stdout) ...
- mysql 左连接 右连接 内链接
一般所说的左连接,右连接是指左外连接,右外连接.做个简单的测试你看吧.先说左外连接和右外连接:[TEST1@orcl#16-12月-11] SQL>select * from t1;ID NAM ...
- 【Android Developers Training】 92. 序言:使用同步适配器传输数据
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...