JAVA day24,25,26 异常(try、catch、finally、throw、throws),线程(Thread、Runnable、Callable)
一、异常
1.异常Exception
1、异常(Exception)的分类:
|- parseException - 格式化异常
|- IOException - IO异常
|- FileNotFoundException - 文件未找到
|- ClassNotFoundException - 类未找到
|- UnsupportedEncodingException - 不支持的字符集异常
|- NullPointerException - 空指针异常
|- IndexOutOfBoundException - 下标越界异常
|- ClassCastException - 类型转换异常
|- NumberFormatException - 数值转换异常
|- IllegalArgumentException - 非法的参数
|- UnsupportedOpertionException - 不支持的操作
2、异常的处理
2.1捕获异常try…catch
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*try- catch解决已检查异常*/
public class ExceptionDemo01 {public static void main(String[] args) {//格式化类SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {Date parse = sdf.parse("yyyy/MM-dd");} catch (ParseException e) {e.printStackTrace();//打印堆栈信息/*java.text.ParseException: Unparseable date: "yyyy/MM-dd"at java.base/java.text.DateFormat.parse(DateFormat.java:388)at b_exception.ExceptionDemo01.main(ExceptionDemo01.java:20)*/}try {BufferedImage read = ImageIO.read(ExceptionDemo01.class.getResourceAsStream("a.png"));} catch (IOException e) {e.printStackTrace();/** Exception in thread "main" java.lang.IllegalArgumentException: input == null!at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1356)at b_exception.ExceptionDemo01.main(ExceptionDemo01.java:26)*/}//UnsupportedEncodingExceptiontry {new String(new byte[10],"UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}
}
/*try-catch解决 运行时异常*/
public class RuntimeExceptionDemo02 {public static void main(String[] args) {//相当于if - elsetry{Demo03Array.method01();System.out.println("正常运行的情况");Demo04NullPointer.method02();/*catch (NullPointerException e){System.out.println("空指针异常已经抛出");}*/}catch(ArrayIndexOutOfBoundsException e){System.out.println("数组下标越界异常已解决");//e.printStackTrace();//打印栈路径}catch (NullPointerException e){System.out.println("空指针异常已经抛出");}catch (RuntimeException e){System.out.println("运行时异常已经解决");//e.printStackTrace();}/* //异常二:空指针异常String[] str = new String[3];System.out.println(str[1].length());//异常三:类型转换异常Object o = new String("哈哈");Integer i = (Integer) o;*/}
}
2.2finally 代码块
/*try - catch - finally*/
public class Demo05 {public static void main(String[] args) {// 相当于if - else return;try{Demo03Array.method01();Demo04NullPointer.method02();return;}catch(NullPointerException e){System.out.println("抛出空指针");}catch (ArrayIndexOutOfBoundsException e){System.out.println("抛出下标越界");}catch (RuntimeException e){System.out.println("抛出运行时异常");}finally {//finally中所有代码,必须执行System.out.println("finally执行的代码");}}
}
import java.util.Scanner;/*finally 和 return 的执行顺序结论: 运行程序,先遇到了try中有finally关键词,则会先去查看finally中的内容如果try遇到了return,则标记方法结束.在方法结束之前,try先去finally中读取内容,读取完成直接返回return中之前标记好的结果.*/
public class Demo06Method {public static void main(String[] args) {int i = m1();System.out.println(i);}public static int m1(){Scanner sc = new Scanner(System.in);int a = 10;try{a += 20;return a;// 30,标记方法结束 30} catch (RuntimeException e){System.out.println("抓到异常");}finally {sc.close();//释放资源a++;System.out.println("finally中a的值:" + a);//31}return 0;}
}
2.3抛出异常throw
2.4声明异常throws
import java.io.IOException;/*
throw new 异常
throws 解决 已检查异常*/
public class Demo02 {public static void main(String[] args) throws Exception {//创建一个 运行时异常 - 可解决可不解决/* throw new RuntimeException();throw new NullPointerException();*/// 手动创建 已检查异常 - 必须要解决的//方式一: try- catchtry{throw new IOException();}catch (IOException e){}//方式二: 直接抛出异常throw new Exception();}
}
throw 和 throws 的区别:a.throws 是用来声明一个方法可能会抛出的异常类型,表示异常的一种可能性.throw 是创建一个具体的异常类型,执行throw则一定会抛出某种异常对象b.throws 出现在方法上throw 出现在方法中
3、自定义异常
// 业务逻辑异常
public class RegisterException extends Exception {/*** 空参构造*/public RegisterException() {}/*** @param message 表示异常提示*/public RegisterException(String message) {super(message);}
}public class Demo {// 模拟数据库中已存在账号private static String[] names = {"bill", "hill", "jill"};public static void main(String[] args) { // 调⽤⽅法try {// 可能出现异常的代码checkUsername("nill");System.out.println("注册成功"); // 如果没有异常就是注册成功} catch(RegisterException e) {// 处理异常e.printStackTrace();}}// 判断当前注册账号是否存在// 因为是编译期异常,⼜想调⽤者去处理 所以声明该异常public static boolean checkUsername(String uname) throws LoginException
{for (String name : names) {if (name.equals(uname)) {//如果名字在这⾥⾯ 就抛出登陆异常throw new RegisterException("亲" + name + "已经被注册了!");}}return true;}
}
二、线程
1.相关概念
程序:“计算机程序或者软件程序(通常简称程序)是指一组指示计算机每一步动作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。
进程:是指⼀个内存中运⾏的应⽤程序,每个进程都有⼀个独⽴的内存空间,⼀个应⽤程序可以同时运⾏多个进程;进程也是程序的⼀次执⾏过程,是系统运⾏程序的基本单位;系统运⾏⼀个程序即是⼀个进程从创建、运⾏到消亡的过程。
线程:线程是进程中的⼀个执⾏单元,负责当前进程中程序的执⾏,⼀个进程中⾄少有⼀个线程。⼀个进程中是可以有多个线程的,这个应⽤程序也可以称之为多线程程序。
简⽽⾔之:⼀个程序运⾏后⾄少有⼀个进程,⼀个进程中可以包含多个线程。
并行:指两个或多个事件在同⼀时刻发⽣(同时发⽣)。
并发:指两个或多个事件在同⼀个时间段内发⽣。
线程调度:
- 分时调度 :所有线程轮流使⽤ CPU 的使⽤权,平均分配每个线程占⽤ CPU 的时间。
- 抢占式调度:优先让优先级⾼的线程使⽤ CPU,如果线程的优先级相同,那么会随机选择⼀个(线程随机性),Java使⽤的为抢占式调度。
2.创建自定义线程
1.方式一
Java中通过继承Thread类来创建并启动多线程的步骤如下:
2.方式二
采用 java.lang.Runnable 也是⾮常常⻅的⼀种,我们只需要重写 run 方法即可,步骤如下:
//步骤一: 继承Thread线程类
public class MyThread extends Thread{//步骤二: 重写run()public void run() {for (int i = 0; i < 10; i++) {System.out.println("自定义线程执行了" + i);}}
}//步骤一: 自定义类,实现Runnable接口
public class MyRunnable implements Runnable{//步骤二: 重写run()public void run() {for (int i = 0; i < 10; i++) {System.out.println("Runnable执行了" + i);}}
}/*创建线程的方式*/
public class ThreadDemo01 {//主方法自带一个主线程public static void main(String[] args) {/* //主线程的运行for (int i = 0; i < 10; i++) {System.out.println("main的线程" + i);}*///步骤三: 创建线程对象MyThread th = new MyThread();// 调用类中的普通方法//th.run();//步骤四: 开启线程th.start();//主线程的运行for (int i = 0; i < 10; i++) {System.out.println("main的线程" + i);}//步骤三: 创建任务类对象MyRunnable my = new MyRunnable();//步骤四:开启线程,就必须是线程类//步骤四.1:创建线程对象Thread t = new Thread(my);t.start();}
}
3.Thread和Runnable的区别
4.线程常用API
构造方法:
public Thread() :分配⼀个新的线程对象。
public Thread(String name) :分配⼀个指定名字的新的线程对象。
public Thread(Runnable target) :分配⼀个带有指定⽬标新的线程对象。
5.匿名内部类方式实现线程的创建
使⽤线程的内匿名内部类⽅式,可以⽅便的实现每个线程执⾏不同的线程任务操作。
使⽤匿名内部类的⽅式实现 Runnable 接⼝,重写 Runnable 接⼝中的 run ⽅法:
/*匿名内部类的方式实现线程类的创建*/
public class Demo {public static void main(String[] args) {//局部内部类 - Thread/*class MyThread extends Thread{@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(getName() + ":" + i);}}}new MyThread().start();*///匿名内部类的方式优化 -//匿名内部类的作用: 继承抽象类/实现接口//匿名内部类结合 Thread创建的 线程类Thread t = new Thread() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(getName() + ":" + i);}}};t.start();//开启线程//匿名内部类结合 Runnable接口使用Runnable r = new Runnable() {@Overridepublic void run() {Thread t = Thread.currentThread();for (int i = 0; i < 10; i++) {System.out.println(t.getName() + ":" + i);}}};//通过线程对象开启线程Thread tt = new Thread(r);tt.start();}
}
3.线程安全
1.线程安全
2.同步代码块
3.同步方法
4.锁机制
Lock锁
java.util.concurrent.locks.Lock 机制提供了⽐synchronized代码块和synchronized⽅法更⼴泛的锁定操作,同步代码块/同步⽅法具有的功能Lock都有,除此之外更强⼤,更体现⾯向对象。
4.线程状态
1.Timed Waiting(计时等待)
2.BLOCKED(锁阻塞)
3.Waiting(⽆限等待)
JAVA day24,25,26 异常(try、catch、finally、throw、throws),线程(Thread、Runnable、Callable)相关推荐
- java 线程 Thread Runnable 实现样例
1: /** * Thread 实现多线程样例(可继承) */ public class ThreadImplementsTest implements Runnable{ public ...
- java catch后面_java 异常被catch后 将会继续执行的操作
我就废话不多说了,大家还是直接看代码吧~ import java.util.UUID; public class Test { public static void main(String[] arg ...
- 【原】Java学习笔记030 - 异常
1 package cn.temptation; 2 3 public class Sample01 { 4 public static void main(String[] args) { 5 /* ...
- Java 基础系列:异常
Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流.为了能够及时有效地处理程序中的运行错误,必须使用异常类. 1. 异常类型 Thro ...
- Java笔试面试总结—try、catch、finally语句中有return 的各类情况
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 之前在刷笔试题和面试的时候经常会遇到或者被问到 tr ...
- java i o流异常问题_第四章 Java的I/O流和异常处理
Java.io包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io包中的流支持很多种格式,比如:基本类型.对象.本地化字符集等等. 一个流可以理解为一个数据 ...
- c++异常Try catch
c++异常Try catch 分类: c++专区 功能函数测试集锦2014-04-09 17:43 1505人阅读 评论(0) 收藏 举报 一.简单的例子 首先通过一个简单的例子来熟悉C++ 的 tr ...
- java中的常见异常1 -- 新手上路,减速慢行
Throwable: 异常的顶级父类 ----Error:错误,程序无法处理 ----Exception:异常,可通过编码修复 ...
- java在己有的类创子类怎么创_如何使用Java创建自己的异常子类
Java不知道学了多少课时了,你知道如何使用Java创建自己的异常子类吗,Java的内置异常处理有哪些常见的错误呢,今天IT培训网小编就来给大家详细介绍下吧: 尽管Java的内置异常处理大多数常见错误 ...
最新文章
- RPC 【Remote Procedure Call】 原理
- ASP.NET常见面试题及答案(130题)
- 如何区分netty是udp还是tcp_鲜奶粉还是大包粉,到底该如何区分?
- Html文件转换为Aspx文件后发现样式丢失或失效
- Catch That Cow(POJ-3278)
- OpenStack Trove2
- 第三方库之 - SDWebImage
- springboot获取Spring容器中的bean(ApplicationContextAware接口的应用)避免过多的或不用if..else,switch
- 关于opencv中图像的坐标原点的区分
- Kibana操作Elasticsearch-Aggregations聚合数据分析
- 超50万人推荐的神奇兼实用App,个个精品,打死也不能错过
- css——font 样式和对照表 颜色格式和颜色渐变
- 写技术文章的一点感悟
- 什么是HTTP状态码 常见状态码集合
- node-exporter安装
- echarts X轴文字排列方式总结
- 图神经网络论文阅读(九) Break the Ceiling: Stronger Multi-scale Deep Graph Convolutional Networks,NeurIPS2019
- 如何用计算机破解ipad,ipad解id锁方法介绍【图文】】
- 中科大凌青老师凸优化课程——目录
- 打开心扉计算机谱子,谁知道《泰坦尼克号》的主题曲《我心永恒》的谱子???...
热门文章
- 中国吉他效果市场趋势报告、技术动态创新及市场预测
- 军事卫星行业调研报告 - 市场现状分析与发展前景预测
- 2021年中国制药机械市场趋势报告、技术动态创新及2027年市场预测
- mysql数据库的远程访问_mysql数据库远程访问设置方法
- Google与GitHub 结盟,为保护软件供应链而战
- 编码技术新突破:字节跳动AVG让视频缩小13%
- 编程网站 Perl.com 被劫,售价 19 万美元
- HarmonyOS 生态最重的拼图,手机开发者 Beta 版终于到来
- Redis 突然变 慢 了,是运维还是开发的错?
- 趣图 | 著名的悖论蒙提霍尔问题到底是什么?