Java初学几天的总结——一个菜鸡的自我学习之路(8)

MVC设计模式

用JTable类可以以表格的形式显示和编辑数据。JTable类的对象并不存储数据,它只是数据的表现。

MVC:

数据、表现和控制三者分离,各负其值
M:Model(模型)
V:View(表现)
C:Control(控制)
模型:保存和维护数据,提供接口让外部修改数据,通知表现需要刷新
表现:从模型获得数据,根据数据画出表现
控制:从用户地得到输入,根据输入调整数据

具体的关系图如下所示
在这里插入图片描述

最重要的一点是控制和表现之间是没有任何关系的

这样可以保证表现的功能很单纯

捕捉异常
样例代码

try{
    //可能产生异常的代码
}catch(Type1 id1){
    //处理Type1异常的代码
}catch(Type2 id2){
    //处理Type1异常的代码
}catch(Type3 id3){
    //处理Type1异常的代码
}

例子:

public static void f(){
    int [] a = new int[10];
    a[10] = 10;
    System.out.println("hello");
}

public static void g(){
    f();
}

public static void h(){
    int i = 10;
    if(i<100){
        g();
    }
}

public static void k(){
    try{
        h();
    }catch( NullPointerException e){
        System.out.println("k()");
    }
}

public static void main(String[] args){
    try{
        k();
    }catch(ArrayIndexOutOfBoundsException e){
        System.out.println("caught");
    }
    System.out.println("main");
}

我们可以根据这张图来判断执行顺序
在这里插入图片描述
首先判断f函数中的异常部分,不在try中间,而是在函数中间,退回到调用该函数的上一级:g函数,g函数中间不在try中间而是在函数中间,退回到调用该函数的上一级:h函数的if判断语句中,此处不在try中间也不在函数中间,退回到上一级:int=10,该部分不在try中间而是在函数中间,退回上一级:k函数中,在try中间但是没有与之匹配的catch,退回到上一级:k函数中,不在try语句中在函数中,退回到调用的上一级:main函数,main函数中有try,并且有匹配的catch,所以继续下面的语句。

捕捉到异常后

String getMessage();//返回异常的数据的值
String toString();返回出现异常数据类型和值
void printStackTrace();//追踪每一次异常被调用出现的地点
但是肯定是回不去了,而具体的处理逻辑则取决于你的业务逻辑需要

再度抛出

catch(Exception e){
    System.err.println("An exception was thrown");
    throw e;
}

如果在这个层面上需要处理,但是不能做最终决定

那么就要说到异常的抛出和声明

class OpenException extends Throwable {

}
class CloseException extends Throwable {

}

public class ArrayIndex {
    public static int open() {
        return -1;
    }
    public static void readFile() throws OpenException, CloseException {
        if ( open() == -1 ) {
            throw new OpenException();
        }
    }
    public static void main(String [] args) {
        try {
            readFile();
        }catch( OpenException e ) {
            e.printStackTrace();
       }catch( CloseException e ) {
            e.printStackTrace();
       }
    }
}

异常声明

如果你的函数可能抛出异常,就必须在函数头部加以声明
    void f() throws TooBig, TooSmall, DivZero { //……
    void f() {……

你可以声明并不会真的抛出异常

什么能扔?

任何继承了Throwable类的对象
Exception类继承了Throwable
throw new Exception();
throw new Exception("HELP");

catch怎么匹配异常的
Is-A的关系
就是说,抛出子类异常会被捕捉父类异常的catch给捉到

捕捉任何异常

catch( Exception e ) {
    System.out.println("Caught an exception");
}

运行时刻异常

像ArrayIndexOutOfBoundsException这样的异常时不需要声明的
但是如果没有适当的机制来捕捉,就会最终导致程序终止

异常声明

如果你调用一个声明会抛出异常的函数,那么你必须:
把函数的调用放在try块中,并设置catch来捕捉所有可能抛出的异常;或
声明自己会抛出无法处理的异常

异常声明遇到继承关系

当覆盖一个函数的时候,子类不能声明抛出比父类的版本更多的异常
在子类的构造函数中,必须声明父类可能抛出的全部异常
class OpenException extends Throwable {}
class CloseException extends Throwable {}
class NewException extends Exception {}

public class ArrayIndex {
    public ArrayIndex() throws OpenException {}
    public void f() throws OpenException {}
    public static void main(String [] args) {
    }
}

class NewClass extends ArrayIndex {
    public NewClass() throws OpenException, NewException {}
    public void f() {}
    public static void main (String[] args) {
        try {
            ArrayIndex p = new NewClass();
            p.f();
        }catch (OpenException e) {
            e.printStackTrace();
        }catch (NewException e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值