JavaBeanUserArray异常处理的方式1. 在异常发生前处理2. 在异常发生后处理throw,throws关键字自定义异常总结1.对Java异常的认识2.异常的处理3.自定义异常补充:try后面有多个catch块的简化语法
JavaBean
在java中的含义:
1.JavaBean又被称为Java豆,它是Java着门语言的精灵形象;
2.JavaBean是SUN公司在Java技术白皮书中定义的一种书写规范,满足这种规范的类就被叫做标准Java类,或者POJO
"Plain and old Java Object",程序员喜欢叫JavaBean,设计人员喜欢叫做POJO
必须掌握的JavaBean规范有三条:
1.必须要有公共无参构造;
2.必须要为提供私有属性提供“符合命名规范的”get/set方法
2.1 很多框架是根据配置的属性名去寻找对应的get/set方法,所以给属性起名时候,属性名首个单词一定要小写,免得给自己找麻烦。
2.2 “whitepaper”在Java发展历程当中是变化的,06年的时候Java白皮书把boolean类型的属性的get方法改成了is方法。很多已有框架在实现的时候就必须改动他们的处理方式,需要增加对boolean类型的特殊处理,有些框架改了有些框架没有改。
3.应该实现Serializable接口(会在I/O流中学习)
private boolean gender; public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender;
UserArray
为什么要设计一个UserArray?
因为在程序中,我们可能会去操作大量的UserBean对象,而作为批量操作的实现,我们目前只学过数组。
但是数组作为一种古老且原始的集合,它有三个特点(三个缺点):
- 1.只能存放同一数据类型的数据; -- 可以利用多态解决
- 2.空间大小一旦确定不能修改; --利用封装的手段来实现
- 3.所有元素是连续内存地址空间存放。
小知识:
抛异常的妙用:跳到指定层的循环
异常处理的方式
1. 在异常发生前处理
运行时异常基本上都可以在发生前进行处理,比如增加if判断,再比如用字符串常量.equals(字符串变量);
2. 在异常发生后处理
分两种情况:
1、自己处理
try - catch - finally
2、把异常跑出去给调用者处理
2-1、JVM产生的异常如果我们不用try-catch去处理,那么它自己就会一层一层的往上抛;
2-2、但在有些情况下,虚拟机不会在语法上产生异常,而是我们的业务逻辑发现这是一个异常,那么我们可以自己产生异常对象。
异常类 --- 先人已经定义好了的;
new语法 --- 我们已经学过用过了的。
所以,我们只需要new 异常类()就可以产生异常对象了。但是自己new出来的异常对象,仅仅存在于内存中,不会纳入抛出机制。所以,我们需要配合一个关键字 throw。
总结异常处理
事前处理 --- 基本上运行时异常都应该事情处理。
事后处理 --- 编译时异常
try-catch-finally 异常产生的职责在本方法自己身上;
throw throws 异常产生的职责不在自己身上而是在本方法的调用者身上。
public static void test(String name) throws FileNotFoundException{ FileInputStream fin = new FileInputStream(name); }
throw,throws关键字
throw在方法内部作为一条指令,主动的抛出一个异常对象。
它代表场景就是发生了异常,但是从职责上来说,不归当前方法处理,而应该交给当前方法的调用者完成处理。
对于异常来说,有两种类型,运行时异常和编译时异常
当在一个方法里面throw了一个运行时异常的时候,编译器是不会在编译期检查的;
当在一个方法里面throw了一个编译时异常的时候,编译器就有责任在编译期警告调用者,调用这个方法可能发生异常,所以在语法上会要求在这个方法的声明处加一个throws,这样编译器在编译调用处代码的时候就知道需要报错"此处有未处理异常错误Unhandled exception";
public class TestMain { public static void main(String[] args) { try { test(6); } catch (IOException e) { throw new RuntimeException(e); } catch (SQLException e) { throw new RuntimeException(e); } } public static void test (int num) throws IOException, SQLException { if(num>5){ throw new IOException(); } else if (num>3) { throw new SQLException(); } } }
区别与关联:
1.两者书写的位置不同,throw写在方法内部的一条执行语句;throws是写在方法声明末尾的。
2.throw后面跟的是一个异常对象,这句代码一旦在运行期被执行,那么就真的会有一个异常对象被抛出;throws后面跟的不是异常对象,而是异常的类名,而且可以跟多个类名。它是编译期的时候告诉编译器本方法有可能出现某几种异常,要求调用者现在就用代码进行处理。(这不是语法错误,也不是真的发生异常,而是提醒你检查一下参数对不对,如果你能确保你的传参是正确的,那么就用一个trycatch括起来让编译通过即可)
3.两者关联:如果方法中有throw语句,且后面跟的是一个编译时异常的话,那么编译器会强制要求在该方法的声明处加throws。而如果跟的是一个运行时异常对象,那么就不会在编译期要求加throws
面试题:写了throw就一定要写throws吗?
当前的学习要求:
几乎很少写throws,因为目前我们主要是API的调用者。但是在调用的api中,经常会遇到别人设计的throws
throws的出现,才最终学完了一个完整的方法声明。
修饰符 返回类型 方法名(参数列表) throws 异常类1,异常类2......
面试题1:以下正确的main方法是?
老师可以讲一下为什么main方法传参是传一个string类型的数组吗
标准写法:public static void main(String[] args) 变形1: static public void main(String[] args) 修饰符分为:访问修饰符(public protected private) 可选修饰符:(abstract final static default) 所有修饰符都要写在最前面,但他们直接的顺序可以是任意的。 变形2: public static void main(String... args) //可变参数 public void test(int... num){ //这里的num仍然是一个数组,但是调用者不用传一个数组了 //比如main方法里面可以写 test(2,4,6,8,10); test()无参也可以 这个时候形参num会是一个长度为0的数组 Java设计的新语法,针对的是如果用数组做参数,那么可以简化传参的代码 变形3:public static void main(String args[]) 在老的C语法中,数组声明的语法是int num[],Java希望所有变量声明的语法都是同一的,即先写数据类型,再写变量名。 变形4:public static void main(String[] fuck) 形参的名字对于编译器来说是可以任意取的。 变形5:public static void main(String[] args) throws Exception 方法声明可以加throws表示本方法可能会发生某种或某几种异常。 变形6:把以上5种变形进行混合 }
面试题2:方法重写的规范
- 方法名必须一致
- 返回类型必须一致
- 参数列表必须一致
- 父类的访问修饰符不能比子类的小(子类重写后的方法的访问修饰符不能比父类重写前的小)
- (学完throws后)子类重写后的方法不能比父类重写前的方法throws更多的异常(子类可以不抛出任何异常)。这里的更多不是指抛出异常的数目,而是指范围(异常类是有继承关系的,父类异常表示的范围大于子类异常)。
自定义异常
/* 自定义异常 1.必须要让自定义异常类继承throwable 或 Exception 否则它是没有办法通过throw关键字纳入到java的异常机制中的。 */ public class LovoException extends Exception{ /* 2.带入异常的信息,所以通常都会再定义异常的带参构造 */ //默认的无参构造 public LovoException(){ } //传入自定义异常信息的构造方法 public LovoException(String msg){ //调用父类的exception 会一步步传到throwable的带参构造 super(msg); } //根据一个已有的异常对象,构造我们自己的异常对象(以后会讲) public LovoException(Exception ex){ super(ex); } /* 还可以给它添加自己的行为。 比如说:写日志的行为 */ public void writeLog(){ System.out.println("把异常信息写到文件中去"); } public static void main(String[] args) { try { throw new LovoException("工资不能为负"); } catch (LovoException e) { //throw new RuntimeException(e); e.printStackTrace(); } } }
总结
1.对Java异常的认识
理论:
1.异常不等于错误,更不等于语法报错
2.异常的分类
Throwable
Exception 和 error
Exception之下又分 编译时异常和 运行时异常RuntimeException及其子类
编译时异常 和 运行时异常的区别
3.异常的传播机制
如果不处理,会一层层传播,main也不处理会交给JVM,JVM会中断程序。
2.异常的处理
看异常:异常类类名,异常发生的位置(从上往下看第一行自己写的代码)
解决异常:运行时异常:修改代码,让异常不发生;编译时异常:try-catch或throw/throws,具体用哪个需要看造成这个异常的职责是本方法的还是本方法的调用者。如果是本方法的,那就自己try-catch,如果是调用者的,就抛给他处理。
try-catch-finally的语法细节
throw throws的细节
3.自定义异常
了解即可,留待以后详细学习
补充:try后面有多个catch块的简化语法
try { } catch () { //异常1 } catch () { //异常2 } catch () { //异常3 } ; //如果1,2,3没有继承关系且语句内内容一样 可以简写 try { } catch (异常1 | 异常2 |异常3) { // };