异常处理就是针对程序可能出现的错误情况,进行抛出异常。要么终止程序,要么进行避免错误情况。就需要用到的语法是try(避免)。throws(对可能出现的情况进行抛出)。
在实际开发中,异常处理是必要的。因为比如编译型异常,如果没有异常处理。程序爆红不会通过编译,比如下面; //这是编译时可能的情况,Java是一门严谨的语言。
java异常处理的方式;
有两种:方式一:try-catch-finally
方式二:throws + 异常类型
先介绍第一种方式处理异常。这是抓抛模型处理。在编译型和运行型异常使用,其中,感觉运行型异常使用这种方式更加便利。因为编译型异常是必须要编写的,通过throws处理感觉代码更加简便。
try-catch的使用一定要注意异常类的继承关系。子类的异常放在上面。通过Ctrl+h可以查看继承关系。
异常类存在的两个方法:printStackTrace()和getMessage需要牢记。
finally是和try-catch搭配使用的,finally在数据库操作、数据流操作里面是必不可少的操作。它是一个一定会执行的代码块。优先级比return还高。用在数据流这样的操作是为了关闭数据流或断开数据库连接。这样就可以防止内存泄漏。如果没有关闭操作。很可能会因为外部还有连接数据库,导致gc机制不会回收数据库。从而导致内存泄漏。它的优先级很高,看下图:
注意这个题的最后结果是11和栈的临时空间有关。
最主要原因是防止内存泄漏,但是在其它情况也会使用finally。比如catch代码块里面也出现异常。为了让后续代码执行。就必须加上finally。这样也可以增强代码健壮性。
单元测试创建的方式有两种,联网情况下第二种方式最简便。
第二种方式:
异常处理的第二种方式是throws。这种方式是伪处理异常。它的本质是抛出异常给父类或主程序类。这个方式在面对有多个子类,大开发场景中用的比较多。但是如果是编译 异常,就必须在主类对异常处理try-catch。对运行异常就不需要对抛过来的异常处理。
本质并没有处理了异常。
手动抛出异常是必要的,它用在不满足具体场景的代码问题。比如:输入学生的id<0时,不满足场景需求,但是程序不会出错。就需要手动抛出异常:id不能小于0.这种方式比if-else更加简便。
枚举类的例子:(见面向对象的知识)
多线程,其实就是进程里面的某个执行过程。比如:qq消息框,发送消息就是一个进程。多个消息框就是多个线程。下面就是一个进程(红线框),进程里面有不同的线程。
程序(program):为完成特定任务,用某种语言编写的一组指令的集合
。即指一段静态的代码
,静态对象。
进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。如:运行中的QQ,运行中的网易音乐播放器。
每个进程都有一个独立的内存空间,系统运行一个程序即是一个进程从创建、运行到消亡的过程。(生命周期)
程序是静态的,进程是动态的
进程作为操作系统调度和分配资源的最小单位
(亦是系统运行程序的基本单位),系统在运行时会为每个进程分配不同的内存区域。
现代的操作系统,大都是支持多进程的,支持同时运行多个程序。比如:现在我们上课一边使用编辑器,一边使用录屏软件,同时还开着画图板,dos窗口等软件。
线程(thread):进程可进一步细化为线程,是程序内部的一条执行路径
。一个进程中至少有一个线程。
一个进程同一时间若并行
执行多个线程,就是支持多线程的。
需要理解并行和并发的概念:
并行可以理解为多个人做做件事。
并发就是一个人做多件事。而且每件事都要交互进行。
抢占式调度:
让优先级高
的线程以较大的概率
优先使用 CPU。如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
背景:以单核CPU为例,只使用单个线程先后完成多个任务(调用多个方法),肯定比用多个线程来完成用的时间更短,为何仍需多线程呢?
多线程程序的优点:
提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
提高计算机系统CPU的利用率
改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改
使用场景:FTP下载、数据库、分布式计算、浏览器的Web服务、后台任务。
进程·之间的数据交换成本很高,比如淘宝跳转支付宝。
一和二的步骤需要另外创建一个子类和一个重写的方法run()。调用的方式如下:这里就是一个多线程的例子,分别使用了不同的线程。
多线程的例子:
通过匿名子类的匿名对象方式创建:
线程 安全问题就是多个线程在访问同一资源的时候,都对资源进行读或写,就容易出现安全问题,比如,同时有多个线程进行run()。然后在第一次数据减少还没结束的时候,第二个进程就访问到这个数据。导致最后的结果就会出现同名甚至负数的情况。
同步的原理:
sychronized是方法,里面的参数是对象,且是唯一对象。
第一种在实现接口的方法里进行同步锁问题:
需要注意,接口的方式,是共享同一实例空间,用this就可以代表唯一实例对象。
第二种在继承的方式实现同步锁问题:
需要注意,继承是单继承,意味着调用三个进程就使用了三个继承空间。导致this不会是唯一对象。这个时候就需要使用本类.class的方式表示唯一对象。
由于效率太低,只是做复制粘贴工,这种方式被我暂时放弃掉。选择,从别人配套的学习笔记入手。每学习一章节就对整个知识点进行回顾。要求:记忆力,认真态度。效率。