Java高级应用

一、异常处理

异常处理就是针对程序可能出现的错误情况,进行抛出异常。要么终止程序,要么进行避免错误情况。就需要用到的语法是try(避免)。throws(对可能出现的情况进行抛出)。

在实际开发中,异常处理是必要的。因为比如编译型异常,如果没有异常处理。程序爆红不会通过编译,比如下面;     //这是编译时可能的情况,Java是一门严谨的语言。

Java高级应用_第1张图片

 基本概念:

Java高级应用_第2张图片

异常的体系结构:

Java高级应用_第3张图片

 主要异常类型:

Java高级应用_第4张图片

java异常处理的方式;

有两种:方式一:try-catch-finally

              方式二:throws + 异常类型

一二、try-catch的使用

先介绍第一种方式处理异常。这是抓抛模型处理。在编译型和运行型异常使用,其中,感觉运行型异常使用这种方式更加便利。因为编译型异常是必须要编写的,通过throws处理感觉代码更加简便。

基本概念:

Java高级应用_第5张图片

 Java高级应用_第6张图片

注意事项:

try-catch的使用一定要注意异常类的继承关系。子类的异常放在上面。通过Ctrl+h可以查看继承关系。

Java高级应用_第7张图片

异常类存在的两个方法:printStackTrace()和getMessage需要牢记。

Java高级应用_第8张图片

一三、finally的使用

finally是和try-catch搭配使用的,finally在数据库操作、数据流操作里面是必不可少的操作。它是一个一定会执行的代码块。优先级比return还高。用在数据流这样的操作是为了关闭数据流或断开数据库连接。这样就可以防止内存泄漏。如果没有关闭操作。很可能会因为外部还有连接数据库,导致gc机制不会回收数据库。从而导致内存泄漏。它的优先级很高,看下图:

Java高级应用_第9张图片

注意这个题的最后结果是11和栈的临时空间有关。 

基本概念:

Java高级应用_第10张图片

使用原因:

Java高级应用_第11张图片

 最主要原因是防止内存泄漏,但是在其它情况也会使用finally。比如catch代码块里面也出现异常。为了让后续代码执行。就必须加上finally。这样也可以增强代码健壮性。

Java高级应用_第12张图片

扩展:单元测试

单元测试创建的方式有两种,联网情况下第二种方式最简便。

Java高级应用_第13张图片

第二种方式: 

 Java高级应用_第14张图片

面试题:

Java高级应用_第15张图片

 最终样式:

Java高级应用_第16张图片

一四、异常处理方式二throws

异常处理的第二种方式是throws。这种方式是伪处理异常。它的本质是抛出异常给父类或主程序类。这个方式在面对有多个子类,大开发场景中用的比较多。但是如果是编译 异常,就必须在主类对异常处理try-catch。对运行异常就不需要对抛过来的异常处理。

基本概念:

Java高级应用_第17张图片

本质并没有处理了异常。

 如何选择异常处理方式:

Java高级应用_第18张图片

理解“手动”和“自动”抛出异常:

手动抛出异常是必要的,它用在不满足具体场景的代码问题。比如:输入学生的id<0时,不满足场景需求,但是程序不会出错。就需要手动抛出异常:id不能小于0.这种方式比if-else更加简便。

 Java高级应用_第19张图片

throws的注意事项:

Java高级应用_第20张图片

如何自定义异常类?

Java高级应用_第21张图片

枚举类的例子:(见面向对象的知识)

Java高级应用_第22张图片

二、多线程

多线程,其实就是进程里面的某个执行过程。比如:qq消息框,发送消息就是一个进程。多个消息框就是多个线程。下面就是一个进程(红线框),进程里面有不同的线程。

Java高级应用_第23张图片

程序、进程与线程

  • 程序(program):为完成特定任务,用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。

  • 进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。如:运行中的QQ,运行中的网易音乐播放器。

    • 每个进程都有一个独立的内存空间,系统运行一个程序即是一个进程从创建、运行到消亡的过程。(生命周期)

    • 程序是静态的,进程是动态的

    • 进程作为操作系统调度和分配资源的最小单位(亦是系统运行程序的基本单位),系统在运行时会为每个进程分配不同的内存区域。

    • 现代的操作系统,大都是支持多进程的,支持同时运行多个程序。比如:现在我们上课一边使用编辑器,一边使用录屏软件,同时还开着画图板,dos窗口等软件。

  • 线程(thread):进程可进一步细化为线程,是程序内部的一条执行路径。一个进程中至少有一个线程。

    • 一个进程同一时间若并行执行多个线程,就是支持多线程的。

需要理解并行和并发的概念:

并行可以理解为多个人做做件事。

并发就是一个人做多件事。而且每件事都要交互进行。

抢占式调度:

优先级高的线程以较大的概率优先使用 CPU。如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。

为什么需要学习多线程?

背景:以单核CPU为例,只使用单个线程先后完成多个任务(调用多个方法),肯定比用多个线程来完成用的时间更短,为何仍需多线程呢?

多线程程序的优点:

  1. 提高应用程序的响应。对图形化界面更有意义,可增强用户体验。

  2. 提高计算机系统CPU的利用率

  3. 改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改

使用场景:FTP下载、数据库、分布式计算、浏览器的Web服务、后台任务。

Java高级应用_第24张图片

 进程·之间的数据交换成本很高,比如淘宝跳转支付宝。

二一、线程的创建方式一:

Java高级应用_第25张图片

一和二的步骤需要另外创建一个子类和一个重写的方法run()。调用的方式如下:这里就是一个多线程的例子,分别使用了不同的线程。

 Java高级应用_第26张图片

 多线程的例子:

Java高级应用_第27张图片

注意事项: 

 Java高级应用_第28张图片

 Java高级应用_第29张图片

通过匿名子类的匿名对象方式创建:

Java高级应用_第30张图片

二二、线程的创建方式二:

Java高级应用_第31张图片

具体实现:

Java高级应用_第32张图片

二三、对比两种创建方式:

Java高级应用_第33张图片

扩展例题: 

Java高级应用_第34张图片

二四、线程常用结构方法

线程中的构造器:

Java高级应用_第35张图片

线程常用的方法:

Java高级应用_第36张图片

 生命周期:

Java高级应用_第37张图片

二五、线程安全问题

线程 安全问题就是多个线程在访问同一资源的时候,都对资源进行读或写,就容易出现安全问题,比如,同时有多个线程进行run()。然后在第一次数据减少还没结束的时候,第二个进程就访问到这个数据。导致最后的结果就会出现同名甚至负数的情况。

基本概念:

Java高级应用_第38张图片

线程同步机制(安全锁):

Java高级应用_第39张图片

同步的原理: 

Java高级应用_第40张图片

 样例方案及注意:

sychronized是方法,里面的参数是对象,且是唯一对象。

第一种在实现接口的方法里进行同步锁问题:

需要注意,接口的方式,是共享同一实例空间,用this就可以代表唯一实例对象。

Java高级应用_第41张图片

 第二种在继承的方式实现同步锁问题:

需要注意,继承是单继承,意味着调用三个进程就使用了三个继承空间。导致this不会是唯一对象。这个时候就需要使用本类.class的方式表示唯一对象。

 Java高级应用_第42张图片

 小结:


由于效率太低,只是做复制粘贴工,这种方式被我暂时放弃掉。选择,从别人配套的学习笔记入手。每学习一章节就对整个知识点进行回顾。要求:记忆力,认真态度。效率。

你可能感兴趣的:(java)