Java异常简单介绍

文章目录

  • 1. 异常分类和关键字
    • 1.1 分类
    • 1.2 关键字
  • 2. Error
    • 2.1 Error定义
    • 2.2 常见的Error
      • 2.2.1 VirtualMachineError
      • 2.2.2 ThreadDeath
      • 2.2.3 LinkageError
      • 2.2.4 AssertionError
      • 2.2.5 InternalError
      • 2.2.6 OutOfMemoryError
        • 2.2.6.1 OOM原因
        • 2.2.6.2 OutOfMemoryError会导致宕机吗
      • 2.2.7 StackOverflowError
        • 2.2.7.1原因与解决策略
        • 2.2.7.2 StackOverFlowError会导致宕机吗
  • 3. Exception
    • 3.1 受检异常
      • 3.1.1 受检异常定义
      • 3.1.2 常见的受检异常
    • 3.2 非受检异常
      • 3.2.1 非受检异常定义
      • 3.2.2 常见的非受检异常
  • 4. 异常的处理方法
    • 4.1 使用 throws 关键字抛出,抛给调用者处理,抛到最后没有处理掉,则此请求线程异常
    • 4.2 try…catch捕获处理异常
  • 5.try catch finally 几种形式
  • 6. catch规则
  • 7. 异常的的两个重要方法
  • 8. finally规则
    • 8.1 f finally中代码不会执行的情况
      • 8.1.1 System.exit(int) 使程序提前终止
      • 8.1.2 线程中断
      • 8.1.3 系统级错误
      • 8.1.4 无限循环或死锁
    • 8.2 return 语句和 finally 块的执行顺序
  • 9. final finally finalize有什么区别
    • 9.1 final
    • 9.2 finally
    • 9.3 finalize()
  • 10. 重写抛出异常限制

异常结构图1

在这里插入图片描述

异常结构图2

在这里插入图片描述

1. 异常分类和关键字

1.1 分类

  • Error错误:系统处理不了的

  • Exception异常

    • CheckedException受检异常(编译时异常):因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错
    • UnCheckedException非受检异常(运行时异常):运行时才会发生的异常,在编写程序阶段不强制处理

1.2 关键字

try-catch-finally 结构用于异常捕获和处理,而 throw 和 throws 关键字分别用于抛出异常和声明方法可能抛出的异常。

  • try
    用于定义一个代码块,其中的代码可能会抛出异常。如果在try块中的代码发生异常,则控制权会立即转交给相应的catch块。
try {
    // 可能抛出异常的代码
} 
  • catch
    捕获并处理try块中抛出的异常。每个catch块对应一种可能发生的异常类型。
catch (ExceptionType1 e) {
    // 处理ExceptionType1类型的异常
} 
catch (ExceptionType2 e) {
    // 处理ExceptionType2类型的异常
}
  • finally
    finally块中的代码无论是否发生异常都会被执行。通常用于资源清理(如关闭文件、数据库连接等)。
finally {
    // 释放资源或其他必须执行的操作
}
  • throw
    用于显式地抛出一个异常对象。当方法内部检测到某种错误条件时,可以使用throw关键字来抛出一个异常。
if (someCondition) {
    throw new SomeException("Error message");
}
  • throws
    用在方法声明上,表示该方法可能会抛出某些受检异常,需要调用者负责处理这些异常。
public void someMethod() throws IOException, SQLException {
    // 方法体
}

2. Error

2.1 Error定义

  • Error 是一个继承自 Throwable 类的特殊类,它表示系统级的错误或严重的资源耗尽错误,通常是不可恢复的情况。与受检异常(Checked Exception)和运行时异常(Unchecked Exception - 继承自 RuntimeException)不同,程序员通常无法预防或处理这些错误。

  • 对于Error类型的异常,它们通常不是通过try-catch块来捕获并处理的,因为它们通常意味着应用程序无法继续正常运行,或者是JVM自身的问题。在实际开发中,更多关注的是如何避免触发这些严重错误以及对系统进行合理的监控和优化。

2.2 常见的Error

2.2.1 VirtualMachineError

此类错误代表JVM内部错误,如内存溢出(OutOfMemoryError)或栈空间不足(StackOverflowError)等。

2.2.2 ThreadDeath

当一个线程被另一个线程中断时抛出,虽然不推荐直接使用。

2.2.3 LinkageError

这类错误发生在类加载器加载类的过程中,例如找不到类定义(NoClassDefFoundError)、类文件格式错误(ClassFormatError)或者静态初始化失败(IncompatibleClassChangeError)等。

