抛出异常

使用throws声明抛出异常

Throws 通常用于方法声明,当方法中可能存在异常,却不想在方法中对异常进行处理时,就可以在声明方法时使用throws声明抛出的异常,然后再调用该方法的其他方法中对异常进行处理。语法格式如下:

数据类型 方法名(形参列表) throws 异常类1,异常类2,…异常类n

{

方法体;

}

使用throw语句抛出异常

有时希望程序自行抛出异常,可以使用throws语句来实现。Throws语句通常用在方法中,在程序中自行抛出异常,使用throw语句抛出的时异常类的实例,通常与if语句一起使用。

其语句格式如下:

Throw new Exception(“对异常的说明”);

自定义异常

创建自定义异常

创建自定义的异常类需要继承自Exception类,并提供含有一个String类型形参的构造方法,该形参就是异常的描述信息,可以通过getMessage()方法获得。

异常的使用原则

在程序中使用异常,可以捕获程序中的错误,但是异常的使用也要遵循一定的规则。下面是异常类的几项使用原则:

  1. 不要过多地使用异常,这样会增加系统的负担。
  2. 在方法中使用try…catch语句块捕获异常时,要对异常做出处理。
  3. Try…catch语句块的范围不要太大,这样不利于对异常的分析。
  4. 一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或子异常。、

文件的创建与删除

可以使用File类创建一个文件对象,通常使用以下3种构造方法来创建文件对象。

  1. File(String pathname);
  2. File(String parent,String child);
  3. File(File f,String child);

带缓存的输入/输出流

缓存可以说是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区。有了缓存区,使得再流上执行skip()、mark()和reset()方法成为可能。

数据输入/输出流(DataInputStream类与DataOutputStream类)允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型。也就是说,当读取一个数据时,不必在关心这个数值应当时什么字节。

输入/输出

输入流

InputStream类是字节输入流的抽象类,是所有字节输入流的父类。

在swing中常用的布局管理器:流布局管理器、边界布局管理器、网格布局管理器。

重点章节:高级事件处理

键盘事件

当向文本框中输入内容时,将发出键盘事件(KeyEvent)。KeyEvent类负责捕获键盘事件,可以通过为组件添加实现了KeyListener接口的监听器类来处理相应的键盘事件。

KeyListener接口总共有3个抽象方法,其接口的具体定义如下:

鼠标事件

所有组件都能发出鼠标事件(MouseEvent),MouseEvent类负责捕获鼠标事件,可以通过为组件添加实现了MouseListener接口的监听器类来处理相应的鼠标事件。

MouseListener接口共有5个抽象方法,具体定义如下:

窗体事件

在捕获窗体事件(WindowEvent)时,可以通过3个事件监听器接口来实现,分别为WindowFocusListener、WindowStateListener和WindowListener。

首先时捕获窗体焦点变化事件

捕获窗体状态变化事件

捕获其他窗体事件

选项事件

多线程

Java语言提供并发机制,程序员可以在程序中执行多个线程,每一个线程完成一个功能,并与其他线程并发执行,这种机制被称为多线程。

一个进程是一个包含有自身地址的程序,每个独立执行的程序都成为进程。也就是正在执行的程序。一个线程则是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程也可以得到一小段程序的执行事件,这样一个进程就可以具有多个并发执行的线程。

实现线程的两种方式

在java中主要提供了两种方式实现线程,分别为继承java.lang.Thread类与实现java.lang.Runnable接口。

实现Runnable接口

注意:启动一个新的线程,不是直接调用Thread子类对象的run()方法,而是调用Thread子类的start()方法,Thread类的start()方法产生一个新的线程,该线程运行Thread子类的run()方法。

线程的生命周期

线程具有生命,其中包括出生状态、就绪状态、运行状态、等待状态、休眠状态、阻塞状态和死亡状态7种状态。

虽然多线程看起来像同时执行,但事实上在同一时间点上只有一个线程被执行,只是线程之间切换较快,所以才会使人产生线程是同时进行的假象。

线程的加入

当某个线程使用join()方法加入到另一个线程时,另一个线程会等待该线程执行完毕再继续执行。

线程的礼让

Thread类种提供了一种礼让方法,使用yield()方法表示,它只是给当前正处于运行状态下的线程一个提醒,告知它可以将资源礼让给其他线程,但这仅仅是一种暗示,没有任何一种机制保证当前线程会将资源礼让。

Yield()方法使具有同样优先级的线程有进入可执行状态的机会,当当前线程放弃执行权时会再度回到就绪状态。对于支持多任务的操作系统来说,不需要调用yield()方法,因为操作系统会为线程自动分配CPU时间片来执行。

线程同步

Java提供线程同步的机制来防止资源访问的冲突。

线程同部机制

如何解决资源共享的问题?基本上所有解决多线程资源冲突问题都会采用给定时间只允许一个线程访问共享资源,这时就需要给共享资源上一道锁。这就好比一个人上洗手间,这个人进入洗手间后将门锁上,当他出来时再将锁打开,然后其他人才可以进入。

         1.同步块

在java中提供了同步机制,可以有效地防止资源冲突。同步机制使用synchronized关键字。

