首页 > 其他分享 >异常类&线程总结

异常类&线程总结

时间:2023-12-28 20:59:50浏览次数:25  
标签:总结 String Thread 线程 new 异常 public

总结

异常

异常:就是Java中程序的一种错误

Java中异常机制:
表示程序的某个错误,当错误发生的时候,将程序结束,提示在那个位置出现什么错误

Java中异常的体系结构:每种错误就是一个类
Throwable类:java中错误、异常的父类
Error:错误,不能用Java代码处理错误

​ eg:
​ VirtualMachineError:虚拟机损坏的错误
​ StackOverflowError:堆栈溢出

Exception:异常,需要使用Java代码处理错误

​ 1. 编译时异常:编译之前必须处理的异常,强制处理的异常

​ 2. 运行时异常:不强制处理的异常

常见的异常

  1. 运行时异常
    NullPointerException:空指针异常(对象在堆里面没有引用,就直接调用方法)
    对象在调用方法或属性的时候需要做非空判断
    StringIndexOutOfBoundsException:字符串下标越界的异常
    只要操作数组下标,必须要做合法性判断
    ArrayIndexOutOfBoundsException:数组下标越界
    操作数组先做非空和空数组
    ArithmeticException:算术异常
    NumberFormatException:数值的格式异常
    ClassCastException:类型转化异常,对象向下转型的时候
  2. 编译时异常
    ParseException:转换日期格式的异常

区分编译时异常和运行时异常:
只要异常的父类时RuntimeException就是运行时异常,其他就是编译时异常

异常的处理方式:

  1. 甩锅式 在方法上抛出异常或者在方法里直接抛出
    throws在方法的声明上面抛出异常
    只要程序出现抛出的异常,JVM会创建相应对象,再去调用相应的方法来提示错误
    在方法体内抛出异常,throw 异常对象

    public class ExceptionDemo3 {
        // 声明一个方法
        public static void m() throws ParseException {  // 抛出异常,异常抛给调用者,thorws
            // 省略方法体
            new SimpleDateFormat("yyyy-MM-dd").parse("2023/12/19");
        }
       
        public static void mm() throws IOException {
        }
        
        public static void main(String[] args) throws ParseException   { // 直接抛给JVM
            m();
            mm();
    
            String str = "";
            str.length();
        }
    }
    
  2. 背锅式
    try{
    可能会出现异常的代码
    }catch(异常类名 参数名) {
    报这种异常错误信息的代码
    }.....注意:catch的顺序时先子后父
    finally {
    处理异常的出口
    作用:关闭资源
    }

    public class ExceptionDemo4 {
        public static void main(String[] args) throws ParseException {
            try {
               new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2023-12-19 14:11:20");
                return; // 结束方法
                System.exit(0);
            } catch (ParseException e) {
                throw new RuntimeException(e);
            } finally {
                System.out.println("异常处理的出口");
            }
    
            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2023-12-19 14:11:20");
    
        }
    }
    

    自定义异常

    ​ 写程序执行过程有不满条件情况都是异常,需要自己定义
    ​ class 自定义异常的名字(XxxException) extends Exception {
    ​ // 自定义编译时异常
    ​ 书写两个构造方法
    ​ 一个无参
    ​ 一个有1个字符串参数的构造方法
    ​ }
    ​ class 自定义异常的名字(XxxException) extends RuntimeException {
    ​ // 自定义运行时异常
    ​ }

    public class AccountStartWithCharException extends RuntimeException {
        public AccountStartWithCharException() {
        }
    
        public AccountStartWithCharException(String message) {
            super(message);
        }
    }
    
    /**
     * 自定义的异常:账号不在6-18位就会报这个异常
     */
    public class AccountSizeException extends Exception {
        public AccountSizeException() {
        }
    
        public AccountSizeException(String message) {
            super(message);
        }
    }
    