2.2.4 AssertionError

在启用断言的情况下,如果一个断言语句的结果为假,则会抛出此错误,用于开发者调试程序逻辑。

2.2.5 InternalError

Java虚拟机内部错误或条件出现异常情况,这种情况通常表明Java虚拟机本身存在bug。

2.2.6 OutOfMemoryError

是 Java 虚拟机(JVM)在运行时抛出的一种错误类型,它表明 JVM 已无法为应用程序分配更多内存。

2.2.6.1 OOM原因
  • Java堆空间溢出
    Java对象主要存储在堆内存中。当新创建的对象过多,或者大对象占用的空间过大且生命周期较长,导致堆空间被占满,而垃圾回收器又无法及时回收足够的内存供新对象使用时,就会抛出 java.lang.OutOfMemoryError: Java heap space 错误。 解决方案:可以通过增加JVM的堆内存大小,通过调整 -Xms(初始堆大小)和 -Xmx(最大堆大小)参数;另外,还需要检查代码逻辑,是否存在不必要的对象创建或长期持有大量数据的情况,优化内存使用,提高垃圾回收效率。

  • 方法区溢出(Metaspace 或 PermGen)
    在Java 8及以后版本中,永久代已被元空间(Metaspace)替代,而在更早的版本中,类信息、常量池、静态变量等数据会存储在永久代(PermGen)。如果动态加载的类数量过多或者字符串常量过大,可能导致方法区内存不足。 解决方案:对于Java 8及以上版本,可通过 -XX:MaxMetaspaceSize 设置元空间的最大大小;对于Java 7及更低版本,可使用 -XX:PermSize 和 -XX:MaxPermSize 参数来限制永久代大小。同时,减少无用类的生成以及优化字符串常量使用也是必要的。

  • 本地图像直方图缓存溢出
    在处理大型图像或大量图像时,也可能因为本地缓冲区(如DirectBuffer)不足而导致 OOM。 解决方案:根据应用需求适当增加允许使用的本地图像缓冲区大小,或者优化对这类资源的管理与释放。

总之,在遇到 OutOfMemoryError 时,应当首先查看错误的具体信息,了解是哪部分内存区域溢出,然后结合程序逻辑和JVM监控工具(如JVisualVM、jmap等)分析内存使用情况,找出内存泄漏点或过度消耗内存的地方,进而采取针对性的解决方案。

2.2.6.2 OutOfMemoryError会导致宕机吗
  • OutOfMemoryError 是Java虚拟机(JVM)在内存分配失败时抛出的一个严重错误。当JVM无法再为应用程序分配所需的内存时,它会抛出此异常,并且通常会导致受影响的应用程序或服务停止正常工作。

  • 对于一个长时间运行的服务来说,一旦出现 OutOfMemoryError,不仅当前请求可能无法完成,而且由于内存资源耗尽,其他正在执行的线程也可能会受到影响,导致系统整体性能急剧下降或者完全失效。虽然严格意义上说,它不会立即导致操作系统层面的“宕机”(即操作系统强制关闭),但对应用程序而言,其效果等同于宕机,因为应用程序将无法继续处理新的请求,甚至可能导致整个应用崩溃。

  • 在生产环境中,遭遇 OutOfMemoryError 通常意味着服务需要被立刻重启以恢复功能,如果不及时处理,可能会导致严重的业务中断和服务不可用。解决这类问题的关键在于合理配置JVM内存大小、优化代码以减少不必要的内存消耗以及排查并修复潜在的内存泄漏问题。

  • 现在大家的服务都是有监控的,产生了OOM,一般都是立即自动重启服务

2.2.7 StackOverflowError

是Java虚拟机(JVM)在运行时抛出的一种错误,它发生在Java程序的调用栈空间耗尽时。每个线程在执行方法调用时都会使用一个独立的调用栈来存储方法的局部变量、返回地址等信息。当递归调用过深或者在没有合理退出条件的情况下无限递归时,会持续占用栈空间,直到栈内存被占满为止,这时JVM就会抛出 java.lang.StackOverflowError。

