20155331 2016-2017-2 《Java程序设计》第5周学习总结

20155331 2016-2017-2 《Java程序设计》第5周学习总结

教材学习内容总结

一、Java异常的基础知识

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。

Java异常处理通过5个关键字try、catch、throw、throws、finally进行管理。基本过程是用try语句块包住要监视的语句,如果在try语句块内出现异常,则异常会被抛出,你的代码在catch语句块中可以捕获到这个异常并做处理;还有以部分系统生成的异常在Java运行时自动抛出。你也可以通过throws关键字在方法上声明该方法要抛出异常,然后在方法内部通过throw抛出异常对象。finally语句块会在方法执行return之前执行,一般结构如下:

try{

程序代码

}catch(异常类型1 异常的变量名1){

程序代码

}catch(异常类型2 异常的变量名2){

程序代码

}finally{

程序代码

}

Java异常处理机制

对于可能出现异常的代码,有两种处理办法:
第一、在方法中用try...catch语句捕获并处理异常,catach语句可以有多个,用来匹配多个异常。例如:

public void p(int x){

try{

...

}catch(Exception e){

...

}finally{

...

}

}

第二、对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常。例如:

public void test1() throws MyException{

...

if(....){

throw new MyException();

}

}

如果每个方法都是简单的抛出异常,那么在方法调用方法的多层嵌套调用中,Java虚拟机会从出现异常的方法代码块中往回找,直到找到处理该异常的代码块为止。然后将异常交给相应的catch语句处理。如果Java虚拟机追溯到方法调用栈最底部main()方法时,如果仍然没有找到处理异常的代码块,将按照下面的步骤处理:

第一、调用异常的对象的printStackTrace()方法,打印方法调用栈的异常信息。

第二、如果出现异常的线程为主线程,则整个程序运行终止;如果非主线程,则终止该线程,其他线程继续运行。
通过分析思考可以看出,越早处理异常消耗的资源和时间越小,产生影响的范围也越小。因此,不要把自己能处理的异常也抛给调用者。

还有一点,不可忽视:finally语句在任何情况下都必须执行的代码,这样可以保证一些在任何情况下都必须执行代码的可靠性。比如,在数据库查询异常的时候,应该释放JDBC连接等等。finally语句先于return语句执行,而不论其先后位置,也不管是否try块出现异常。finally语句唯一不被执行的情况是方法执行了System.exit()方法。

System.exit()的作用是终止当前正在运行的 Java 虚拟机。finally语句块中不能通过给变量赋新值来改变return的返回值,也建议不要在finally块中使用return语句,没有意义还容易导致错误。

教材学习中的问题和解决过程

问:java异常处理中的catch语句可以有多个,但是catch后面的异常类的类型可以是父子类关系吗?

答:首先所有异常都是Exception的子类。
try后面可以跟多个catch,并且多个catch的异常可以有父子关系,但是要先catch子类异常,再catch父类异常。
举例来说,SocketException套接字异常是IOException输入输出异常的子类,也就是说SocketException是具体的一种IOException,当然还有其它种类的IOException。
所以要先catch(SocketException e),再catch(IOException e),这样的意思就是如果是SocketException异常就会在前面的catch被抓到,否则其它的IOException就会在后面被抓到。这样你就可以理解为什么要把子类放前面catch了。

代码中遇到的问题与解决

代码调试过程中出现了中文字符,括号不对称等问题。

上周考试错题总结

填空:写出编译P165 RPG.java的命令(javac –d . *.java)

判断:final可以用在类,方法,变量前。(OK)

填空:实现一个类中的equals()方法时,一定要同时实现(hashCode())方法

填空:实现接口表示(拥有行为),但不是ISA关系。

填空:System.out.println( “HELLO”.( toLowerCase() ) ) 会输出“hello”..

面向对象中,设计经验可以用(设计模式)表达

可以用父类声明对象引用,用子类生成对象,但需要强制类型转换。(X)

结对及互评

评分标准

正确使用Markdown语法(加1分):

不使用Markdown不加分

有语法错误的不加分(链接打不开,表格不对,列表不正确...)

排版混乱的不加分

模板中的要素齐全(加1分)

缺少“教材学习中的问题和解决过程”的不加分

缺少“代码调试中的问题和解决过程”的不加分

代码托管不能打开的不加分

缺少“结对及互评”的不能打开的不加分

缺少“上周考试错题总结”的不能加分

缺少“进度条”的不能加分

缺少“参考资料”的不能加分

教材学习中的问题和解决过程, 一个问题加1分

代码调试中的问题和解决过程, 一个问题加1分

本周有效代码超过300分行的(加2分)

一周提交次数少于20次的不加分

其他加分:

周五前发博客的加1分

感想,体会不假大空的加1分

排版精美的加一分

进度条中记录学习时间与改进情况的加1分

有动手写新代码的加1分

课后选择题有验证的加1分

代码Commit Message规范的加1分

错题学习深入的加1分

扣分:

有抄袭的扣至0分

代码作弊的扣至0分

点评模板:

基于评分标准,我给本博客打分:XX分。得分情况如下:xxx

参考示例

其他(感悟、思考等,可选)

我感觉学习java应该是循环渐进,有始有终,按部就班,脚踏实地.java是一门有着阶梯性的一们语言,如果要学习它.我觉得最好还是按照java的学习体系,先学习什么,在学习什么,只有这样,我们在学习中才会遇到更少的麻烦.j

posted @ 2017-03-26 23:24  20155331  阅读(240)  评论(3编辑  收藏  举报