1.练习回顾
①ICourse接口
public interface ICourse {
String skill();
}
②课程类:
public class JavaCourse implements ICourse{
@Override
public String skill() {
return "学习了Java课程\n能够使用Java开发DVD管理系统";
}
}
public class HtmlCourse implements ICourse{
@Override
public String skill() {
return "学习了HTML\n能够使用HTML开发网上花店";
}
}
public class CsharpCourse implements ICourse{
@Override
public String skill() {
return "学习了C#\n能够使用C#开发KTV系统";
}
}
③学生类:
public class Student {
String name;
public Student(String name) {
this.name = name;
}
public void study(ICourse course){
System.out.println(this.name+course.skill());
}
}
④测试类
public class Test {
public static void main(String[] args) {
JavaCourse java =new JavaCourse();
HtmlCourse html = new HtmlCourse();
CsharpCourse csharp =new CsharpCourse();
Student s = new Student("王五");
s.study(java);
s.study(html);
s.study(csharp);
}
}
2.异常
2.1 什么是异常
生产生活中:出现的意外情况;
程序中:在代码编译或运行过程中,程序出现错误,导致程序不能正常执行。
2.2 处理异常的目的
程序一旦发生异常,会导致程序中途退出(程序崩溃),所以需要进行处理,处理之后,让程序正常执行。
2.3 异常分类
Throwable中的方法:
printStackTrace():打印异常的堆栈信息,追根溯源;
getMessage():获取异常的详细信息。
Error异常一般是jvm发生的错误,表示严重的问题,通过代码无法处理,一般不应该试图去捕获。
Exception:异常
编译时异常: 可以预测的,检查异常,需要进行强制的异常处理或者抛出。ParseException(数据转换异常)
运行时异常: 在运行过程中发生的异常,不作强制处理要求,非检查异常。常见的异常:InputMismatchException(输入不匹配异常)ArithmeticException(数学运算异常)ArrayIndexOutOfBoundsException(数组下标越界异常)NullPointerException(空指针异常)NumberFormatException(数据转换格式错误)
2.3 对异常进行处理
异常处理的方式:
①在目标代码上加try..catch,自己做异常处理;
②在代码所在的方法上添加异常抛出声明,让方法的调用者进行异常处理。
2.3.1 捕获异常
① try...catch
应用场景:可能发生异常的代码
try{// 可能发生异常的代码}catch( 异常类型 对象 ){处理异常}
② try...catch...finally
应用场景:存在必须执行的代码(释放资源的代码)
(finally块中的代码,无论代码是否出现异常,一定会执行,并且会在return之前运行)
③多重catch
应用场景:需要精确的把控各种异常的处理;
(先捕获细的异常,再捕获粗的异常)
多分支捕获,按从上到下的次序依次匹配,所以细粒度的异常要放到上面,粗粒度的异常要放到下边
④try...finally
发生异常时finally的代码会被执行,但是因为没有catch处理异常,所以程序会崩溃
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a,b;
try{
System.out.println("输入第一个数");
a = scanner.nextInt();
System.out.println("输入第二个数");
b = scanner.nextInt();
int res = a/b;
System.out.println(a+"/"+b+"="+res);
int[] nums = new int[2];
nums[2] = res;
}catch (InputMismatchException ex){
System.out.println("输入出错了!");
System.out.println("错误内容"+ex.getMessage());
ex.printStackTrace();
}catch (ArithmeticException ex){
System.out.println("计算出错了!");
System.out.println("错误内容:"+ex.getMessage());
ex.printStackTrace();
}catch (ArrayIndexOutOfBoundsException ex){
System.out.println("数组出错了!");
System.out.println("错误内容:"+ex.getMessage());
ex.printStackTrace();
}catch (Exception ex){
System.out.println("出错了!");
System.out.println("错误内容:"+ex.getMessage());
ex.printStackTrace();
}finally {
System.out.println("我滴任务完成了!");
}
System.out.println("======程序执行结束=====");
}
}
3.4.2 手动抛出异常
用于个性化(特定的业务需求)的异常处理(学生的性别、年龄输入错误)
①throw:
// 在方法中使用:if( 条件 )throw new Exception("错误消息 ") ;
②throws:
在方法签名后面使用,声明方法可能抛出的异常,一般会配合检查异常(编译时异常)使用
//手动抛出异常,在方法上添加抛出声明,对应方法的调用者要做异常处理
public void setAge(int age) throws AgeException {
if(age<0|| age>100){
//手动抛出异常
//throw new Exception("年龄不是有效值");
throw new AgeException("年龄不是有效值");
}else {
this.age = age;
}
}
2.4.3 自定义异常
//自定义年龄异常
public class AgeException extends Exception{
public AgeException(String message) {
super(message);
}
}
2.5 debug调试模式
①在代码的指定位置设置断点
②用debug方式启动程序,当程序执行到断点处时,会自动停下,此时需要通过手动控制程序的执行
③手动控制程序执行的主要方式:
stepover(步过) : 遇到单行代码,逐行执行,遇到方法不进入stepinto(步入): 遇到单行代码,逐行执行,遇到方法会进入方法内部执行