2.2.7.1原因与解决策略
  • 无限递归
    这是最常见的导致 StackOverflowError 的情况,即一个方法不断地调用自身,而没有恰当的终止条件。例如,在计算阶乘或搜索算法中如果逻辑处理不当,可能会陷入死循环递归。 解决方案:检查递归函数的逻辑,确保存在正确的基线条件(基本情况),使得递归能在一定条件下终止。
  • 过大或过多的本地变量
    虽然不常见,但如果一个方法内部声明了大量局部变量,或者创建了非常大的数组作为局部变量,也可能导致栈空间不足。 解决方案:优化代码结构,减少不必要的局部变量,并考虑是否可以使用堆空间替代栈空间存储大型数据结构。
  • 线程栈大小设置过小
    每个线程默认分配的栈空间是有限的,可以通过JVM参数 -Xss 进行调整。如果应用程序中需要深度递归或大数量的局部变量,可能需要增大线程栈的大小。 解决方案:适当增加 -Xss 参数值以扩大单个线程的栈空间大小,但要注意过度增加可能导致总的线程数受限,因为总的虚拟机内存是有限的。

总之,遇到 StackOverflowError 时,应重点分析程序中的递归调用部分,确保有合理的退出条件,并且根据实际情况评估和调整JVM的线程栈大小配置。

2.2.7.2 StackOverFlowError会导致宕机吗
  • StackOverflowError 通常会导致受影响的线程停止执行,因为栈空间耗尽意味着无法继续进行方法调用和局部变量分配。对于单个线程来说,抛出 StackOverflowError 时,该线程会立即终止执行,并且错误会被抛出到异常处理机制中(如果没有捕获,则程序通常会崩溃)。

  • 在多线程环境中,即使一个线程由于 StackOverflowError 崩溃,其他线程仍然可能继续运行,因此整个Java虚拟机(JVM)不一定会立即宕机或退出。但是,如果受影响的是应用程序的关键线程或者多个线程同时遭遇栈溢出问题,那么整个应用程序可能会变得不稳定,甚至可能导致整个服务不可用,这在实际效果上等同于宕机。

  • 总之,虽然 StackOverflowError 不一定会直接导致整个系统的物理宕机(即操作系统层面的关闭),但它确实会导致Java应用出现严重故障,影响其正常功能,进而可能需要重启应用才能恢复服务。对于服务器端应用程序,这种错误状况应当被迅速识别并采取相应的恢复措施。

3. Exception

3.1 受检异常

3.1.1 受检异常定义

  • Java中的受检异常(Checked Exception)是指那些在编译阶段必须显式处理的异常。当一个方法可能会抛出受检异常时,开发者必须在该方法中使用 try-catch 块来捕获并处理这个异常,或者在方法签名上通过 throws 关键字声明该方法可能抛出的受检异常,将异常处理的责任传递给调用者。

  • 受检异常通常用于表示程序运行时可能会遇到的、正常情况下可以预见并且应当被合理处理的情况,
    要求开发人员在编写代码时显式处理。

  • Java 中的受检异常(Checked Exception)是指那些继承自 java.lang.Exception 类但不继承自 java.lang.RuntimeException 的所有异常类及其子类。这些异常在编译时必须被捕获或声明抛出,否则会导致编译错误。以下列出了一些常见的受检异常:

3.1.2 常见的受检异常

  • IOException:与输入/输出操作相关的异常。
  • SQLException:与数据库操作相关的异常。
  • ClassNotFoundException:当试图动态加载一个类但找不到该类定义时抛出的异常。
  • FileNotFoundException:试图打开一个不存在的文件时抛出的异常。
  • MalformedURLException:创建URL对象时,如果URL字符串格式不正确会抛出此异常。
  • SocketException:网络通信中与套接字操作有关的异常。
  • ParseException:解析日期、XML文档等数据结构时遇到格式错误所抛出的异常。
  • NoSuchMethodException:当试图调用一个不存在的方法时抛出的异常。

3.2 非受检异常

3.2.1 非受检异常定义

  • 非受检异常(Unchecked Exception)主要包括那些继承自 java.lang.RuntimeException 类及其子类的异常。

  • 非受检异常在编译阶段不会被检查,因此可以不用捕获或者在方法签名上声明。
    然而,在编写代码时,仍然需要关注这些异常,并在适当的地方进行处理以确保程序健壮性。