线程

  1. 进程:一个应用软件就是一个进程,一大段程序(代码)
    每一个进行运行都有独立内存空间
    优酷:进程A
    腾讯:进程B
    快播:进程C
    进程的运行相互不干扰

  2. 线程:一个进程里面独立某个功能就是一个线程,一小段代码
    其实软件运行的就是线程
    一个进程里面至少有一个线程,也可以有多个线程
    线程的运行也是独立,每个线程也有独立运行内存,这个内存时进程的内存

  3. 线程时怎样执行?
    1)、启动线程
    2)、线程就是待运行状态
    3)、cpu会统计目前内存中有多少个待运行的线程
    会将运行时间平均分配给每个待运行的线程
    4)、那个线程获得这个时间片,那这个线程就开始执行,直到时间片用完,线程就暂停
    注意:在cpu里面同一时间只能运行一个线程

  4. 为什么软件要设计位多线程?

    Java实现多线程的方式

    1)、继承Thread类,重写run()
    使用多线程

    public class Play extends Thread{ // Play是多线程
        // 重写run():线程获得时间片后执行的代码
    
        @Override
        public void run() {
            for (int i = 1; i <= 10; i++) {
                // 获取当前线程的名字
                String name = Thread.currentThread().getName();
                System.out.println(name + ":播放视频第" + i + "次");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
    
    /**
     * 多线程的测试类
     */
    public class PlayTest {
        public static void main(String[] args) {
            // 1、创建线程
            Play p1 = new Play(); // 开启一个线程 Thread-0
            Play p2 = new Play(); // 开启一个线程 Thread-1
            Play p3 = new Play(); // 开启一个线程 Thread-2
            // 2、开启线程,start()
    //        p1.start(); // 启动p1线程
    //        p2.start();
    //        p3.start();
            p1.setDaemon(true);
            p1.setName("蘋蘋");
            System.out.println(p1.isDaemon());
    //        p1.setPriority(10);
    //        System.out.println(p1.getPriority());
    
        }
    }
    

    2)、实现Runnable接口,重写run()

    /**
     * 实现Runnable接口,来实现多线程
     */
    public class Down implements Runnable{
        @Override
        public void run() {
            for (int i = 1; i <= 10 ; i++) {
                System.out.println("下载视频第" + i + "次");
            }
        }
    }
    
    /**
     * 实现接口创建多线程的测试类
     */
    public class DownTest {
        public static void main(String[] args) {
            // 1、创建Runnable对象
            Down d1 = new Down();
            // 2、创建线程对象
            Thread t1 = new Thread(d1); // 创建第一个线程
            Thread t2 = new Thread(d1); // 创建第一个线程
            Thread t3 = new Thread(d1); // 创建第一个线程
            // 3、启动线程
            t1.start();
            t2.start();
            t3.start();
        }
    }
    

    讲解Thread类中常用的方法

    1. 常用字段(常量)
      线程的优先级:1-10

       System.out.println("最高优先级:"+ Thread.MAX_PRIORITY);
       System.out.println("默认优先级:"+ Thread.NORM_PRIORITY);
       System.out.println("最低优先级:"+ Thread.MIN_PRIORITY);
      
    2. 优先级越高获得时间片的概率越大
      线程默认优先级都是:5

    3. 构造方法
      Thread():创建默认名字的线程。
      Thread(String name):创建一个指定名字的线程
      Thread(Runnable target) :根据传入Runnable对象创建线程,线程的名字是默认的
      Thread(Runnable target, String name) :根据传入Runnable对象创建线程,线程的名字是指定的

    4. 常用方法

      1. getName():获取线程名字
      2. currentThread() :获取当前线程
      3. getPriority() :获取线程的优先级
      4. setPriority(int newPriority) :设置线程优先级
      5. setName(String name) :设置线程名字
      6. sleep(long millis):设置线程休眠的时间
      7. 线程分为:前台线程,后台线程(守护线程)
        GC:垃圾回收机制(GC属于后台线程)
      8. isDaemon():判断线程是否位守护线程
      9. setDaemon(boolean on):设置线程位守护线程

    梳理线程

    ​ 线程的执行流程:

    1. 启动线程
    2. cpu分配时间片
    3. 拿到时间片的线程开始执行(run()的代码)
    4. 直到run()里面的代码执行完毕后,线程解结束
                交替执行
    

    java中实现多线程的方式:

    1. 继承Thread,重写run方法
    2. 实现Runnable接口
    

    创建线程,启动线程

    Thread常用的方法:

    1. 获取当前的线程
    2. 线程休眠
    3. 获取线程名字

    线程的状态:

    1. 新建 new Play();
    2. 就绪 new Play().start();
    3. 运行 执行run方法的时候
    4. 阻塞 sleep()
    5. 死亡(结束) run方法执行完毕
    

标签:总结,String,Thread,线程,new,异常,public
From: https://www.cnblogs.com/JunYuanStudy/p/17933533.html

相关文章

  • StringBuilder&正则表达式&日期类总结
    总结StringBuilder:可以改变的字符串底层:使用的是一个byte类型的数组,默认长度16如果超过16,数组会自动扩容扩容的时机:当添加的数据的长度大于此时数组的长度扩容的机制:当前数组长度的2倍+2构造方法:StringBuilder()构造一个没有字符的字符串构建器,初始容量为16个字符。/......
  • System&Math&包装类&文本扫描器&String总结
    总结System类1、注意设计类的时候,不要将类名设计为和jdk提供的类名一样掌握属性和方法属性:err:获取标准的输出流(打印错误信息)out:标准的输出流,打印任意信息in:获取标准的输入流,可以获取控制台输入的信息方法:(全部是类方法)1、currentTimeMillis():获取当前时间,以毫秒来表示......
  • 数据结构&&集合总结
    总结数据结构数据结构:保存数据的一种方式常见的数据结构通过数组来保存,基于数组的数据结构(动态数组,长度可变的数组)基于数组的结构的优缺点​ 1.通过下标查询元素,效率高​ 2.通过下标修改元素,效率高​ **查改快**​ 在需要扩容的时候:添加慢,删除慢,插入元素慢......
  • 线程安全&&定时器总结
    总结线程线程:执行的独立代码线程执行是靠cpu分配时间片,同一个时间片上只能执行一个线程线程的状态:新建就绪运行阻塞死亡Thread:多线程的类currentThread()getName(),setName()sleep()实现多线程的方式1.继承Thread,重写run2.实现Runnable,重写run实现线程安全......
  • File&递归&IO流总结
    总结文件过滤器1、文件过滤器:将不要文件过滤掉,剩下我们需要FilenameFilter:文件过滤器FileFilter:文件过滤publicclassFileDemo1{publicstaticvoidmain(String[]args){Filefile=newFile("e:/pp");//File[]files=file.listFiles();//......
  • Map&泛型&Collection工具类&File总结
    总结HashMap遍历方式//遍历map集合,Entry:键值对//遍历map的第一种方式:同时获取键和值,entrySet()Setset=hm.entrySet();//获取所有的键值对System.out.println(set);Iteratorit=set.iterator();while(it.hasNext()){Objectnext=it.next();......
  • set集合&&hashMap总结
    总结实现set接口的集合set集合:无序不重复不重复(去重):元素放入集合之前或做判断无序:存取不一致1、讲解set的实现类HashSet:底层使用哈希表来实现(底层是一个数组,数组里面保存一个单向链表)的集合不允许元素重复,元素是无序的HashSet的去重机制(怎么去除重复)第一步:将要添加到H......
  • IO流&lambda总结
    总结读取文件,统计文件中偶数的个数publicclassHomeWorkDemo1{/***读取文件,统计文件中偶数的个数*/publicstaticintgetEvenCount(Stringfile){intevenCount=0;//保存偶数个数//参数的合法判断if(file==nul......
  • 学期2023-2024-1 20231401 《计算机基础与程序设计》第十四周学习总结
    学期2023-2024-120231401《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十四周作业这个作业的目标《C语言程序设计》第13章并完成云班课测试......
  • 数据类型&变量&表达式总结
    总结数据类型转换概念:数据从一种数据类型转换为另外一种类型为什么需要数据类型转换?节约内存空间业务需要java中的数据类型转换分类向上转型:从小范围的数据转换为大范围的数据类型,自动发生byteb=10;//局部变量shorts=b;//发生数据类型转换,向上......