2017年3月31号 晴 空气质量:优
内容:接口的打印机案例,异常,log4j简述
补充:硕哥在u2讲jdbc时候提到,自定义异常时,如果子类抛出或者处理异常,父类也需要抛出异常。
所以通常在书写父类时会预防性地抛出异常先!
一、接口的打印机案例
老师代码:
1、打印机类:
package cn.bdqn.bean;
import cn.bdqn.dao.InkBox;
import cn.bdqn.dao.Paper;
/**
*
*打印机
*/
public class Printer {
/**
* 打印机具有的属性
* 不能写生 A4 B5 Black Color
* 为什么?
* 如果我们写成了具体的一个!那么用户没有选择的权利!
*
*/
private Paper paper; // 纸张
private InkBox box; // 墨盒
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
public InkBox getBox() {
return box;
}
public void setBox(InkBox box) {
this.box = box;
}
// 打印的方法
public void print() {
System.out.println("使用的纸张是:" + paper.getPage());
System.out.println("墨盒的颜色是:" + box.getColor());
}
}
2、墨盒接口:
package cn.bdqn.dao;
/*
* 墨盒接口
*/
public interface InkBox {
// 得到具体的颜色
String getColor();
}
3、纸张接口:
package cn.bdqn.dao;
/*
* 纸张接口
*/
public interface Paper {
// 得到具体的纸张
String getPage();
}
4、A4纸类:
package cn.bdqn.dao.impl;
//A4纸
import cn.bdqn.dao.Paper;
public class A4 implements Paper {
@Override
public String getPage() {
return "A4";
}
}
5、B5纸类:
package cn.bdqn.dao.impl;
//B5纸
import cn.bdqn.dao.Paper;
public class B5 implements Paper {
@Override
public String getPage() {
return "B5";
}
}
6、黑白墨盒类:
package cn.bdqn.dao.impl;
//黑白墨盒
import cn.bdqn.dao.InkBox;
public class Black implements InkBox {
@Override
public String getColor() {
return "黑白";
}
}
7、彩色墨盒类:
package cn.bdqn.dao.impl;
//彩色墨盒
import cn.bdqn.dao.InkBox;
public class Color implements InkBox {
@Override
public String getColor() {
return "彩色";
}
}
8、测试类:
package cn.bdqn.test;
import cn.bdqn.bean.Printer;
import cn.bdqn.dao.InkBox;
import cn.bdqn.dao.Paper;
import cn.bdqn.dao.impl.A4;
import cn.bdqn.dao.impl.Color;
public class PrinterTest {
/**
*打印机的测试类
*/
public static void main(String[] args) {
/**
* 01.实例化打印机
* 打印机有了?
* 纸张??墨盒呢???
* 02.实例化对应的纸张和墨盒
*/
Paper paper = new A4();
InkBox box = new Color();
Printer printer = new Printer();
// 给我们的纸张和墨盒 赋值 不赋值 必须空指针异常 NullPointException
printer.setBox(box);
printer.setPaper(paper);
// 打印的时候需要 纸张和墨盒
printer.print();
}
}
二、异常讲解(1)Demo(try,catch,finally):
老师代码:
package cn.bdqn.test;
/**
* 异常讲解(1)
*/
import java.util.InputMismatchException;
import java.util.Scanner;
public class ExceptionTest {
/**
* 生活中的异常:---》摔跤
* 下楼梯的时候,我也不想摔跤,但是确实摔了!
* 然后呢??难道后半辈子就不过了??
* 之后的生活肯定还得继续!!!
*
* 程序中的异常 : 在程序运行期间,发生了不正常的事件(代码的问题),中断了程序执行!
* 从出现异常的地方,之后的代码都不会执行!
* 显然不符合我们的需求!
* 我们的需求---》继续执行后续的代码!
* 怎么执行后续的代码?
* 使用异常处理机制:
* 给程序提供了一种处理错误的能力! 出现异常之后,程序还能运行!
*
*
* int num = 5.0; 这行代码不能编译成功! 5.0是double类型 不能自动转换成int
* Type mismatch: cannot convert from double to int
* 这时候出现的问题,我们称之为 编译时异常!
*
*
*
* 异常处理机制中:常用的五个关键字!
* 1.try:
01.把可能会出现异常的代码块 放在try中 程序就可以继续执行
02.try不可以单独使用!必须和catch/finally 联合使用
03.try代码块中声明的变量,仅限于本代码块中!
* 2.catch:
* 01.捕捉try代码块中出现的异常信息
* 02.如果在catch的参数中写的是具体的某个异常
* 那么catch块只能捕获这一个具体的异常
* 03.如果想同时捕捉多个异常,我们可以书写多个catch代码块
* 04.多个catch并存的时候!有书写顺序! 类型必须是 由小到大!
* 父类异常只能放在最后!
* 3.finally:
* 01.无论如何都要执行的代码块
* 02.System.exit(0); 正常退出
* 如果参数是非0!代表异常退出!
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
System.out.println("请您输入第一个数字:");
int num1 = scanner.nextInt();
System.out.println("请您输入第二个数字:");
int num2 = scanner.nextInt();
/**
*java.lang.ArithmeticException: / by zero 算术异常
*/
System.out.println("两个数字的商是:" + (num1 / num2));
} catch (ArithmeticException e) {
System.out.println("除数不能为0!");
System.exit(0); // 正常退出
} catch (InputMismatchException e) {
System.out.println("亲!输入格式有误!");
} catch (Exception e) {
e.printStackTrace(); // 打印出捕获到的异常信息
} finally {
System.out.println("这是finally代码块!");
}
System.out.println("程序结束");
}
}
三、异常讲解(2)Demo(throw,throws):
老师代码:
package cn.bdqn.bean;
/**
* 异常讲解(2)
*
*4.throw
* 01.抛出异常
* 02.必须位于方法体内
* 03.只能抛出一个异常
*5.throws
* 01.声明异常 出现在声明方法的后边(参数列表之后)
* 02.可以有N个
* 03.多个异常之间使用,隔开
*
*/
public class Student {
private String name; // 姓名
private String sex; // 性别
private int age; // 年龄
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
/**
* 如果年龄不在0-150之间 我们就抛出异常
* @param age 用户传递过来的参数
* @throws Exception 声明的异常
* 01.声明的异常类 必须是抛出的异常类 或者其父类
* 02.小例子:
* 比如说,我们去买一辆自行车!
* 本身整个车都有问题,然后卖家说 之后车轮有毛病! 不行!
* 本身车轮有毛病! 卖家说车有毛病! 行!
* 整个车以及车轮 我们理解成 抛出异常!
* 卖家说的 都是 声明的异常!
*
* 03.别人都给我们说有毛病了!
* 然后我们必须去解决这个问题!
*/
public void setAge(int age) throws Exception {
if (age < 0 || age > 150) {
// 抛出异常
throw new Exception("年龄不合法!");
}
this.age = age;
}
public Student(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
public Student() {
super();
}
// 测试方法
public static void main(String[] args) {
// 创建学生对象
Student stu = new Student();
// 给对象的 属性赋值
try {
stu.setAge(-100);// 不健康的输入
} catch (Exception e) {
e.printStackTrace();
}
/**
* 对于我们调用的方法 有异常需要处理!
* 两种方式:
* 01.我们自己使用异常处理机制解决
* 02.继续抛出异常,最后是交给了JVM来处理!
*/
}
}
四、自定义异常类
老师代码:
1)学生的实体类:
package cn.bdqn.exception;
/**
*学生的实体类
*
*/
public class Student {
private String name; // 姓名
private String sex; // 性别
private int age; // 年龄
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
/**
* 性别只能是男和女
* @param sex 性别
* @throws StudentException
*/
public void setSex(String sex) throws StudentException {
if (sex.equals("男") || sex.equals("女")) {
this.sex = sex;
} else {
throw new StudentException("性别输入异常!");
}
}
public int getAge() {
return age;
}
/**
* 使用我们自定义的异常类 来处理
* @throws StudentException
*/
public void setAge(int age) throws StudentException {
if (age < 0 || age > 150) {
throw new StudentException("年龄异常!");
}
}
public Student(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
public Student() {
super();
}
// 测试方法
public static void main(String[] args) {
// 创建学生对象
Student stu = new Student();
try {
stu.setAge(-90);
stu.setSex("小人");
} catch (StudentException e) {
e.printStackTrace();
}
}
}
2)自定义异常类:
package cn.bdqn.exception;
/**
* 自定义异常类 ----》针对于Student
* 01.继承RunTimeException
* 02.继承Exception
* 03.继承Throwable
*/
public class StudentException extends Exception {
// 给用户一个提示信息
public StudentException(String msg) {
super(msg);
}
public StudentException() {
}
}
五、关于异常的一道面试题
老师代码:
package cn.bdqn.exam;
public class ExceptionTest {
/**
* 面试题:
* 存在return的时候,finally的执行顺序!
* 01.首先会执行finally中的代码块
* 02.执行完毕之后再去执行return
*
*
* 想把某段代码块进行 try catch:快捷键
* 01.选中需要捕获的代码块
* 02.shift +alt +z
*
*/
public static void main(String[] args) {
try {
System.out.println(111);
System.out.println(222);
System.out.println(333);
return;
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("finally代码块!");
}
System.out.println("程序结束");
}
}
六、简述log4j:
log4j--log for java(java的日志)
配置:
第一步:
第二步:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} %C.%l%m%n
七、常见异常类型(图解)背下来!
八、作业
1、多看视频(下周开始讲高级了)
2、做题
九、考试
2017.03.31
15: 02开始,15:47结束;答题时间:43分钟;检查时间:2分钟;
成绩:86 分
封装继承多态这部分还是比较吃力,回去总结错题,把相关不牢固的知识点真正的弄懂,不能似是而非。
最近题目练习的少,要多做题,做错题,找做题感觉。
十、老师辛苦了!