Java异常处理--异常处理概述与常见异常举例

文章目录

  • 一、异常概述
    • 1- 什么是生活的异常
    • 2- 什么是程序的异常
    • 3- 异常的抛出机制
    • 4- 如何对待异常
  • 二、Java异常体系
    • 1- Throwable
    • 2- Error 和 Exception
      • 1、Error
        • 1.1 介绍
        • 1.2 举例
      • 2、Exception
        • 2.1 介绍
        • 2.2 编译时异常和运行时异常
    • 3- Java异常体系结构
      • 1、体系结构
      • 2、运行时异常举例
        • 2.1 ArrayIndexOutOfBoundsException
        • 2.2 NullPointerException
        • 2.3 ClassCastException
        • 2.4 NumberFormatException
        • 2.5 InputMismatchException
        • 2.6 ArithmeticException
      • 3、编译时异常举例
        • 3.1 ClassNotFoundException
        • 3.2 FileNotFoundException
        • 3.3 IOException
      • 4、代码

一、异常概述

1- 什么是生活的异常

男主角小明每天开车上班,正常车程1小时。但是,e4不出意外的话,可能会出现意外。
image.png

出现意外,即为异常情况。我们会做相应的处理。如果不处理,到不了公司。处理完了,就可以正常开车去公司。
image.png

2- 什么是程序的异常

在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式问题读取文件是否存在网络是否始终保持通畅等等。

  • 异常 :指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止。

异常指的并不是语法错误和逻辑错误。

语法错了,编译不通过,不会产生字节码文件,根本不能运行。

代码逻辑错误,只是没有得到想要的结果,例如:求a与b的和,你写成了a-b

3- 异常的抛出机制

Java中是如何表示不同的异常情况,又是如何让程序员得知,并处理异常的呢?

Java中把不同的异常用不同的类表示,一旦发生某种异常,就创建该异常类型的对象,并且抛出(throw)。然后程序员可以捕获(catch)到这个异常对象,并处理;如果没有捕获(catch)这个异常对象,那么这个异常对象将会导致程序终止。

举例:

运行下面的程序,程序会产生一个数组角标越界异常ArrayIndexOfBoundsException。我们通过图解来解析下异常产生和抛出的过程。

public class ArrayTools {
    // 对给定的数组通过给定的角标获取元素。
    public static int getElement(int[] arr, int index) {
        int element = arr[index];
        return element;
    }
}

测试类

public class ExceptionDemo {
    public static void main(String[] args) {
        int[] arr = { 34, 12, 67 };
        intnum = ArrayTools.getElement(arr, 4)
        System.out.println("num=" + num);
        System.out.println("over");
    }
}

上述程序执行过程图解:

image.png

4- 如何对待异常

对于程序出现的异常,一般有两种解决方法:一是遇到错误就终止程序的运行。另一种方法是程序员在编写程序时,就充分考虑到各种可能发生的异常和错误,极力预防和避免。实在无法避免的,要编写相应的代码进行异常的检测、以及异常的处理,保证代码的健壮性

二、Java异常体系

1- Throwable

java.lang.Throwable 类是Java程序执行过程中发生的异常事件对应的类的根父类

Throwable类是异常的根父类,它继承于Object类。

Throwable中的常用方法:

  • public void printStackTrace():打印异常的详细信息。
    包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得使用printStackTrace。
  • public String getMessage():获取发生异常的原因。

2- Error 和 Exception

Throwable可分为两类:Error错误)和Exception异常)。分别对应着java.lang.Errorjava.lang.Exception两个类。

看一下API:

image.png

Throwable不做过多关注,更多的是它的这两个子类。

1、Error

1.1 介绍

Error:Java虚拟机无法解决的严重问题。

如:JVM系统内部错误、资源耗尽等严重情况。

一般不编写针对性的代码进行处理。(如果出现Error问题,就回去改代码,后面说的try方式对它无效)

  • 例如:StackOverflowError(栈内存溢出)和OutOfMemoryError(堆内存溢出,简称OOM)。

看一下API:

image.png

1.2 举例

【举例1】

StackOverflowError(栈内存溢出)

public class ErrorTest {
    public static void main(String[] args) {
        //举例1:栈内存溢出StackOverflowError
        main(args); //递归--main方法中调用main方法
    }
}

🍻分析

main(args);

