Java笔记021-异常-Exception

news2025/1/21 15:30:41

异常-Exception

看个实际问题和一段代码

运行下面的代码,看看有什么问题->引出异常和异常处理机制

package com12.exception_;

/**
 * @author 甲柒
 * @version 1.0
 * @title Exception01
 * @package com12.exception_
 * @time 2023/1/9 14:38
 */
public class Exception01 {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 0;
        //解读
        //1.num1 / num2 => 10 / 0
        //2.当执行到num1 / num2 因为num2 = 0,程序就会(抛出)异常 ArithmeticException
        //3.当抛出异常后,程序就退出了,崩溃了,下面的代码就不再执行
        //4.这样的程序 不好 不应该出现了一个不算致命的问题,就导致整个系统崩溃
        //5.Java设计者,提供了一个叫 异常处理机制来解决该问题
        int res = num1 / num2;
        System.out.println("程序继续运行...");
    }
}

解决方案-异常捕获

对异常进行捕获,保证程序可以继续运行

package com12.exception_;

/**
 * @author 甲柒
 * @version 1.0
 * @title Exception01
 * @package com12.exception_
 * @time 2023/1/9 14:38
 */
public class Exception01 {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 0;
        //解读
        //1.num1 / num2 => 10 / 0
        //2.当执行到num1 / num2 因为num2 = 0,程序就会(抛出)异常 ArithmeticException
        //3.当抛出异常后,程序就退出了,崩溃了,下面的代码就不再执行
        //4.这样的程序 不好 不应该出现了一个不算致命的问题,就导致整个系统崩溃
        //5.Java设计者,提供了一个叫 异常处理机制来解决该问题
//        int res = num1 / num2;
        //如果程序员,认为一段代码可能出现异常、问题,可以使用try-catch异常处理机制来解决
        //从而保证程序的健壮性
        //将该代码块->选中->快捷键 ctrl + alt + t -> 选中 try-catch
        //6.如果进行异常处理,那么即使出现了异常,程序可以继续执行
        try {
            int res = num1 / num2;
        } catch (Exception e) {
//            throw new RuntimeException(e);
//            e.printStackTrace();
            System.out.println("出现异常的原因是"+e.getMessage());//输出异常信息
        }
        System.out.println("程序继续运行...");
    }
}

异常介绍

基本概念

Java语言中,将程序执行中发生的不正常情况称为"异常"。(开发过程中的语法错误和逻辑错误不是异常)

执行过程中所发生的异常事件可分为两类

1、Error(错误):Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError[栈溢出]和OOM(out of memory),Error是严重错误,程序会崩溃。

2、Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等,Exception分为两大类:运行时异常[程序运行时,发生的异常]和编译时异常[编程时,编译器检查出的异常]。

异常体系图

异常体系图一览

异常体系图的小结

1、异常分为两大类,运行时异常和编译时异常

2、运行时异常,编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常

3、对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响

4、编译时异常,是编译器要求必须处置的异常。

常见的运行时异常

    • NullPointerException空指针异常

当应用程序试图在需要对象的地方使用null 时,抛出该异常,看案例演示。

package com12.exception_;

/**
 * @author 甲柒
 * @version 1.0
 * @title NullPointerException
 * @package com12.exception_
 * @time 2023/1/9 16:03
 */
public class NullPointerException {
    public static void main(String[] args) {
        String name = null;
        System.out.println(name.length());
    }
}
    • ArithmeticException数学运算异常

当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例,案例演示

package com12.exception_;

/**
 * @author 甲柒
 * @version 1.0
 * @title ArithmeticException
 * @package com12.exception_
 * @time 2023/1/9 16:06
 */
public class ArithmeticException {
    public static void main(String[] args) {
        int num1 = 100;
        int num2 = 0;
        int result = num1 / num2;
        System.out.println(result);
    }
}
    • ArrayIndexOutOfBoundsException数组下标越界异常

用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引

package com12.exception_;

/**
 * @author 甲柒
 * @version 1.0
 * @title ArrayIndexOutOfBoundsException
 * @package com12.exception_
 * @time 2023/1/9 16:09
 */
