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();
}
}
}