递归–main方法中调用main方法,每调用一次main方法,就进去一个栈帧,在栈空间有限的情况下,一直往里面放栈帧,总会满的。

🗃️输出

栈内存溢出:

image.png


【举例2】

OutOfMemoryError(堆内存溢出,简称OOM)

public class ErrorTest {
    public static void main(String[] args) {
		//举例2:堆内存溢出 OutOfMemoryError (简称OOM)
        byte[] arr=new byte[1024*1024*100]; //100mb
    }
}

🍻分析

new出来的结构在堆空间中呈现,若此时堆空间不足100mb,就会将堆空间占满,这时候堆空间就会报一个溢出异常。

现在我们做一个操作,“运行”->“编辑配置”:

image.png

然后针对当前模块,“修改选项”->“添加VM选项”:

image.png

就是虚拟机参数,将它设置为-Xms10m -Xmx10m ,前面的-Xms10m表示堆空间初始化的大小,后面的 -Xmx10m表示最大的堆空间大小。就是固定下来堆空间大小为10ms。如下:

image.png

🗃️输出

byte[] arr=new byte[1024*1024*100]; //100mb

显然此时100ms不够,运行一下就会有一个堆空间溢出

image.png

看见后缀是Error的,其实都是一个错误。

2、Exception

2.1 介绍

Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,需要使用针对性的代码进行处理,使程序继续运行。否则一旦发生异常,程序也会挂掉。(这一章要学习异常处理 ,实际上针对的是这个Exception,而Error处理不了)

看一下API:

image.png

例如:

  • 空指针访问
  • 试图读取不存在的文件
  • 网络连接中断
  • 数组角标越界

说明:

  1. 无论是Error还是Exception,还有很多子类,异常的类型非常丰富。当代码运行出现异常时,特别是我们不熟悉的异常时,不要紧张,把异常的简单类名,拷贝到API中去查去认识它即可。
  2. 我们本章讲的异常处理,其实针对的就是Exception。

image.png

2.2 编译时异常和运行时异常

Java程序的执行分为编译时过程运行时过程。有的错误只有在运行时才会发生。比如:除数为0,数组下标越界等。
image.png

因此,根据异常可能出现的阶段,可以将异常分为:

  • 编译时期异常(即checked异常、受检异常):在代码编译阶段,编译器就能明确警示当前代码可能发生(不是一定发生)xx异常,并明确督促程序员提前编写处理它的代码。如果程序员没有编写对应的异常处理代码,则编译器就会直接判定编译失败,从而不能生成字节码文件。通常,这类异常的发生不是由程序员的代码引起的,或者不是靠加简单判断就可以避免的,例如:FileNotFoundException(文件找不到异常)。
  • 运行时期异常(即runtime异常、unchecked异常、非受检异常):在代码编译阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何提示。只有等代码运行起来并确实发生了xx异常,它才能被发现。通常,这类异常是由程序员的代码编写不当引起的,只要稍加判断,或者细心检查就可以避免。
    • java.lang.RuntimeException类及它的子类都是运行时异常。比如:ArrayIndexOutOfBoundsException数组下标越界异常,ClassCastException类型转换异常。

运行时异常:通常编译的时候不报错,相当于编译的时候将它放过去了,就是没有检查它,即:非受检异常。

编译时异常:编译的时候就会报错,一上来就检查它了,即:受检异常。

☕在API中,怎么看哪个是编译时异常还是运行时异常呢?

这个地方,除了RuntimeException,其他都是编译时异常。如下:

image.png

点开它,里面都是运行时异常RuntimeException,如下:

image.png

我们需要熟悉一下常见的异常都有哪些,太多了也学不过来。

image.png

Error有时也可以归为“非受检异常”,因为编译时不报错,看上面蓝色方块。

3- Java异常体系结构

1、体系结构

java.lang.Throwable:异常体系的根父类

  • java.lang.Error:错误

    • Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理
      ​ |-----StackOverflowError (栈内存溢出)
      ​ |-----OutOfMemoryError (堆内存溢出,简称OOM)
  • java.lang.Exception:异常

    • 我们可以编写针对性的代码进行处理

    • 编译时异常:(受检异常) 在执行javac.exe命令时,出现的异常。
      |----- ClassNotFoundException(类找不到异常)
      |----- FileNotFoundException(文件找不到异常)
      |----- IOException(输入输出异常)

    • 运行时异常:(非受检异常) 在执行java.exe命令时,出现的异常。
      |---- ArrayIndexOutOfBoundsException (数组越界–用非法索引访问数组时抛出的异常)
      |---- NullPointerException (空指针异常)
      |---- ClassCastException (类转换异常)
      |---- NumberFormatException (数据格式化异常)
      |---- InputMismatchException (输入类型不一致)
      |---- ArithmeticException (算术异常)

