20145110 《Java程序设计》第五周学习总结
20145110 《Java程序设计》第五周学习总结
教材学习内容总结
第8章 异常处理
8.1 语法与继承架构
使用try、catch
- 与C语言中程序流程和错误处理混在一起不同,Java中把正常流程放try块中,错误(异常)处理放catch块中
- 使用try、catch语法,JVM尝试执行try区块中的程序代码。如果发生错误,执行流程会跳离错误发生点,然后比较catch括号中声明的类型,是否符合被抛出的错误对象类型,如果是,就执行catch区块的程序代码。
import java.util.*;
public class Average {
public static void main(String[] args) {
Scanner console=new Scanner(System.in);
double sum=0;
int count=0;
while(true){
try{
int number=console.nextInt();
if (number==0){
break;
}
sum+=number;
count++;
}catch(InputMismatchException ex){
System.out.printf("略过非整数输入:%s%n",console.next());
}
}
System.out.printf("平均%.2f%n",sum/count);
}
}
import java.util.*;
public class Average3{
public static void main(String[] args)
{
Scanner console=new Scanner(System.in);
double sum=0;
int count=0;
while(true)
{
try
{
int number=console.nextInt();
if(number==0)
{
break;
}
sum+=number;
count++;
}
catch (InputMismatchException ex)
{
System.out.printf("略过非整数输入:%s%n",console.next());
}
}
System.out.printf("平均 %.2f%n",sum/count);
}
}
8.1.2 异常继承架构
- 设计错误对象都集成自java.lang.Throwable类,Throwable类定义了取得错误信息、堆栈追踪等方法,他有两个子类:java.lang.Errow、java.lang.Exception。
- 程序设计本身的错误,建议使用Exception或其子类实例来表现,所以通常诚错误处理为异常处理。
- 如果父类异常对象在子类异常对象前被捕捉,则catch子类异常对象的区块将永远不被执行,编译程序会检查出这个错误。
import java.util.Scanner;
public class Average4{
public static void main(String[] args){
double sum=0;
int count=0;
while(true){
int number=console.nextInt();
if(number==0){
break;
}
sum+=number;
count++;
}
System.out.printf("平均 %.2f%n",sum/count);
}
static Scanner console=new Scanner(System.in);
static int nextInt(){
String input=console.next();
while(!input.matches("\\d*")){
System.out.println("请输入数字");
input=console.next();
}
return Integer.parseInt(input);
}
}
8.1.3 要抓还是抛
- 运行时异常(编译时不检测):在编译时,不需要处理,编译器不检查。该异常的发生,建议不处理,让程序停止,需要对代码进行修正。
- 编译时被检测异常 :该异常在编译时,如果没有处理(没有抛也没有try),编译失败。该异常被表示,代表可以被处理。
import java.io.*;
import java.util.Scanner;
public class FileUtil{
public static String readFile(String name)throws FileNotFoundException{
StringBuilder text=new StringBuilder();
try{
Scanner console=new Scanner(new FileInputStream(name));
while(console.hasNext()){
text.append(console.nextLine())
.append('\n');
}
}catch(FileNotFoundException ex){
ex.printStackTrace();
throw ex;
}
return text.toString();
}
}
8.1.5认识堆栈追踪
定义:若想得知异常发生的根源,以及多重方法调用下异常的堆栈传播,可以利用一场对象自动收集的对堆栈追踪来获取相关信息。
public class StackTraceDemo3{
public static void main(String[] args){
try{
c();
}catch(NullPointerException ex){
ex.printStackTrace();
}
}
static void c(){
try{
b();
}catch(NullPointerException ex){
ex.printStackTrace();
Throwable t=ex.fillInStackTrace();
throw (NullPointerException) t;
}
}
static void b(){
a();
}
static String a(){
String text=null;
return text.toUpperCase();
}
}
8.1.6 关于assert
- assert的两种使用语法:
1.assert boolean_expression
2.assert boolean_expression : detail_expression
8.2 异常与资源管理
ublic class FinallyDemo{
public static void main(String[] args){
System.out.println(test(true));
}
static int test(boolean flag){
try{
if(flag){
return 1;
}
}finally{
System.out.println("finally...");
}
return 0;
}
}
java.lang.AutoCloseable接口
public class AutoCloseableDemo {
public static void main(String[] args) {
try(Resource res=new Resource()){
res.doSome();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
class Resource implements AutoCloseable{
void doSome(){
System.out.println("做一些事");
}
@Override
public void close() throws Exception{
System.out.println("资源被关闭");
}
}
9.1 使用Collection收集对象
9.1.1 认识Collection
收集对象的行为,像是新增对象的add()方法、移除对象的remove()方法等,都是定义在java.util.Collection中。既然可以收集对象,也要能逐一取得对象,这就是java.lang.Iterable定义的行为,它定义了iterator()方法返回java.lang.Iterable操作对象,可以让你逐一取得收集的对象。
List是一种Collection,作用是收集对象,并以索引方式保留收集的对象顺序,其操作类之一是java.util.ArrayList。
import static java.lang.System.out;
public class Guest
{
public static void main(String[] args)
{
List names = new java.util.ArrayList();
collectNameTo(names);
out.println("訪客名單:");
printUpperCase(names);
}
static void collectNameTo(List names)
{
Scanner console = new Scanner(System.in);
while(true)
{
out.print("訪客名稱:");
String name = console.nextLine();
if(name.equals("quit"))
{
break;
}
names.add(name);
}
}
static void printUpperCase(List names)
{
for(int i = 0; i < names.size(); i++)
{
String name = (String) names.get(i);
out.println(name.toUpperCase());
}
}
}
- 若收集的对象经常会有变动索引的情况,也许考虑链接方式操作的List会比较好,像是随时会有客户端登录或注销的客户端List,使用LinkedList会有比较好的效率。
- 在收集过程中若有相同对象,则不再重复收集,如果有这类需求,可以使用Set接口的操作对象。
import java.util.*;
public class WordCount
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.print("請輸入英文:");
Set words = tokenSet(console.nextLine());
System.out.printf("不重複單字有 %d 個:%s%n", words.size(), words);
}
static Set tokenSet(String line)
{
String[] tokens = line.split(" ");
return new HashSet(Arrays.asList(tokens));
}
}
9.2键值对应的Map
常用的Map操作类为java.util.HashMap与java.util.TreeMap。
如果想取得Map中所有的键,可以调用Map的keySet()返回Set对象。
本周代码托管截图
其他(感悟、思考等,可选)
java的学习进度还是很快,每周的学习任务较大。所以开始慢慢的会忘记之前所学过的东西,所以我觉得将感悟和体会记录下来是一个很好的总结方式,能够巩固自己所学到的知识。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 1/2 | 20/20 | |
第二周 | 300/500 | 1/3 | 18/38 | |
第三周 | 500/1000 | 1/4 | 22/60 | |
第四周 | 300/1300 | 1/5 | 45/125 | |
第五周 | 300/1600 | 1/5 | 30/160 |