将资源放置在同步块中。这个同步块也被称为临界区,其语法格式如下:

         2.同步方法

同步方法就是在方法前面修饰synchronized关键字的方法,其语法格式如下:

线程间的通信

Java笔记(第五篇)的更多相关文章

  1. Java系列--第五篇 基于Maven的SSME之Token及Parameterized单元测试

    本来在第四篇要说完的,但是写着写着,我觉得内容有点多起来了,所以就另开这篇,在这里专门讲述Token的定义,JSP自定义标签以及如何用Parameterized的来做单元测试. 1,新建包com.va ...

  2. Java【第五篇】基本语法之--数组

    数组概述 数组是多个相同类型数据的组合,实现对这些数据的统一管理数组属引用类型,数组型数据是对象(Object),数组中的每个元素相当于该对象的成员变量数组中的元素可以是任何数据类型,包括基本类型和引 ...

  3. java核心技术第五篇之事务和MVC模式

    第一部分:事务1.事务的简介: 1.1 在一组操作中(比如增加操作,修改操作),只有增加和修改操作都成功之后,这两个操作才能真正的成功. ,如果这两个操作中,有一个失败了,这两个操作都失败了. 1.2 ...

  4. ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项

    前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...

  5. Effective java笔记(五),枚举和注解

    30.用enum代替int常量 枚举类型是指由一组固定的常量组成合法值的类型.在java没有引入枚举类型前,表示枚举类型的常用方法是声明一组不同的int常量,每个类型成员一个常量,这种方法称作int枚 ...

  6. Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

  7. Java笔记(十五)……面向对象IV多态(polymorphism)

    概述 定义:某一类事物的多种存在形态. 例:动物中猫,狗. 猫这个对象对应的类型是猫类型 猫 x = new 猫(); 同时猫也是动物中的一种,也可以把猫称为动物. 动物 y = new 猫(); 动 ...

  8. [Python笔记]第五篇:递归

    本篇主要内容:递归以及冒泡排序 参考文章:(http://www.cnblogs.com/balian/archive/2011/02/11/1951054.html) 递归的概念 递归的概念很简单, ...

  9. Java 学习 第五篇;面向对象

    1:基本数据类型的拆装: 基本变量类型 通过 new WrapperClass(primitive) 创建包装类对象: 包装类的对象 通过 WrapperInstance.XXXValue() 获取包 ...

  10. R学习笔记 第五篇:数据变换和清理

    在使用R的分组操作之前,首先要了解R语言包,包实质上是实现特定功能的,预先写好的代码库(library),R拥有大量的软件包,许多包都是由某一领域的专家编写的,但并不是所有的包都有很高的质量的,在使用 ...

随机推荐

  1. sort(()=>{return Math.random()-0.5)}乱序数组不准确

    为什么sort(()=>{return Math.random()-0.5)}乱序数组不准确.(注意结合插入排序原理来理解) @1.chrome浏览器对于数组长度10以内为插入排序.反之则快速排 ...

  2. 配置了Ubuntu环境变量,系统启动不了

    修改了etc/init.d/rcS文件后重启后Ubuntu起不来了, 开启按shift+e或者直接选择,进入恢复模式 进入root shell 执行这个命令 可以有写入权限,重新挂载 mount  - ...

  3. go 二进制数据处理

    以下是利用标准库binary来进行编解码 编码 ①使用bytes.Buffer来存储编码生成的串②使用binary.Write来编码存储在①的buf中 package main import ( &q ...

  4. Redis 学习笔记(篇八):事件

    Redis 服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件: Redis 服务器通过套接字与客户端(或者其他 Redis 服务器)进行连接,而文件事件就是服务器对套接字操作的抽象.服 ...

  5. Hadoop环境搭建过程中遇到的问题以及解决方法

    1.启动hadoop之前,ssh免密登录slave主机正常,使用命令start-all.sh启动hadoop时,需要输入slave主机的密码,说明ssh文件权限有问题,需要执行以下操作: 1)进入.s ...

  6. vs code 更改快捷键

    选择左下角设置图标,快捷键方式 文件列表修改,搜 list 文件tree list.focusUp -> ctrl+p

  7. Laravel框架与ThinkPHP框架的不同

    作为一个PHP菜鸟初学Laravel框架 在学习过程中我发现了其与TP框架的不同点,由于时间问题和认识还不够完善我先写出其中几点,有错误的地方希望各位大牛斧正... 1.渲染模版方式的不同:在Lara ...

  8. python 字典所有操作

    # 字典的创建# dict1 = {}# print(type(dict1))## dict2 = {# 'name':'汪峰',# 'sex':'男',# 'hiredate':'1997-10-2 ...

  9. linux命令自动补全

    在linux中命令较长时,不易记忆,使用命令行自动补全,使用方便,配置方法记录如下 需要安装bash-completion 重启后生效 命令:yum install bash-completion,安 ...

  10. 【IntelliJ IDEA】添加一个新的tomcat,tomcat启动无法访问欢迎页面,空白页,404

    ===================================第一部分,添加一个tomcat================================================== ...