2、运行时异常举例

  • ArrayIndexOutOfBoundsException (数组越界–用非法索引访问数组时抛出的异常)
  • NullPointerException (空指针异常)
  • ClassCastException (类转换异常)
  • NumberFormatException (数据格式化异常)
  • InputMismatchException (输入类型不一致)
  • ArithmeticException (算术异常)
2.1 ArrayIndexOutOfBoundsException

🗳️ArrayIndexOutOfBoundsException数组角标越界

🌱代码

package yuyi01;

import org.junit.Test;

public class ExceptionTest {
    @Test
    public void test1(){
        //数组角标越界 ArrayIndexOutOfBoundsException
        int[] arr=new int[10];
        System.out.println(arr[10]);
    }
}

🍺异常

image.png

2.2 NullPointerException

🗳️NullPointerException空指针异常

🌱代码1

package yuyi01;

import org.junit.Test;

public class ExceptionTest {
    @Test
    public void test2(){
        //空指针异常 NullPointerException
        String str="hello";
        str=null;   //指针指向为空
        System.out.println(str.toString());
    }
}

🍺异常

image.png


🌱代码2–一维数组

package yuyi01;

import org.junit.Test;

public class ExceptionTest {
    @Test
    public void test3(){
        //空指针异常 NullPointerException
        int[] arr=new int[10];  //一维数组
        arr=null;
        System.out.println(arr[0]);
    }
}

🍺异常

image.png


🌱代码3–二维数组

package yuyi01;

import org.junit.Test;

public class ExceptionTest {
    @Test
    public void test4(){
        //空指针异常 NullPointerException
        int[][] arr1=new int[10][]; //二维数组
        System.out.println(arr1[0][0]);
    }
}

🍺异常

image.png

只要对象指向的没有实体,调一个方法或者属性都算空指针。

2.3 ClassCastException

🗳️ClassCastException类转换异常

🌱代码

package yuyi01;

import org.junit.Test;

import java.util.Date;

public class ExceptionTest {

    @Test
    public void test5(){
        //类转换异常 ClassCastException
        Object obj=new String();    //new一个String对象,将它赋值给Object类
        //String str=(String) obj;    //这里不会出现强转异常
        Date date=(Date) obj;   //转换为别的类型就不行了
    }
}

🍺异常

image.png

父类引用指向的对象的类型是子类的时候才可以强制类型转换。

而Date和String算是平等的关系,都继承于Object,它们是兄弟关系,不能强转。

2.4 NumberFormatException

🗳️NumberFormatException数据格式化异常

🌱代码

package yuyi01;

import org.junit.Test;

public class ExceptionTest {
    @Test
    public void test6(){
        //NumberFormatException 数据格式化异常
        String str1="123";
        int i1 = Integer.parseInt(str1);  //可以将String类型的“123”转化为int类型的123

        String str2="abc";
        int i2 = Integer.parseInt(str2);    //不可以转换,会报错

        System.out.println(i1);
        System.out.println(i2);
    }
}

🍺异常

image.png

2.5 InputMismatchException

🗳️InputMismatchException输入类型不一致

🌱代码

package yuyi01;

import org.junit.Test;

import java.util.Scanner;

public class ExceptionTest {

    @Test
    public void test7(){
        //InputMismatchException 输入类型不一致
        Scanner scanner=new Scanner(System.in);
        int num= scanner.nextInt(); //若输入的不是int类型,则会报错
        System.out.println(num);
    }
}

🍺异常

image.png

2.6 ArithmeticException

🗳️ArithmeticException算术异常

🌱代码

package yuyi01;

import org.junit.Test;

public class ExceptionTest {
    @Test
    public void test8(){
        //ArithmeticException 算术异常
        int num=10;
        System.out.println(num/0);  //编译的时候不报错,运行的时候报错
    }
}

🍺异常

image.png

3、编译时异常举例

  • ClassNotFoundException(类找不到异常)
  • FileNotFoundException(文件找不到异常)
  • IOException(输入输出异常)
3.1 ClassNotFoundException