3.2.2 常见的非受检异常

  • NullPointerException:当试图访问或操作一个空引用时抛出。
  • IllegalArgumentException:当向方法传递了一个非法或不合适的参数时抛出。
  • ArrayIndexOutOfBoundsException:当试图访问数组的一个不存在的位置(即索引超出数组边界)时抛出。
  • ClassCastException:在强制类型转换过程中,目标类型与源对象实际类型不匹配时抛出。
  • NumberFormatException:当试图将字符串转换为数值类型,但该字符串格式不符合数值要求时抛出。
  • IllegalStateException:如果对象当前的状态不允许执行某个方法,则会抛出此异常,通常表示程序内部逻辑错误。
  • UnsupportedOperationException:当不支持请求的操作时抛出,比如某些方法在接口中声明但未实现。
  • ConcurrentModificationException:并发修改集合时可能会出现此异常,如在迭代过程中修改了集合结构。
  • ArithmeticException:算术运算发生错误时,例如除数为零。
  • NegativeArraySizeException:创建数组时指定的大小为负数。

示例

    public static void main(String[] args) {
        System.out.println(3 / 0);
    }

执行情况

Exception in thread “main” java.lang.ArithmeticException: / by zero

4. 异常的处理方法

方法a调用会声明抛出异常的方法b,方法a怎么做
在这里插入图片描述

4.1 使用 throws 关键字抛出,抛给调用者处理,抛到最后没有处理掉,则此请求线程异常

方法a在方法声明处继续抛出异常

public class ExceptionDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        m1();
    }

    private static void m1() throws ClassNotFoundException{

    }
}

4.2 try…catch捕获处理异常

方法a捕获异常