public class ArrayIndexOutOfBoundsException {
    public static void main(String[] args) {
        int[] arr = {1, 2, 4};
        for (int i = 0; i <= arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}
    • ClassCastException类型转换异常

当试图将对象强制转换为不是实例的子类时,抛出该异常。例如,以下代码将生成一个

package com12.exception_;

/**
 * @author 甲柒
 * @version 1.0
 * @title ClassCastException
 * @package com12.exception_
 * @time 2023/1/9 16:13
 */
public class ClassCastException {
    public static void main(String[] args) {
        A b = new B();//向上转型
        B b2 = (B) b;//向下转型,这里正确
        C c2 = (C) b;//这里抛出ClassCastException
    }
}

class A {
}

class B extends A {
}

class C extends A {
}
    • NumberFormatException数字格式不正确异常[]

当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常=>使用异常我们可以确保输入是满足条件数字。

package com12.exception_;

/**
 * @author 甲柒
 * @version 1.0
 * @title NumberFormatException
 * @package com12.exception_
 * @time 2023/1/9 16:17
 */
public class NumberFormatException {
    public static void main(String[] args) {
        String name = "4567";
        //将String 转成 int
        int num = Integer.parseInt(name);
        System.out.println(num);//4567
        String name2 = "甲柒";
        //将String 转成 int
        int num2 = Integer.parseInt(name2);//抛出NumberFormatException
        System.out.println(num2);
    }
}

编译异常

介绍

编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译

常见的编译异常

SQLException//操作数据库时,查询表可能发生异常

IOException//操作文件时,发生的异常

FileNotFoundException//当操作一个不存在的文件时,发生异常

ClassNotFoundException //加载类,而该类不存在时,异常

EOFException//操作文件,到文件未尾,发生异常

IllegalArguementException//参数异常

异常练习题

1、

package com12.exception_;

/**
 * @author 甲柒
 * @version 1.0
 * @title Exercise01
 * @package com12.exception_
 * @time 2023/1/9 16:28
 */
public class Exercise01 {
    public static void main(String[] args) {
        String friends[] = {"tom", "jack", "milan"};
        for (int i = 0; i < 4; i++) {
            //出现ArrayIndexOutOfBoundsException
            System.out.println(friends[i]);
        }
    }
}

2、

package com12.exception_;

/**
 * @author 甲柒
 * @version 1.0
 * @title Exercise02
 * @package com12.exception_
 * @time 2023/1/9 16:31
 */
public class Exercise02 {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat = null;
        System.out.println(cat.name);
        //出现NullPointerException
    }
}

class Cat {
    String name;
}

3、

package com12.exception_;

/**
 * @author 甲柒
 * @version 1.0
 * @title AAA
 * @package com12.exception_
 * @time 2023/1/9 16:39
 */
public class AAA {
    int x;//默认0