🗳️ClassNotFoundException类找不到异常

🌱代码

package yuyi01;

import org.junit.Test;

public class ExceptionTest {

    @Test
    public void test9(){ 
        //ClassNotFoundException 类找不到异常
        Class clz=Class.forName("java.lang.String");  //反射
    }
}

🍺异常

image.png

目前只能考虑先将它注释掉。

3.2 FileNotFoundException

🗳️FileNotFoundException文件找不到异常

🌱代码

package yuyi01;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;

public class ExceptionTest {

    @Test
    public void test10(){
        File file=new File("hello.txt");

        //FileNotFoundException 文件找不到异常
        FileInputStream fis=new FileInputStream(file);  //流直接操作文件

        //把文件内容直接读到内存中输出
        int data=fis.read();    //IOException 输入输出异常
        while(data!=-1){    //data为-1的时候退出,就是读完了
            System.out.print((char)data);
            data=fis.read();  //IOException 输入输出异常
        }

        //资源关闭
        fis.close();  //IOException 输入输出异常
    }
}

🍺异常

image.png

3.3 IOException

🗳️IOException输入输出异常

🌱代码

package yuyi01;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;

public class ExceptionTest {

    @Test
    public void test10(){
        File file=new File("hello.txt");

        //可能报FileNotFoundException 文件找不到异常
        FileInputStream fis=new FileInputStream(file);  //流直接操作文件

        //把文件内容直接读到内存中输出
        int data=fis.read();    //可能报IOException 输入输出异常
        while(data!=-1){    //data为-1的时候退出,就是读完了
            System.out.print((char)data);
            data=fis.read();  //可能报IOException 输入输出异常
        }

        //资源关闭
        fis.close();  //可能报IOException 输入输出异常
    }
}

🍺异常

读的时候可能不通畅:

image.png

结束的时候可能也不通畅:

image.png


☕补充

FileNotFoundExceptionIOException都是可能出现的异常,怎么处理呢?

先写一个文件:(字符集改为UTF-8)

image.png

将路径改为:"D:\\hello.txt"

如下:

image.png

"D:\\hello.txt",一条右斜线会报错(一条表示转义的意思),需要写两条。或者写反斜杠 /。

现在文件就能找到了,但为啥还是报错?

所以需要提前预知一下处理的事情,大家感受一下,throws出去,将可能会报的异常给处理了,如下:

image.png

来运行一下:

image.png

这里出问题的原因是因为刚才文件里面写的是汉字,一个汉字可能会占多个字节,此时代码int data=fis.read();是一个字节一个字节地读,以后讲IO流的时候会专门解决这个问题。

那就先写成英文吧:

image.png

再次运行:

image.png

刚才我们将异常处理了,那程序在运行当中出现异常了吗?

其实是没出现异常。但是不处理的话,编译又不让过。(虽然程序没有问题,但是也需要处理一下,未雨绸缪)

🌱代码

package yuyi01;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ExceptionTest {

    @Test
    public void test10() throws FileNotFoundException, IOException {
        File file=new File("D:\\hello.txt");

        //可能报FileNotFoundException 文件找不到异常
        FileInputStream fis=new FileInputStream(file);  //流直接操作文件

        //把文件内容直接读到内存中输出
        int data=fis.read();    //可能报IOException 输入输出异常
        while(data!=-1){    //data为-1的时候退出,就是读完了
            System.out.print((char)data);
            data=fis.read();  //可能报IOException 输入输出异常
        }

        //资源关闭
        fis.close();  //可能报IOException 输入输出异常
    }
}

4、代码

仅供参考。

🌱代码

package yuyi01;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.Scanner;

/**
 * ClassName: ExceptionTest
 * Package: yuyi01
 * Description:
 *
 * @Author 雨翼轻尘
 * @Create 2023/12/28 0028 10:28
 */
public class ExceptionTest {
    @Test
    public void test1(){
        //数组角标越界 ArrayIndexOutOfBoundsException
        int[] arr=new int[10];
        System.out.println(arr[10]);
    }

    @Test
    public void test2(){
        //空指针异常 NullPointerException
        String str="hello";
        str=null;   //指针指向为空
        System.out.println(str.toString());
    }

    @Test
    public void test3(){
        //空指针异常 NullPointerException
        int[] arr=new int[10];  //一维数组
        arr=null;
        System.out.println(arr[0]);
    }