public class ExceptionDemo {
    public static void main(String[] args) {
        try {
            m1();
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    private static void m1() throws ClassNotFoundException{

    }
}

5.try catch finally 几种形式

不能缺少try,可以只有catch或finally

  • try + catch + finally
  • try + catch
  • try + finally

catch主要用来处理异常发生时的情况,可以做重试操作、打印日志或者继续抛出异常

finally用来做最后一定会执行的事情,比如资源释放、关闭

6. catch规则

  • catch后面的小括号中的类型可以是 具体的异常类型,也可以是该异常类型的 父类型。
  • catch可以写多个。建议catch的时候,精确的一个一个处理。这样有利于程序的调试。
  • catch写多个的时候,从上到下,必须遵守从小到大。
  • catch()异常类如果没有父子关系,可以用 | 分割。

7. 异常的的两个重要方法

  • String getMessage() 返回异常的详细消息字符串
  • void printStackTrace() 追踪堆栈异常信息(采用异步线程)

8. finally规则

在finally子句中的代码是最后执行的,并且是 一定会执行 的,即使try语句块中的代码出现了异常。
finally子句必须和try一起出现,不能单独编写。

8.1 f finally中代码不会执行的情况

在正常的异常处理流程和方法返回流程中,finally 块都会被执行。只有在上述特殊、极端的情况下,finally 块才可能不被执行。

8.1.1 System.exit(int) 使程序提前终止

如果在 try 或 catch 块中有 System.exit(int) 方法调用,并且该方法导致JVM退出,则finally块不会执行。

    public static void main(String[] args) throws ClassNotFoundException{

        try {
            System.out.println("try...");
            System.exit(0);
        } finally {
            System.out.println("finally...");
        }
    }

打印

>

8.1.2 线程中断

当运行代码的线程被中断(如通过 Thread.interrupt()),并且该中断导致了虚拟机的退出或者线程的死亡,那么 finally 块可能无法执行。

8.1.3 系统级错误

在极少数情况下,如果 JVM 遇到严重的系统错误或资源耗尽(如 StackOverflowError 或 OutOfMemoryError),而这些错误使得 JVM 无法正常完成 finally 块的执行时,finally 块可能不会被执行。

8.1.4 无限循环或死锁

若在 try 或 catch 块内出现了无限循环或死锁情况,使得控制流永远不能到达 finally 块,那么 finally 块当然也就无法执行。

8.2 return 语句和 finally 块的执行顺序

  • try块执行:
    当程序执行到 try 块时,首先会执行 try 块中的代码。
  • 异常处理:
    如果 try 块中抛出了一个异常,则控制权立即转移到相应的 catch 块(如果有)。
    如果没有异常发生,那么直接跳过 catch 块。
  • finally块执行:
    • 不论 try 块是否抛出异常以及是否被 catch 块捕获,finally 块总是会被执行。
    • 即使在 try 或 catch 块中有 return 语句,finally 块也会在方法返回前被执行。
  • 与return结合时的特殊情况:
    • 如果 try 或 catch 块中有 return 语句,在该 return 执行前,finally 块会先被执行。
    • 若 finally 块中也有 return 语句,那么它会覆盖之前 try 或 catch 块中的 return 语句的返回值,并且这个最终的 return 将结束整个方法调用。
    • 即使 finally 块中没有 return 语句,但对变量进行了修改操作,也可能影响到原计划通过 return 返回的值。

总结来说,finally 块的执行时机是在方法即将返回前的一个固定步骤,无论是否有异常或 return 语句出现。这意味着在方法正常返回或因异常退出前,都会先执行完 finally 块中的代码。

9. final finally finalize有什么区别

  • final, finally, 和 finalize 在Java中是三个不同的关键字,它们各自具有独特的用途和含义。
  • final 关键字主要用于定义不可变的类、方法和变量;finally 是Java异常处理结构的关键部分,用于确保某些清理代码总能被执行;而 finalize() 是Java对象生命周期结束前可能被调用的方法,不过由于其非确定性和低效性,现代Java编程实践中往往避免直接使用。

9.1 final

  • 修饰符(关键字),用于声明类、方法或变量的不可变性。
  • 当用在类上时,表示该类不能被其他类继承(即它是最终类)。
  • 当用在方法上时,表示该方法不能被子类重写(override)。
  • 当用在变量上时,如果是基本类型,则表示常量,一旦赋值后就不能再修改;如果是引用类型,则表示引用不可变,即不能改变它所指向的对象,但可以改变对象内部的状态。

9.2 finally

  • 是异常处理机制的一部分,在 try-catch-finally 结构中使用。
  • 不论 try 块中的代码是否抛出异常或者使用了 return 语句,finally 块中的代码都会被执行。
  • 主要用于资源清理工作,如关闭文件流、数据库连接等,确保无论程序正常执行还是出现异常都能正确释放资源。

9.3 finalize()

  • 是一个方法,属于 Object 类的一个protected方法。
  • 每个Java类都隐式继承自 Object 类,因此可以覆盖这个方法。
  • finalize() 方法会在对象即将被垃圾回收器回收时由系统自动调用一次,给对象提供最后一次自我清理的机会。
  • 注意:finalize() 方法并不保证一定会被调用,而且它的执行时机不确定,效率较低,所以不推荐依赖此方法进行重要资源的清理,而是应该通过 try-with-resources 或者显式 close 方法来管理资源。

10. 重写抛出异常限制

子类重写的方法抛出的受检异常类型应与父类方法声明的异常相容,
即子类重写的方法可以不抛出异常,也可以抛出父类方法所抛出异常的子类

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

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

相关文章

Python(wordcloud):根据文本数据(.txt文件)绘制词云图

一、前言 本文将介绍如何利用python来根据文本数据(.txt文件)绘制词云图,除了绘制常规形状的词云图(比如长方形),还可以指定词云图的形状。 二、相关库的介绍 1、安装相关的库 pip install jieba pip i…

c语言-指针进阶

文章目录 前言一、字符指针二、数组指针2.1 数组指针基础2.2 数组指针作函数参数 总结 前言 在c语言基础已经介绍过关于指针的概念和基本使用,本篇文章进一步介绍c语言中关于指针的应用。 一、字符指针 字符指针是指向字符的指针。 结果分析: "ab…

【常用排序算法】快速排序

##快速排序 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法 先从数列中取出一个数作为基准数pivot。分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放…

索引类型-哈希索引

一. 前言 前面我们简单介绍了数据库的B-Tree索引,下面我们介绍另一种索引类型-哈希索引。 二. 哈希索引的简介 哈希索引(hash index) 基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有索引列计算一个…

智能穿戴时代 | 米客方德SD NAND的崭新优势

SD NAND在智能穿戴上的优势 SD NAND是一种可以直接焊接在智能穿戴设备主板上的存储芯片,其小型化设计有助于紧凑设备尺寸,同时提供可靠的嵌入式存储解决方案。 这种集成设计减少了空间占用,同时确保设备在高度活动的环境中更为稳定。SD NAND…

【数据库系统概论】数据库恢复机制

系统文章目录 数据库的四个基本概念:数据、数据库、数据库管理系统和数据库系统 数据库系统的三级模式和二级映射 数据库系统外部的体系结构 数据模型 关系数据库中的关系操作 SQL是什么?它有什么特点? 数据定义之基本表的定义/创建、修改和…

[论文笔记] Megtron_LM 0、报错:vscode调试无法传进去参数 launch.json文件获取args参数

解决方法: 配置好launch.json文件后,应该点运行和调试里面的运行按钮。而不是直接点文件右上角的debug。 可以看到terminal中,如果没有正常加载launch.json,则参数中没有args的参数。 如果正常加载,可以看到args的很多…

Mysql 重要知识点1(含面试题1)

Mysql 知识点较多,这里涵盖了基本知识点,包括SQL语句 、重要面试题等。后面还有几章Mysql的知识点,分别是刷题总结与进阶优化SQL 面试题等。 目录 Mysql 安装Mysql 重要知识点SQL 重要语句面试题精选 Mysql 安装 1.官网下载mysql5.7版本压缩…

@Scheduled定时任务现状与改进

项目场景: 定时任务现状:每个项目都会有一些配置信息,这些信息我们是都放在一个配置服务中,这个服务会定时从配置表中加载所有配置存入本地JVM内存,以供调用方获取(调用方集成了配置服务的SDK,…

PyTorch数据并行(DP/DDP)浅析

一直以来都是用的单机单卡训练模型,虽然很多情况下已经足够了,但总有一些情况得上分布式训练: 模型大到一张卡放不下;单张卡batch size不敢设太大,训练速度慢;当你有好几张卡,不想浪费&#xf…

设计模式 七大原则

1.单一职责原则 单一职责原则(SRP:Single responsibility principle)又称单一功能原则 核心:解耦和增强内聚性(高内聚,低耦合)。 描述: 类被修改的几率很大,因此应该专注…

Python处理音频

从video中抽取audio from moviepy.editor import VideoFileClip from pydub import AudioSegmentvideo_path /opt/audio/audios/video1.mp4 audio_path /opt/audio/audios/video1.wav # 提取的音频保存路径# 加载视频文件 video VideoFileClip(video_path)# 提取音频 audi…

华为DriveONE电机控制器拆解实拍

如果说之前的问界M5、M7,华为让我们看到其在智能化上确实拥有遥遥领先的能力,那么在智界S7上,则让我们看到华为在动力、底盘这些硬件执行层面,竟然也有不输给很多车企的实力。1、华为电驱,全球第一?在智界S…

如何使用Cloudreve+Cpolar搭建个人PHP云盘系统并发布公网可访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了,各互联网大厂也纷纷加入战局&#…

微信小程序:flex常用布局

在我们平时微信小程序开发过程中为了页面能达到设计小伙伴的预期,追求还原度,那我们肯定会使用很多常用的布局方式,那我们今天就介绍一下微信小程序中常用的一些flex布局 1、常用flex布局 /** 水平垂直居中 **/ .flex-center {display: fle…

轻量化网络-MobileNet系列

整理备忘 目录 1. MobileNetV1 1.1 论文 1.2 网络结构 1.3 深度可分离卷积 1.4 计算量下降了 1.5 参数量下降了 2. MobileNetV2 2.1 论文 2.2 网络结构 2.3 效果 3. MobileNetV3 3.1 论文 3.2 网络结构 3.3 效果 1. MobileNetV1 1.1 论文 https://arxiv.org/a…

从0开始python学习-39.requsts库

目录 HTTP协议 1. 请求 2. 响应 Requests库 1. 安装 2. 请求方式 2.1 requests.请求方式(参数) 2.2 requests.request() 2.3 requests.session().request() 2.4 三种方式之间的关联 3. 请求参数 3.1 params:查询字符串参数 3.2 data:Form表单…

出现 No such instance field: ‘XXXX‘ 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 作为一个全栈的开发玩家,需要调试前后端的数据传输,方便发现问题所在! 在debug整个项目的时候,检查传输数据的时候,发现前端可以传输,但是后端一直拿不到 出现如下问题:No such instance field: parentModel 截图…

【git使用】了解三种git commit合并的使用场景(rebase、merge、cherry-pick)

参考 【Git学习笔记】逃不掉的merge和rebase-腾讯云开发者社区-腾讯云git merge 和 git rebase - 知乎git cherry-pick 教程 - 阮一峰的网络日志 简单理解各种合并的方法 线性合并,使用 rebase —— feature 分支开发,提交前拉取 master 最新改动进行…

Java Review - MapStruct_使用 Intellij 和 Maven Debug 分析MapStruct实现原理

文章目录 Java动态编译、JSR 269 和 MapStructJSR 269JSR 269的工作原理MapStruct示例 MappingProcessor调试编译期生成的代码 Java动态编译、JSR 269 和 MapStruct Java动态编译是指在运行时动态地将Java源代码编译成字节码并加载到Java虚拟机中执行。 JSR 269 是Java规范请求…