    public static void main(String[] args) {
        int y;
        AAA a = new AAA();
        y = 3 / a.x;//出现ArithmeticException
        System.out.println("program ends ok!");
    }
}

4、

package com12.exception_;

import java.util.Date;

/**
 * @author 甲柒
 * @version 1.0
 * @title Person
 * @package com12.exception_
 * @time 2023/1/9 16:42
 */
public class Person {
    public static void main(String[] args) {
        Object obj = new Date();
        Person person;
        person = (Person) obj;//出现ClassCastException
        System.out.println(person);
    }
}

异常处理

基本介绍

异常处理就是当异常发生时,对异常处理的方式

异常处理的方式

1、try-catch-finally

程序员在代码中捕获发生的异常,自行处理

2、throws

将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM

示意图

try-catch异常处理

1、Java提供try和catch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有多个数量的try...catch块。

2、基本语法

try {
    //可疑代码
    //将异常生成对应的异常对象,传递给catch块
}catch(异常){
    //对异常的处理
}
finally{
    //如果没有finally,语法是可以通过的
}

try-catch方式处理异常-注意事项

1、如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块

2、如果异常没有发生,则顺序执行try的代码块,不会进入到catch

3、如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码-finally{}

package com12.try_;

/**
 * @author 甲柒
 * @version 1.0
 * @title TryCatchDetail
 * @package com12.try_
 * @time 2023/1/9 17:06
 */
public class TryCatchDetail {
    public static void main(String[] args) {
        //解读
        //1、如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块
        //2、如果异常没有发生,则顺序执行try的代码块,不会进入到catch
        //3、如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码-finally{}
        try {
            String str = "甲柒";
            int a = Integer.parseInt(str);
            System.out.println("数字:" + a);
        } catch (NumberFormatException e) {
            System.out.println("异常信息="+e.getMessage());
        } finally {
            System.out.println("finally代码块被执行");
        }
        System.out.println("程序继续...");
    }
}

4、可以有多个catch语句,捕获不同的异常(进行不同的业务处里),要求父类异常在后,子类异常在前,比如(Exception在后,NullPointerException在前),如果发生异常,只会匹配一个catch,案例演示

package com12.try_;

/**
 * @author 甲柒
 * @version 1.0
 * @title TryCatchDetail02
 * @package com12.try_
 * @time 2023/1/9 17:14
 */
public class TryCatchDetail02 {
    public static void main(String[] args) {
        //解读
        //1.如果try代码块有可能有多个异常
        //2.可以使用多个catch分别捕获不同地异常,相应处理
        //3.要求子类异常写在前面,父类异常写在后面
        try {
            Person person = new Person();
            person = null;
            System.out.println(person.getName());//NullPointerException
            int n1 = 10;
            int n2 = 0;
            int result = n1 / n2;//ArithmeticException
        } catch (NullPointerException e) {
            System.out.println("空指针异常=" + e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println("算数异常=" + e.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
        }

    }
}

class Person {
    private String name = "jack";

    public String getName() {
        return name;
    }
}

5、可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑

try{
//代码...
}
finally{//总是执行
}
package com12.try_;

/**
 * @author 甲柒
 * @version 1.0
 * @title TryCatchDetail03
 * @package com12.try_
 * @time 2023/1/9 17:27
 */
public class TryCatchDetail03 {
    public static void main(String[] args) {
        try {
            int n1 = 10;
            int n2 = 0;
            System.out.println(n1 / n2);
        } finally {
            System.out.println("执行了finally...");
        }
        System.out.println("程序继续执行");
    }
}

try-catch练习题

1、

package com12.try_;

/**
 * @author 甲柒
 * @version 1.0
 * @title TryCatchExercise01
 * @package com12.try_
 * @time 2023/1/9 17:32
 */
public class TryCatchExercise01 {
    public static int method() {
        try {
            String[] names = new String[3];
            if (names[1].equals("tom")) {//NullPointerException
                System.out.println(names[1]);
            } else {
                names[3] = "甲柒";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        } catch (NullPointerException e) {//捕获
            return 3;
        } finally {//必须执行
            return 4;//返回4
        }
    }

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

2、

package com12.try_;

/**
 * @author 甲柒
 * @version 1.0
 * @title TryCatchExercise02
 * @package com12.try_
 * @time 2023/1/9 17:38
 */
public class TryCatchExercise02 {
    public static int method() {
        int i = 1;
        try {
            i++;//i=2
            String[] names = new String[3];
            if (names[1].equals("tom")) {//空指针异常
                System.out.println(names[1]);
            } else {
                names[3] = "甲柒";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        } catch (NullPointerException e) {
            return ++i;//i=3
        } finally {
            return ++i;//i=4
        }
    }

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

3、

package com12.try_;

/**
 * @author 甲柒
 * @version 1.0
 * @title TryCatchExercise03
 * @package com12.try_
 * @time 2023/1/9 17:42
 */
public class TryCatchExercise03 {
    public static int method() {
        int i = 1;
        try {
            i++;//i=2
            String[] names = new String[3];
            if (names[1].equals("tom")) {//空指针
                System.out.println(names[1]);
            } else {
                names[3] = "甲柒";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        } catch (NullPointerException e) {
            return ++i;//i=3 => 保存临时变量temp=3
        } finally {
            ++i;//i=4
            System.out.println("i=" + i);//i=4
        }
    }

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

try-catch-finally执行顺序小结

1、如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句

2、如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还需要执行finally里面的语句!

练习题

如果用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止

package com12.try_;

import java.util.Scanner;

/**
 * @author 甲柒
 * @version 1.0
 * @title TryCatchExercise04
 * @package com12.try_
 * @time 2023/1/9 17:51
 */
public class TryCatchExercise04 {
    public static void main(String[] args) {
        //如果用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止
        //思路
        //1. 创建Scanner对象
        //2. 使用无限循环,去接收一个输入
        //3. 然后将该输入的值,转成一个int
        //4. 如果在转换时,抛出异常,说明输入的内容不是一个可以转成int的内容
        //5. 如果没有抛出异常,则break该循环
        Scanner scanner = new Scanner(System.in);
        int num = 0;
        String inputStr = "";
        while (true) {
            System.out.println("请输入一个整数");
            inputStr = scanner.next();
            try {
                num = Integer.parseInt(inputStr);//这里可能抛出异常
                break;
            } catch (NumberFormatException e) {
                System.out.println("你输入的不是一个整数");
            }
        }
        System.out.println("你输入的值=" + num);
    }
}

throws异常处理

基本介绍

1、如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理

2、在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

快速入门

package com12.throws_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * @author 甲柒
 * @version 1.0
 * @title Throws01
 * @package com12.throws_
 * @time 2023/1/9 18:03
 */
public class Throws01 {
    public static void main(String[] args) {
    }

    public void f1() throws FileNotFoundException, NullPointerException, ArithmeticException {
        //创建了一个文件流对象
        //解读
        //1.这里的异常是一个FileNotFoundException编译异常
        //2.使用try-catch-finally
        //3.使用throws,抛出异常,让调用f1方法的调用者(方法)来处理
        //4. throws后面的异常类型可以方法中产生的异常类型,也可以是它的父类
        //5. throws 关键字后也可以是 异常列表,即可以抛出多个异常

//        try {
//            FileInputStream fis =new FileInputStream("d://aa.txt");
//        } catch (FileNotFoundException e) {
//            throw new RuntimeException(e);
//        }
        FileInputStream fis = new FileInputStream("d://aa.txt");
    }
}

注意事项和使用细节

1、对于编译异常,程序中必须处理,比如 try-catch或者throws

2、对于运行时异常,程序中如果没有处理,默认就是throws的方式处理[举例]

3、子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型[举例]

4、在throws过程中,如果有方法 try-catch,就相当于处理异常,就可以不必throws

package com12.throws_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * @author 甲柒
 * @version 1.0
 * @title ThrowsDetail
 * @package com12.throws_
 * @time 2023/1/9 18:15
 */
public class ThrowsDetail {
    public static void main(String[] args) {
        f2();
    }

    public static void f2() /*throws ArithmeticException*/ {
        //1、对于编译异常,程序中必须处理,比如 try-catch或者throws
        //2、对于运行时异常,程序中如果没有处理,默认就是throws的方式处理
        //3、子类重写父类的方法时,对抛出异常的规定:子类重写的方法,
        // 所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型
        //4、在throws过程中,如果有方法 try-catch,就相当于处理异常,就可以不必throws
        int n1 = 10;
        int n2 = 0;
        double result = n1 / n2;
    }

    public static void f1() {
        //这里大家思考问题调用f3()报错//老韩解读
        //1.因为f3()方法抛出的是一个编译异常
        //2.即这时,就要f1()必须处理这个编译异常
        //3.在f1()中,要么try-catch-finally,或者继续throws这个编译异常
//        f3();//抛出异常
    }

    public static void f3() throws FileNotFoundException {
        FileInputStream fis = new FileInputStream("d://aa.txt");
    }

    public static void f4() {
        //解读
        //1.在f4()中调用方法f5()是OK
        //2.原因是f5()抛出的是运行异常
        //3.而java中,并不要求程序员显示处理,因为有默认处理机制
        f5();
    }

    public static void f5() throws ArithmeticException {

    }
}

class Father {//父类

    public void method() throws RuntimeException {
    }
}

class Son extends Father {//子类

    //3、子类重写父类的方法时,对抛出异常的规定:子类重写的方法,
    // 所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型
    @Override
    public void method() throws NullPointerException {
    }
}

自定义异常

基本概念

当程序中出现了某些"错误",但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。

自定义异常的步骤

1、定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException

2、如果继承Exception,属于编译异常

3、如果继承RuntimeException,属于运行异常(一般来说继承RuntimeException)

当我们接收Person对象年龄时,要求范围在18-120之间,否则抛出一个自定义异常(要求继承RuntimeException),并给出提示信息

 package com12.customexception_;

import java.util.Scanner;

/**
 * @author 甲柒
 * @version 1.0
 * @title CustomException
 * @package com12.customexception_
 * @time 2023/1/9 20:18
 */
public class CustomException {
    public static void main(String[] args) {
        System.out.println("请输入年龄:");
        Scanner scanner = new Scanner(System.in);
        int age = scanner.nextInt();
        //要求范围在18-120之间,否则抛出一个自定义异常
        if (!(age >= 18 && age <= 120)) {
            //这里可以通过构造器 设置信息
            throw new AgeException("年龄需要在18-120之间");
        }
        System.out.println("你的年龄范围正确");
    }
}

//自定义一个异常
//解读
//1.一般情况下,自定义异常是继承RuntimeException
//2.即把自定义异常做成 运行时异常 好处是 可以使用默认的处理机制
//3.比较方便
class AgeException extends RuntimeException {
    public AgeException(String message) {//构造器
        super(message);
    }
}

throw和throws的区别

一览表

意义

位置

后面跟的东西

throws

异常处理的一种方式

方法声明处

异常类型

throw

手动生成异常对象的关键字

方法体中

异常对象

测试题-下面的测试输出什么

package com12.throws_;

/**
 * @author 甲柒
 * @version 1.0
 * @title ThrowException
 * @package com12.throws_
 * @time 2023/1/9 20:43
 */
public class ThrowException {
    public static void main(String[] args) {
        try {
            ReturnExceptionDemo.methodA();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        ReturnExceptionDemo.methodB();
    }
}

class ReturnExceptionDemo {
    static void methodA() {
        try {
            System.out.println("进入方法A");//1
            throw new RuntimeException("制造异常");//3
        } finally {
            System.out.println("用A方法的finally");//2
        }
    }

    static void methodB() {
        try {
            System.out.println("进入方法B");//4
            return;
        } finally {
            System.out.println("调用B方法的finally");//5
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mask RCNN网络源码解读(Ⅳ) --- Mask R-CNN论文解读

目录 1.Mask R-CNN简介 2.Mask分支 3.Mask R-CNN损失 4Mask分支预测使用 1.Mask R-CNN简介 回顾我们之前所说的图像分类、目标检测、语义分割的内容&#xff1a; 我们来看一下实例分割和语义分割的差别&#xff1a; Mask R-CNN不仅能够同时进行目标检测与分割&#xff0c;…

查找算法之二分查找

目录 二分查找 算法实现 “双闭区间”实现 算法实现 python C 两种表示对比 大数越界处理 优点与缺点 二分查找 二分查找&#xff0c;利用数据的有序性&#xff0c;通过每轮缩小一半搜索区间来查找目标元素。 使用二分查找有两个前置条件&#xff1a; 要求输入数据…

如何在GitLab上传本地项目

上传前需准备&#xff1a;需要安装Git&#xff0c;点击进入官网下载&#xff1a;Git 在本地上传GitLab项目的步骤目录介绍&#xff1a; 一、配置SSH秘钥&#xff08;仅针对本机首次上传GitLab项目&#xff09; 二、上传项目 1、新建一个空文件夹&#xff0c;并在该文件夹下右键…

Deque

Deque&#xff1a; “double ended queue&#xff08;双端队列&#xff09;”的缩写&#xff0c;通常读为“deck”&#xff1b; Deque是一个线性集合&#xff0c;支持在两端插入和移除元素。 Deque有三种用途&#xff1a; 双端队列(两端都可进出) Deque< Integer> de…

机器学习实战教程(十三):树回归基础篇

一、前言本篇文章将会讲解CART算法的实现和树的剪枝方法&#xff0c;通过测试不同的数据集&#xff0c;学习CART算法和树剪枝技术。二、将CART&#xff08;Classification And Regression Trees&#xff09;算法用于回归在之前的文章&#xff0c;我们学习了决策树的原理和代码实…

成功上岸字节全靠这份Redis技术笔记,深入浅出值得一看

前言 正如标题所说&#xff0c;我现在已经如愿以偿地进了字节&#xff01;之前自己一直待在一个不大不小的外包公司&#xff0c;每天做着重复的层删改查工作。直到22年年底&#xff0c;自己通过朋友的介绍拿到了字节的面试机会&#xff0c;自己在家复习了3个月&#xff0c;成功…

decltype类型指示符

decltype类型指示符一、什么是decltype类型指示符二、typeid运算符三、使用decltype指示符四、decltype和引用五、decltype(auto)六、本章代码汇总一、什么是decltype类型指示符 有时会遇到这种情况&#xff1a;希望从表达式的类型推断出要定义的变量的类型&#xff0c;但是不…

超实用的实用Shell脚本

一、Dos 攻击防范&#xff08;自动屏蔽攻击 IP&#xff09; 代码&#xff1a; #!/bin/bash DATE$(date %d/%b/%Y:%H:%M) LOG_FILE/usr/local/nginx/logs/demo2.access.log ABNORMAL_IP$(tail -n5000 $LOG_FILE |grep $DATE |awk {a[$1]}END{for(i in a)if(a[i]>10)print…

Spring 学习笔记2

1.spring设置JDBC链接池 classpath:jdbc.properties是有多个连接池时的写法&#xff0c;一般都用这种 还有就是配置文件里不要直接使用username&#xff0c;会被覆盖 使用${}来从文件里读取属性 <beans xmlns"http://www.springframework.org/schema/beans"xmlns…

bitmap原理+性能优化实践

目录 背景 总体结构 从RoaringBitmp说起 3.1arraycontainer 1.3.2 bitmapcontainer 1.3.3 runcontainer 上源码 Roaring64NavigableMap RoaringBitmap RoaringArray 三种Container ArrayContainer BitmapContainer RunContainer 工作应用 需求 分析 能否多线…

ArcGIS基础实验操作100例--实验75气体扩散空间分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验75 气体扩散空间分析 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

MySQL常用基础 - 小白必看(二)

MySQL数据库基本操作 一、DDL 概念&#xff1a;是一个数据定义语言 该语言部分包括&#xff1a; 1、对数据库的常用操作 创建数据库&#xff1a; 1、create database 数据库名 (直接删除) 2、create database if not exists 数据库名 &#xff08;判断数据库是否存在&…

视频的水印怎样去掉?这些去水印的方法值得你试试看

喜欢视频剪辑的你会不会经常遇到这种情况&#xff1a;每次上网查找的视频素材&#xff0c;保存下来后总是带有一些水印&#xff0c;这些水印不仅不够美观&#xff0c;而且还会遮挡住视频的一些部分&#xff0c;实在是烦人。如果你遇到这种情况&#xff0c;会很想知道“给视频无…

86、【栈与队列】leetcode ——39. 滑动窗口最大值:单调队列+滑动窗口(C++版本)

题目描述 239. 滑动窗口最大值 一、单调队列滑动窗口方法 本题的特点是维护一个窗口&#xff0c;在窗口不断向前移动时&#xff0c;获取其中的最大值。由于窗口在向前移动过程中&#xff0c;元素存在着进入和出去的连续顺序&#xff0c;与FIFO的特点类似。 故可考虑用队列实…

【数据结构】初识数据结构,十分钟带你玩转算法复杂度

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f95d;一、初识数据结构&#x1f95d;&#xff1a; 1.数据结构&#xff1a; 2.算法&#xff1a; &#x1f353;二、算法效率&#x1f353;&#xff1a; &#x1f348;三、算法复杂度&#x1f348;&#xff1a; 1.时…

4-1文件管理-文件系统基础

文章目录一.文件的基本概念二.文件的逻辑结构&#xff08;一&#xff09;无结构文件/流式文件&#xff08;二&#xff09;有结构文件1.顺序文件2.索引文件3.索引顺序文件4.直接文件/散列文件三.文件目录四.文件的物理结构/文件分配方式1.连续分配2.链接分配3.索引分配五.文件存…

数据结构与算法基础(王卓)(8)附:关于new的使用方法详解

part 1&#xff1a; C中new的用法&#xff08;不过就是&#xff09;如下&#xff08;几种用法&#xff09;&#xff1a; 1&#xff1a; new<数据类型> 分配&#xff1a; 指定类型的&#xff0c;大小为1的&#xff0c;内存空间&#xff1b; int *i new int;//注意&am…

13_3、Java的IO流之节点流的使用

一、FileReader和FileWriter的使用1、数据读入操作说明&#xff1a;①read():返回读入的第一个字符&#xff0c;当读到文档末尾&#xff0c;返回-1②异常的处理&#xff1a;为了保证流资源一定会执行关闭操作&#xff0c;要对异常进行try-catch-finally处理③对于读入操作&…

【PWA学习】1. 初识 PWA

什么是PWA PWA(Progressive Web Apps&#xff0c;渐进式 Web 应用)运用现代的 Web API 以及传统的渐进式增强策略来创建跨平台 Web 应用程序。这些应用无处不在、功能丰富&#xff0c;使其具有与原生应用相同的用户体验优势 我们需要理解的是&#xff0c;PWA 不是某一项技术&am…

MAC(m1)-VMWare Fusion CentOS8设置静态IP、SSH连接

在使用虚拟机的时候&#xff0c;默认情况下使用的DHCP协议&#xff08;根据网段自动分配ip&#xff09;分配的动态IP地址&#xff0c; 使得每次打开虚拟机后当前的IP地址都会发生变化&#xff0c;这样不方便管理。为了能够给当前虚拟机设置 一个静态IP地址&#xff0c;方便后…