    @Test
    public void test4(){
        //空指针异常 NullPointerException
        int[][] arr1=new int[10][]; //二维数组
        System.out.println(arr1[0][0]);
    }

    @Test
    public void test5(){
        //类转换异常 ClassCastException
        Object obj=new String();    //new一个String对象,将它赋值给Object类
        //String str=(String) obj;    //不会出现强转异常
        Date date=(Date) obj;   //转换为别的类型就不行了
    }

    @Test
    public void test6(){
        //NumberFormatException 数据格式化异常
        String str1="123";
        int i1 = Integer.parseInt(str1);  //可以将String类型的“123”转化为int类型的123

        String str2="abc";
        int i2 = Integer.parseInt(str2);    //不可以转换,会报错

        System.out.println(i1);
        System.out.println(i2);
    }

    @Test
    public void test7(){
        //InputMismatchException 输入类型不一致
        Scanner scanner=new Scanner(System.in);
        int num= scanner.nextInt(); //若输入的不是int类型,则会报错
        System.out.println(num);
    }

    @Test
    public void test8(){
        //ArithmeticException 算术异常
        int num=10;
        System.out.println(num/0);  //编译的时候不报错,运行的时候报错
    }

    //**********************以上是运行时异常,以下是编译时异常****************************

    @Test
    public void test9(){
        //ClassNotFoundException 类找不到异常
        //Class clz=Class.forName("java.lang.String");  //反射
    }

    @Test
    public void test10() throws FileNotFoundException, IOException {
        File file=new File("D:\\hello.txt");

        //可能报FileNotFoundException 文件找不到异常
        FileInputStream fis=new FileInputStream(file);  //流直接操作文件

        //把文件内容直接读到内存中输出
        int data=fis.read();    //可能报IOException 输入输出异常
        while(data!=-1){    //data为-1的时候退出,就是读完了
            System.out.print((char)data);
            data=fis.read();  //可能报IOException 输入输出异常
        }

        //资源关闭
        fis.close();  //可能报IOException 输入输出异常
    }
}

🍺输出结果

image.png
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/304534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用Python来制作一个微信聊天机器人

1. 效果展示 通过本地搭建一个flask服务器来接收信息,这里我简单使用展示,就没有对接收的信息进行处理了。 信息接收展示 发送信息展示 这里就直接使用python发送一个post请求即可,可以发送文字或者图片 代码展示 接收信息 #!/usr/bin/e…

JAVA:解析Event事件机制与应用举例

1、简述 Java事件机制是一种基于观察者模式的设计模式,用于处理对象之间的松耦合通信。本篇技术博客将深入探讨Java事件机制的原理,并通过实际应用举例展示如何在项目中灵活利用该机制。 2、基本原理 Java事件机制基于观察者模式,包含以下…

nacos源码本地调试

1:源码克隆 github地址:https://github.com/alibaba/nacos.git gitee镜像地址:https://gitee.com/mirrors/Nacos.git 本文通过IntelliJ IDEA 2023.3.2 (Ultimate Edition)构建,nacos版本为2.3.1 2:首先clone 等待…

作业--day42

界面设计 MyProWin::MyProWin(QWidget *parent): QMainWindow(parent) {/**********窗口主体**********///窗口大小this->setFixedSize(644, 493);this->setWindowTitle("QQ");this->setWindowIcon(QIcon("C:/Users/10988/Downloads/pictrue/pictrue/…

机器学习指南:如何学习机器学习?

机器学习 一、介绍 你有没有想过计算机是如何从数据中学习和变得更聪明的?这就是机器学习 (ML) 的魔力!这就像计算机科学和统计学的酷炫组合,计算机从大量信息中学习以解决问题并做出预测,就像人类一样。 …

【Java EE初阶九】多线程案例(线程池)

一、线程池的引入 引入池---->主要是为了提高效率; 最开始,进程可以解决并发编程的问题,但是代价有点大了,于是引入了 “轻量级进程” ---->线程 线程也能解决并发编程的问题,而且线程的开销比进程要小的多&…

分布式I/O应用于智慧停车场的方案介绍

客户案例背景 目前车位检测技术有磁电技术、超声波技术、红外线技术、图像识别车位技术。考虑到例如电磁干扰、信号干扰等的环境因素影响,通常会采用组合使用的方式进行,如采用不同的传感器、应用不同的协议等,以便提高车位检测的准确性和实时…

R语言频率分布直方图绘制教程

本篇笔记分享R语言绘制直方图的方法,通过多种展示风格对数据进行可视化,主要用到ggplot、ggpubr等包。 什么是直方图? 直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的柱子表示数…

现代 C++ 及 C++ 的演变

C 活跃在程序设计领域。该语言写入了许多新项目,而且据 TIOBE 排行榜数据显示,C 的受欢迎度和使用率位居第 4,仅次于 Python、Java 和 C。 尽管 C 在过去二十年里的 TIOBE 排名都位居前列(2008 年 2 月排在第 5 名,到…

从0开始python学习-46.pytest框架之通过yaml处理接口关联问题-针对变量处理

目录 1. 提取变量 1.1 提取方法 1.2 提取地方:响应的body,响应的cookie,响应头 1.3 提取方式: 1.4 示例:在能获取到对应token的yaml用例中写入 2.使用变量:封装一个通用extract_util.py 3. 调用测试用…

设计模式之过滤器模式

目录 1.简介 2.过滤器的实现 2.1.过滤器的角色 2.2.类图 2.3.具体实现 3.过滤器模式的优点 4.过滤器模式的不足 5.适用的场景 1.简介 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种结构型设计模式&…

5.5 THREAD GRANULARITY

性能调优中一个重要的算法决定是线程的粒度。有时,在每个线程中投入更多工作并使用更少的线程是有利的。当线程之间存在一些冗余工作时,就会产生这种优势。在当前一代设备中,每个SM的指令处理带宽有限。每个指令都消耗指令处理带宽&#xff0…

迎接人工智能的下一个时代:ChatGPT的技术实现原理、行业实践以及商业变现途径

课程背景 2023年,以ChatGPT为代表的接近人类水平的对话机器人,AIGC不断刷爆网络,其强大的内容生成能力给人们带来了巨大的震撼。学术界和产业界也都形成共识:AIGC绝非昙花一现,其底层技术和产业生态已经形成了新的格局…

【数据结构 | 二叉树入门】

数据结构 | 二叉树入门 二叉树概念:二叉树特点:二叉树的基本形态特殊二叉树满二叉树完全二叉树 二叉树的存储结构二叉树的遍历先序遍历中序遍历后序遍历 计算二叉树的节点个数计算叶子节点的个数树的高度求第k层节点个数 二叉树概念: 如下图…

【51单片机】延时函数delay的坑——关于无符号整型数据for语句“x >= 0“变成死循环

请认真看看以下延时函数是否正确,并且指出错误:(考考C语言功底) void delay_ms(unsigned int xms) //delay x ms {unsigned int x,y;for(xxms;x>0;x--)for(y124;y>0;y--); }废话少说,上正确代码: v…

python进阶 -- 日志装饰器详解

日志 日志:记录程序运行的时候,出现的问题,或者说验证流程是否正常 在实际工作中,python的脚本命令一般是放在服务器执行的linux系统 日志其实就是记录程序运行时出现的问题、或者正常的打印,协助出现问题的时解决排查…

以太网交换机——稳定安全,构筑数据之桥

交换机,起源于集线器和网桥等网络通信设备,它在性能和功能上有了很大的发展,因此逐渐成为搭建网络环境的常用的设备。 随着ChatGPT爆发,因为用户量激增而宕机事件频频发生,云计算应用催生超大规模算力需求,…

kubernetes Namespace Labels 详解

写在前面:如有问题,以你为准, 目前24年应届生,各位大佬轻喷,部分资料与图片来自网络 内容较长,页面右上角目录方便跳转 namespace 实现资源分组,label实现业务分组 Namespace 基础理论 最重…

Spring AOP(详解)

目录 1.AOP概述 2.AOP相关术语 3.Spring AOP的原理机制 3.1JDK动态代理 3.2 CGLIB动态代理 3.3简单代码展示 3.3.1JDK动态代理 3.3.2CGLIB动态代理 4.Spring的AOP配置 4.1pom.xml 4.2增强方法 4.3切点 4.4切面 5.基于注解的AOP配置 5.1.创建工程 5.2.增强 5.3AOP…

使用flet创建todo应用

使用 Flet 在 Python 中创建待办事项应用 Create To-Do app in Python with Flet 翻译官网教程https://flet.dev/docs/tutorials/python-todo,对一些地方进行了注释和修改。 安装flet Python版本需要3.8及以上,使用pip安装: pip install…