java异常 与 泛型<T>
文章目录
- 异常
- 认识异常
- 什么是异常?
- Java的异常体系
- 异常的基本处理
- 异常的作用?
- 自定义异常
- 编译时异常
- 自定义运行时异常
- 异常的处理方案
- 泛型
- 认识泛型
- 泛型类
- 泛型接口
- 泛型方法、通配符、上下限
- 泛型支持的类型
- 包装类
- 包装类具备的其他功能
- 总结
异常
认识异常
什么是异常?
异常代表程序出现的问题
int[] arr = {10, 20, 30};
System.out.println(arr[3]);
// 没有下标为3的元素
System.out.println(10 / 0);
// 除数不能为0
// 读取的文件不存在了
// 读取网络数据,断网了
Java的异常体系
这也是java帮我们写好的我们直接调用就好。
Java.lang.Throwable 这是所有异常的父级
- Error:代表的系统级别错误(属于严重问题),也就是说系统一旦出现问题,sun公司会把这些问题封装成Error对象给出来
( 说白了,Error是给sun公司自己用的,不是给我们程序员用的,因此我们开发人员不用管它) - Exception:叫异常,它代表的才是我们程序可能出现的问题,所以,我们程序员通常会用Exception以及它的孩子来封装程序出现的问题。
- 运行时异常:RuntimeException及其子类,编译阶段不会出现错误提醒,运行时出现的异常(如:数组索引越界异常)
- 编译时异常:编译阶段就会出现错误提醒的。(如:日期解析异常,这里是提示你这里的程序很容易出错。就算你写的是对的也会提示你。)
运行时异常
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class ExceptionDemo1 {public static void main(String[] args) {// 目标:认识异常的体系,搞清楚异常的基本作用。show();}// 定义一个方法认识运行时异常。public static void show(){System.out.println("==程序开始。。。。==");// 运行时异常的特点:编译阶段不报错,运行时出现的异常,继承自 RuntimeException。int[] arr = {1,2,3};// System.out.println(arr[3]); // ArrayIndexOutOfBoundsException 数组越界异常// System.out.println(10/0); // ArithmeticException 计算异常// 空指针异常String str = null;System.out.println(str);System.out.println(str.length()); // NullPointerException 空指针异常。// 表示程序试图在需要对象的地方使用 null 值进行操作。System.out.println("==程序结束。。。。==");}
}
编译时异常: 即使你写的代码是对的也会报错。
下面演示你的代码是正确的但是还会报错的情况。
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo1 {public static void main(String[] args) {// 目标:认识异常的体系,搞清楚异常的基本作用。try {// 监视代码,出现异常,会被catch拦截住这个异常show2();// ==程序开始。。。。==// Tue Jul 09 11:12:13 CST 2024// ==程序结束。。。。==} catch (Exception e) {e.printStackTrace(); // 打印这个异常信息}}// 定义一个方法认识编译异常。public static void show2() throws ParseException {System.out.println("==程序开始。。。。==");// 编译异常:编译阶段报错,编译不通过。String str = "2024-07-09 11:12:13";// 把字符串时间解析成Java中的一个日期对象。SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 虽然上面的正确但是我们还是报错加一个throws或者try...catch解决Date date = sdf.parse(str); // 这里编译时异常。提醒程序员仔细检查这里。// 编译时异常,提醒程序员这里的程序很容易出错,请您注意!// 这就很恶心了明明我们的代码是对的但是还提示异常。这时候就需要使用throws抛出异常// 说明,你不要管我。我已经知道这里容易出错,// 但是我已经百分百确定我写的是对的。你直接跑就行了。System.out.println(date);System.out.println("==程序结束。。。。==");}
}
下面演示你的代码是不正确的。但你认为你写对了直接加个throws或者try…catch让程序跑。
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class ExceptionDemo1 {public static void main(String[] args) {try {// 监视代码,出现异常,会被catch拦截住这个异常show2();} catch (Exception e) {e.printStackTrace(); // 打印这个异常信息// 提示千万别写错,但是你还是写错了hhhh~~~// java.text.ParseException}}// 定义一个方法认识编译异常。public static void show2() throws ParseException {System.out.println("==程序开始。。。。==");// 编译异常:编译阶段报错,编译不通过。String str = "2024-07-09 11:12:13";// 把字符串时间解析成Java中的一个日期对象。SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");Date date = sdf.parse(str); // 编译时异常,提醒程序员这里的程序很容易出错,请您注意!System.out.println(date);System.out.println("==程序结束。。。。==");}}
异常的基本处理
两种方式
- 抛出异常(throws)
- 捕获异常(try…catch)
快捷键
Alt+Enter:编译时异常调用 throws或者try…catch
Ctrl+Alt+T : throws / try…catch / if / for …
// 抛出异常(throws)
// 在方法上使用throws关键字,可以将方法内部出现的异常抛出去给调用者处理。
方法 throws 异常1 ,异常2 ,异常3 ..{…
}// 捕获异常(try…catch)
//直接捕获程序出现的异常。
...
try{// 监视可能出现异常的代码!}catch(异常类型1 变量){// 处理异常
}catch(异常类型2 变量){// 处理异常
}
...
实例在上一小节不再过多叙述。
异常的作用?
-
异常是用来定位程序bug的关键信息。
-
可以作为方法内部的一种特殊返回值,以便通知上层调用者,方法的执行问题。
public class ExceptionDemo2 {public static void main(String[] args) {// 目标:搞清楚异常的作用。System.out.println("程序开始执行...");try {System.out.println(div(10, 0));System.out.println("底层方法执行成功了~~~");} catch (Exception e) {e.printStackTrace();System.out.println("底层方法执行失败了~~");}System.out.println("程序结束执行...");// 程序开始执行...// 除数不能为0,您的参数有问题!// 底层方法执行失败了~~// 程序结束执行...// java.lang.Exception: 除数不能为0,您的参数有问题!// 下面定位信息// at com.itheima.demo1exception.ExceptionDemo2.div(ExceptionDemo2.java:28)// at com.itheima.demo1exception.ExceptionDemo2.main(ExceptionDemo2.java:8)}// 需求:求2个数的除的结果,并返回这个结果。public static int div(int a, int b) throws Exception {if(b == 0){System.out.println("除数不能为0,您的参数有问题!");// 可以返回一个异常给上层调用者,返回的异常还能告知上层底层是执行成功了还是执行失败了!!throw new Exception("除数不能为0,您的参数有问题!");}int result = a / b;return result;}
}
自定义异常
Java无法为这个世界上全部的问题都提供异常类来代表, 如果企业自己的某种问题,想通过异常来表示,以便用异常来管理该问题,那就需要自己来定义异常类了。
我们可以使用编译时异常也可以使用运行时异常
编译时异常
/*** 自定义的运行时异常* 1、继承RuntimeException做爸爸。* 2、重写RuntimeException的构造器。* 3、哪里需要用这个异常返回,哪里就throw*/
public class ItheimaAgeIllegalRuntimeException extends RuntimeException{public ItheimaAgeIllegalRuntimeException() {}public ItheimaAgeIllegalRuntimeException(String message) {super(message);}
}public class ExceptionDemo3 {public static void main(String[] args) {// 目标:认识自定义异常。System.out.println("程序开始。。。。");try {saveAge(300);System.out.println("成功了!");} catch (ItheimaAgeIllegalException e) {e.printStackTrace();System.out.println("失败了!");}System.out.println("程序结束。。。。");// 程序开始。。。。// 失败了!// 程序结束。。。。// com.itheima.demo1exception.ItheimaAgeIllegalException: 年龄非法 age 不能低于1岁不能高于200岁// at com.itheima.demo1exception.ExceptionDemo3.saveAge(ExceptionDemo3.java:21)// at com.itheima.demo1exception.ExceptionDemo3.main(ExceptionDemo3.java:8)}// 需求:我们公司的系统只要收到了年龄小于1岁或者大于200岁就是一个年龄非法异常。public static void saveAge(int age) throws ItheimaAgeIllegalException {if(age < 1 || age > 200){// 年龄非法;抛出去一个异常。throw new ItheimaAgeIllegalException("年龄非法 age 不能低于1岁不能高于200岁");}else {System.out.println("年龄合法");System.out.println("保存年龄:" + age);}}
}
自定义运行时异常
- 定义一个异常类继承RuntimeException.
- 重写构造器。
- 通过throw new 异常类(xxx)来创建异常对象并抛出。
特点:编译阶段不报错,运行时才可能出现!提醒不属于激进型。
/*** 自定义的运行时异常* 1、继承RuntimeException做爸爸。* 2、重写RuntimeException的构造器。* 3、哪里需要用这个异常返回,哪里就throw*/
public class ItheimaAgeIllegalRuntimeException extends RuntimeException{public ItheimaAgeIllegalRuntimeException() {}public ItheimaAgeIllegalRuntimeException(String message) {super(message);}
}public class ExceptionDemo4 {public static void main(String[] args) {// 目标:认识自定义异常-运行时异常System.out.println("程序开始。。。。");try {saveAge(300);System.out.println("成功了~");} catch (Exception e) {e.printStackTrace();System.out.println("失败了");}System.out.println("程序结束。。。。");// 程序开始。。。。// 失败了// 程序结束。。。。// com.itheima.demo1exception.ItheimaAgeIllegalRuntimeException: 年龄非法 age 不能低于1岁不能高于200岁// at com.itheima.demo1exception.ExceptionDemo4.saveAge(ExceptionDemo4.java:21)// at com.itheima.demo1exception.ExceptionDemo4.main(ExceptionDemo4.java:8)}// 需求:我们公司的系统只要收到了年龄小于1岁或者大于200岁就是一个年龄非法异常。public static void saveAge(int age) {if(age < 1 || age > 200){// 年龄非法;抛出去一个异常。throw new ItheimaAgeIllegalRuntimeException("年龄非法 age 不能低于1岁不能高于200岁");}else {System.out.println("年龄合法");System.out.println("保存年龄:" + age);}}
}
自定义编译时异常
- 定义一个异常类继承Exception.
- 重写构造器。
- 通过throw new 异常类(xxx) 创建异常对象并抛出。
特点:编译阶段就报错,提醒比较激进
/*** 自定义的编译时异常* 1、继承Exception做爸爸。* 2、重写Exception的构造器。* 3、哪里需要用这个异常返回,哪里就throw*/
public class ItheimaAgeIllegalException extends Exception{public ItheimaAgeIllegalException() {}public ItheimaAgeIllegalException(String message) {super(message);}
}public class ExceptionDemo3 {public static void main(String[] args) {// 目标:认识自定义异常。System.out.println("程序开始。。。。");try {saveAge(300);System.out.println("成功了!");} catch (ItheimaAgeIllegalException e) {e.printStackTrace();System.out.println("失败了!");}System.out.println("程序结束。。。。");}// 需求:我们公司的系统只要收到了年龄小于1岁或者大于200岁就是一个年龄非法异常。public static void saveAge(int age) throws ItheimaAgeIllegalException {if(age < 1 || age > 200){// 年龄非法;抛出去一个异常。throw new ItheimaAgeIllegalException("年龄非法 age 不能低于1岁不能高于200岁");}else {System.out.println("年龄合法");System.out.println("保存年龄:" + age);}}
}
注意:开发时一般使用运行时异常
异常的处理方案
方案1
1、底层异常层层往上抛出,最外层捕获异常,记录下异常信息,并响应适合用户观看的信息进行提示
方案2
2、最外层捕获异常后,尝试重新修复
抛出异常(throws)
在方法上使用throws关键字,可以将方法内部出现的异常抛出去给调用者处理。
方法 throws 异常1 ,异常2 ,异常3 ..{…
}
// 推荐方式
方法 throws Exception{
}
// Exception代表可以捕获一切异常
捕获异常(try…catch)
直接捕获程序出现的异常。
try{
// 监视可能出现异常的代码!
}catch(异常类型1 变量){
// 处理异常
}catch(异常类型2 变量){// 处理异常}...// 推荐方式
try{// 可能出现异常的代码!
}catch (Exception e){e.printStackTrace(); // 直接打印异常对象的信息
}
// Exception代表可以捕获一切异常
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class ExceptionDemo5 {public static void main(String[] args) {// 目标:掌握异常的处理方案1: 底层异常都抛出去给最外层调用者,最外层捕获异常,记录异常,响应合适信息给用户观看。System.out.println("==程序开始。。。。==");try {show();System.out.println("这次操作成功了~~~");} catch (Exception e) {e.printStackTrace();// 捕获异常,记录异常,打印错误给程序员观看。System.out.println("这次操作失败了~~~");// 捕获异常,记录异常,响应合适信息给用户观看。}System.out.println("==程序结束。。。。==");// ==程序开始。。。。==// java.text.ParseException: Unparseable date: "2024-07-09 11:12:13"// at java.base/java.text.DateFormat.parse(DateFormat.java:399)// at com.itheima.demo1exception.ExceptionDemo5.show(ExceptionDemo5.java:29)// at com.itheima.demo1exception.ExceptionDemo5.main(ExceptionDemo5.java:15)// 这次操作失败了~~~// ==程序结束。。。。==}public static void show() throws Exception {// 编译异常:编译阶段报错,编译不通过。String str = "2024-07-09 11:12:13";// 把字符串时间解析成Java中的一个日期对象。SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");Date date = sdf.parse(str); // 编译时异常,提醒程序员这里的程序很容易出错,请您注意!System.out.println(date);InputStream is = new FileInputStream("D:/meinv.png");}
}
import java.util.Scanner;
public class ExceptionDemo6 {public static void main(String[] args) {// 目标:掌握异常的处理方案2:捕获异常对象,尝试重新修复。// 接收用户的一个定价System.out.println("程序开始。。。。");while (true) {try {double price = userInputPrice();System.out.println("用户成功设置了商品定价:" + price);break;} catch (Exception e) {System.out.println("您输入的数据是瞎搞的,请不要瞎输入价格!");}}// System.out.println("程序结束。。。。");// 程序开始。。。。// 请您输入商品定价:// qw// 您输入的数据是瞎搞的,请不要瞎输入价格!// 请您输入商品定价:// 1// 用户成功设置了商品定价:1.0// 程序结束。。。。}public static double userInputPrice(){Scanner sc = new Scanner(System.in);System.out.println("请您输入商品定价:");double price = sc.nextDouble();return price;}
}
泛型
认识泛型
定义类、接口、方法时,同时声明了一个或者多个类型变量(如:)
称为泛型类、泛型接口,泛型方法、它们统称为泛型。
public class ArrayList<E>{. . .
}
ArrayList<String> list = new ArrayList<String>();
MyArrayList<String> mlist = new MyArrayList<>(); // JDK 7开始支持的后面类型可以不写
作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。
泛型的本质:把具体的数据类型作为参数传给类型变量。
import java.util.ArrayList;
public class GenericDemo1 {public static void main(String[] args) {// 目标:认识泛型,搞清楚使用泛型的好处。// ArrayList<T> list = new ArrayList<T>(); 这可以让程序员自己选择类型。ArrayList<String> list = new ArrayList<>();list.add("java");list.add("php");// 获取数据。for (int i = 0; i < list.size(); i++) {String s = list.get(i);System.out.println(s);}}
}
泛型类
类名后面跟
// 修饰符 class 类名<类型变量,类型变量,…> { }
public class ArrayList<E>{ ... }
// 注意:类型变量建议用大写的英文字母,常用的有:E、T、K、V 等
import java.util.ArrayList;
// 自定义泛型类
public class MyArrayList<E> {private ArrayList list = new ArrayList();public boolean add(E e){list.add(e);return true;}public boolean remove(E e){return list.remove(e);}@Overridepublic String toString() {return list.toString();}
}
public class GenericDemo2 {public static void main(String[] args) {// 需求:请您模拟ArrayList集合自定义一个集合MyArrayList.// MyArrayList<String> list = new MyArrayList<String>();MyArrayList<String> mlist = new MyArrayList<>(); // JDK 7开始支持的后面类型可以不写mlist.add("hello");mlist.add("world");mlist.add("java");mlist.add("前端");System.out.println(mlist.remove("world"));// trueSystem.out.println(mlist);// [hello, java, 前端]}
}
泛型接口
// 修饰符 interface 接口名<类型变量,类型变量,…> { . .. }
public interface A<E>{ ... }
注意:类型变量建议用大写的英文字母,常用的有:E、T、K、V 等
演示
public class Teacher { }
public class Student { }
package com.itheima.demo3genericity;
// 自定义泛型接口
public interface Data<T> {void add(T t);void delete(T t);void update(T t);T query(int id);
}
public class StudentData implements Data<Student>{@Overridepublic void add(Student student) { }@Overridepublic void delete(Student student) { }@Overridepublic void update(Student student) { }@Overridepublic Student query(int id) {return new Student();}
}
public class TeacherData implements Data<Teacher>{@Overridepublic void add(Teacher teacher) { }@Overridepublic void delete(Teacher teacher) { }@Overridepublic void update(Teacher teacher) { }@Overridepublic Teacher query(int id) {return new Teacher();}
}
public class GenericDemo3 {public static void main(String[] args) {// 需求:项目需要对学生数据/老师数据都要进行增删改查操作StudentData studentData = new StudentData();studentData.add(new Student());studentData.delete(new Student());Student s = studentData.query(1);}
}
泛型方法、通配符、上下限
// 修饰符 <类型变量,类型变量,…> 返回值类型 方法名(形参列表) { }
// 正确写法
// 修饰符 <泛型> 返回值 方法名
public static <T> void test(T t){ }
// 错误写法
public E get(int index){return (E) arr[index];
}
// 这才上面的正确写法
public <T> T get(int index) {return (T) arr[index];
}
public class Student { }
public class GenericDemo4 {public static void main(String[] args) {// 需求:打印任意数组的内容。String[] names = {"赵敏", "张无忌", "周芷若", "小昭"};printArray(names);Student[] stus = new Student[3];printArray(stus);Student max = getMax(stus);String max2 = getMax(names);}public static <T> void printArray(T[] names){ }public static <T> T getMax(T[] names){return null;}
}
通配符
就是 “?” ,可以在“使用泛型”的时候代表一切类型; E T K V 是在定义泛型的时候使用。
public class Car { }
public class BYD extends Car{ }
public class LX extends Car{ }
public class Xiaomi extends Car{ }
// GenericDemo5.java
import java.util.ArrayList;
public class GenericDemo5 {public static void main(String[] args) {// 目标:理解通配符和上下限。ArrayList<Xiaomi> xiaomis = new ArrayList<>();xiaomis.add(new Xiaomi());xiaomis.add(new Xiaomi());xiaomis.add(new Xiaomi());go(xiaomis);ArrayList<BYD> byds = new ArrayList<>();byds.add(new BYD());byds.add(new BYD());byds.add(new BYD());go(byds);}// 需求:开发一个极品飞车的游戏。// 不能写public static void go(ArrayList<Car> cars) // 虽然Xiaomi和BYD是Car的子类,但是 ArrayList<Xiaomi> ArrayList<BYD>和 ArrayList<Car> 是没有半毛钱关系!// 也不能写public static void go(ArrayList<T> cars) 因为T只能在定义的时候使用。// 所以只能另外开发一个用来使用泛型的符号。于是有了?public static void go(ArrayList<?> cars) {}
}
泛型的上下限:
- 泛型上限: ? extends Car: ? 能接收的必须是Car或者其子类 。(常用)
- 泛型下限: ? super Car : ? 能接收的必须是Car或者其父类。
public class Car { }
public class BYD extends Car{ }
public class LX extends Car{ }
public class Xiaomi extends Car{ }
// GenericDemo5.java
import java.util.ArrayList;
public class GenericDemo5 {public static void main(String[] args) {// 目标:理解通配符和上下限。ArrayList<Xiaomi> xiaomis = new ArrayList<>();xiaomis.add(new Xiaomi());xiaomis.add(new Xiaomi());xiaomis.add(new Xiaomi());go(xiaomis);ArrayList<BYD> byds = new ArrayList<>();byds.add(new BYD());byds.add(new BYD());byds.add(new BYD());go(byds);// ArrayList<Dog> dogs = new ArrayList<>();
// dogs.add(new Dog());
// dogs.add(new Dog());
// dogs.add(new Dog());
// go(dogs);}// 需求:开发一个极品飞车的游戏。// 对于public static void go(ArrayList<?> cars) 来说我们不仅仅可以传进来一只车对象,还可以传进来其他的比如狗这显然不是我们要的。// 于是发明了给这个?加指定范围。// 泛型上限: ? extends Car: ? 能接收的必须是Car或者其子类 。这样再来加个狗对象就会报错public static void go(ArrayList<? extends Car> cars) {}
}
泛型支持的类型
泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。
基本类型的数据 |
---|
byte |
short |
int |
long |
char |
float |
double |
boolean |
包装类
包装类就是把基本类型的数据包装成对象的类型。
基本数据类型 | 对应的包装类(引用数据类型) |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
为什么要引入包装类
import java.util.ArrayList;
public class GenericDemo6 {public static void main(String[] args) {// 目标:搞清楚泛型和集合不支持基本数据类型,只能支持对象类型(引用数据类型)。ArrayList<int> list = new ArrayList<>();list.add(12)// 泛型擦除:泛型工作在编译阶段,等编译后泛型就没用了,所以泛型在编译后都会被擦除。所有类型会恢复成Object类型// 于是有了 Object o = 12。 但是12并不是一个对象// 为了实现万物皆对象,于是有了基本数据类型的包装类。}
}
基本类型的数据包装成对象的方案 |
---|
public Integer(int value):已过时 |
public static Integer valueOf(int i) |
为什么第一种方法过时了。
import java.util.ArrayList;
public class GenericDemo6 {public static void main(String[] args) {// 把基本数据类型变成包装类对象。// 手工包装:// Integer i = new Integer(100); // 过时Integer it1 = Integer.valueOf(100); // 推荐的// 缓存了好多已经封装好的对象,最低的-128最高的127// valueof方法已经提前在数组里封装好了-128-127的所有对象,这些对象已经new好了。// 因为-128-127在编程中出现的比较多。他并不希望每次使用都去创建新的对象。// 创建新的对象占内存Integer it2 = Integer.valueOf(100); // 推荐的System.out.println(it1 == it2);// true是同一个地址Integer it3 = Integer.valueOf(130);Integer it4 = Integer.valueOf(130);System.out.println(it3 == it4);// false不是同一个地址}
}
自动装箱:基本数据类型可以自动转换为包装类型。
自动拆箱:包装类型可以自动转换为基本数据类型。
import java.util.ArrayList;
public class GenericDemo6 {public static void main(String[] args) {// 自动装箱成对象:基本数据类型的数据可以直接变成包装对象的数据,不需要额外做任何事情Integer it11 = 130;Integer it22 = 130;System.out.println(it11 == it22);// 自动拆箱:把包装类型的对象直接给基本类型的数据int i = it11;System.out.println(i);ArrayList<Integer> list = new ArrayList<>();list.add(130); // 自动装箱list.add(120); // 自动装箱int rs = list.get(1); // 自动拆箱}
}
包装类具备的其他功能
可以把基本类型的数据转换成字符串类型。
public static String toString(double d) |
---|
public String toString() |
可以把字符串类型的数值转换成数值本身对应的真实数据类型。
public static int parseInt(String s) |
---|
public static Integer valueOf(String s) |
import java.util.ArrayList;
public class GenericDemo6 {public static void main(String[] args) {// 包装类新增的功能:// 1、把基本类型的数据转换成字符串。int j = 23;String rs1 = Integer.toString(j); // "23"System.out.println(rs1 + 1); // 231Integer i2 = j;String rs2 = i2.toString(); // "23"System.out.println(rs2 + 1 ); // 231String rs3 = j + "";System.out.println(rs3 + 1 ); // 231System.out.println("-----------------------------------------------------------------------");// 2、把字符串数值转换成对应的基本数据类型(很有用)。String str = "98";// int i1 = Integer.parseInt(str);int i1 = Integer.valueOf(str);System.out.println(i1 + 2);String str2 = "98.8";
// double d = Double.parseDouble(str2);double d = Double.valueOf(str2);System.out.println(d + 2);}
}
总结
为什么要有包装类,包装类有哪些?
- 为了万物皆对象,并且泛型和集合都不支持基本类型,支持包装类
- 8种,int -> Integer , char -> Character,其他的都是首字母大写
包装类提供了哪些常用的功能?
可以把基本类型的数据转换成字符串类型。
public static String toString(double d) |
---|
public String toString() |
可以把字符串类型的数值转换成真实的数据类型。
public static int parseInt(String s) |
---|
public static Integer valueOf(String s) |
相关文章:
java异常 与 泛型<T>
文章目录 异常认识异常什么是异常?Java的异常体系异常的基本处理异常的作用? 自定义异常编译时异常自定义运行时异常 异常的处理方案 泛型认识泛型泛型类泛型接口泛型方法、通配符、上下限泛型支持的类型包装类包装类具备的其他功能总结 异常 认识异常 …...
齐次坐标系统:什么是齐次坐标?为什么要引入齐次坐标?
齐次坐标系统:计算机图形学的基础 在计算机图形学、计算机视觉、相机标定、三维建模等领域,齐次坐标是一个非常重要的数学工具。本文将介绍:齐次坐标的基本概念、数学原理、我们为什么要引入齐次坐标、及其在实际应用中的价值。 文章目录 齐…...
基于XGBoost的异烟酸生产收率预测:冠军解决方案解析
1. 引言 在化工生产领域,准确预测产品收率对优化工艺流程、降低生产成本具有重要意义。本文以异烟酸生产为研究对象,通过机器学习方法构建预测模型,在包含10个生产步骤、42个工艺参数的数据集上实现高精度收率预测。该方案在工业竞赛中斩获冠军,本文将深度解析其技术实现细…...
vue3动态路由
要想实现vitevue-router实现动态路由我们需要用到 1. addRoute() 官方文档中addRoute的使用 当我们添加一个主路由的时候 router.addRoute({ path: /permission, name: permission, component: () > import(xxxxx)}) 添加子路由也就是嵌套路由 router.addRoute(主路由的…...
Tkinter进度条与状态栏
在图形用户界面(GUI)应用中,进度条和状态栏是非常常见的控件,它们可以有效地向用户显示操作进度、状态信息或者任务完成情况。Tkinter提供了内置的控件和方法来实现进度条和状态栏的功能。在这一章中,我们将学习如何在Tkinter应用中使用进度条和状态栏来提升用户体验。 1…...
NModbus 库在 C# 中的使用
以下是关于 NModbus 库在 C# 中的使用方法 的详细指南,涵盖从安装到实际通信的完整流程: 1. 安装 NModbus 库 通过 NuGet 包管理器安装: Install-Package NModbus 或使用 .NET CLI: dotnet add package NModbus 2. 基础使用示例 2.1 创建 Modbus TCP 主站(Master) …...
大模型到底是怎么产生的?一文了解大模型诞生全过程
前言 大模型到底是怎么产生的呢? 本文将从最基础的概念开始,逐步深入,用通俗易懂的语言为大家揭开大模型的神秘面纱。 大家好,我是大 F,深耕AI算法十余年,互联网大厂核心技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 【专栏介绍】: 欢迎关注《…...
算法差分详解 + 总结
文章目录 差分一维差分题解代码 二维差分 差分 区间修改时使用差分 1. 先预处理一个差分数组,cre[i] a[i] - a[i-1],对差分数组求前缀和可以还原为原数组 2. 如果要让区间内的数d,比如[l,r]内d,那么r1区间-d可以达到这样的效果&…...
全星APQP软件:为用户提供高效、合规、便捷的研发管理体验
全星APQP软件:为用户提供高效、合规、便捷的研发管理体验 为什么选择全星APQP软件系统? 在汽车及高端制造行业,研发项目管理涉及APQP(先期产品质量策划)、FMEA(失效模式与影响分析)、CP&#x…...
数据结构——哈希详解
数据结构——哈希详解 目录 一、哈希的定义 二、六种哈希函数的构造方法 2.1 除留取余法 2.2 平方取中法 2.3 随机数法 2.4 折叠法 2.5 数字分析法 2.6 直接定值法 三、四种解决哈希冲突的方法 3.1 开放地址法 3.1.1 线性探测法 3.1.2 二次探测法 3.2 链地址法 3…...
智慧乡村数字化农业全产业链服务平台建设方案PPT(99页)
1. 农业全产业链概念 农业全产业链是依托数字化、电子商务、云计算等技术,整合规划咨询、应用软件设计与开发等服务,推动农业产业升级和价值重塑,构建IT产业融合新生态。 2. 产业链技术支撑 利用云计算、大数据、区块链等技术,为…...
Mysql -- 基础
SQL SQL通用语法: SQL分类: DDL: 数据库操作 查询: SHOW DATABASES; 创建: CREATE DATABASE[IF NOT EXISTS] 数据库名 [DEFAULT CHARSET字符集] [COLLATE 排序规则]; 删除: DROP DATABA…...
《AI大模型应知应会100篇》第14篇:大模型商业化现状:主流应用场景及盈利模式
第14篇:大模型商业化现状:主流应用场景及盈利模式 摘要 近年来,大模型(如Qwen、DeepSeek、GPT、BERT等)以其强大的语言理解和生成能力引发了技术界的广泛关注。然而,如何将这些前沿技术转化为商业价值&am…...
深入理解linux操作系统---第3讲 基本操作与基本管理
3.1 shell基本功能与基本概念 3.1.1 shell基本功能 Shell是Linux系统的核心交互工具,主要功能包括: 程序启动与进程管理:通过命令行将程序名传递给内核执行,支持进程的后台运行与监控(如ps、kill命令)文…...
Go:函数
函数 函数声明 func name(parameter-list) (result-list) { body }函数声明包含函数名、形参列表、可选的返回列表以及函数体 。形参列表指定由调用者传递的变量参数名和类型;返回列表指定函数返回值类型 ,无返回值或返回未命名值时,返回列…...
swagger 注释说明
一、接口注释核心字段 在 Go 的路由处理函数(Handler)上方添加注释,支持以下常用注解: 注解名称用途说明示例格式Summary接口简要描述Summary 创建用户Description接口详细说明Description 通过用户名和邮箱创建新用户Tags接口分…...
【C++】C与C++、C++内存空间、堆与栈
C嘎嘎嘎嘎嘎~ C与C的区别与联系 C内存空间 int global_var; // 未初始化全局变量,BSS段 const char* str "Hello"; // 字符串常量text段 in数据段void func() {static int static_var; // 未初始化的静态变量,数据段int local_var; …...
从零训练LLM-1.训练BPE
文章目录 BPE 简介BPE (Byte-Pair Encoding) 算法训练流程BPE 编码流程BPE 评估代码 参考 本文基于 HF -tokenizer 训练,更便捷 BPE 简介 分词器将单词从自然语言通过“词典”映射到0, 1, 36这样的数字,可以理解为数字就代表了单词在“词典”中的页码。…...
shield.io网站|markdown中适用的“徽标”
动态的我还没看是怎么弄,但是应该和静态的差不多,因此本文仅讨论静态徽标 静态徽标效果 创建方法 网址:Shields.io | Shields.io 进入之后点击“Badges”标签进入网页创建徽标的页面,根据文档中对每个属性的介绍在右侧将自己预…...
Vue 3 自定义指令
Vue 3 是一个非常强大的前端框架,它不仅提供了简单易用的 API,还支持多种高级功能,以便开发者根据需要扩展和优化应用。在 Vue 中,自定义指令是一种非常灵活的功能,它允许我们为 DOM 元素添加特定的行为,扩…...
25某团校招后端开发一面
一、进程通信和线程通信方式 进程通信方式 管道(Pipe) 半双工通信,数据单向流动,仅用于有亲缘关系的进程(如父子进程)。通过内核缓冲区实现数据传输,如父进程写、子进程读。命名管道ÿ…...
音视频学习(三十四):H264中的宏块
什么是宏块? 在 H.264 中,宏块是编码图像时最小的处理单位。它的核心作用包括: 帧内预测(Intra Prediction)帧间预测(Inter Prediction)变换、量化、熵编码等 标准定义: 一个宏块…...
Pandas 中透视表(`pivot_table`)和交叉表(`crosstab`)的区别
Pandas 中透视表(pivot_table)和交叉表(crosstab)的区别 核心区别 透视表 (pivot_table) 用于对数据进行 聚合计算(如求和、均值、计数等)。支持多维度分组(行、列、甚至多层索引)。…...
Restful风格接口开发
目录 Restful Apifox 介绍 端口号8080怎么来的? 为什么要使用Apifox? Restful 如果请求方式是Post,那我就知道了要执行新增操作,要新增一个用户 如果请求方式是Put,那就代表我要修改用户 具体要对这些资源进行什么样的操…...
20250414| AI:RAG多路召回和融合重排序技术
好的!以下是对RAG(检索增强生成)中多路召回和融合重排序技术的详细解释,结合解释学习的视角,帮助你更好地理解和学习。这些技术是RAG系统的核心组成部分,决定了检索阶段的效果和最终生成答案的质量。我会尽…...
基于时间序列分解与XGBoost的交通通行时间预测方法解析
一、问题背景与数据概览 在城市交通管理系统中,准确预测道路通行时间对于智能交通调度和路径规划具有重要意义。本文基于真实道路传感器数据,构建了一个结合时间序列分解与机器学习模型的预测框架。数据源包含三个核心部分: 道路通行数据(new_gy_contest_traveltime_train…...
论文精度:HeightFormer:基于Transformer的体素高度预测在路边3D目标检测中的应用
论文地址:https://arxiv.org/pdf/2503.10777 1. 背景与问题定义 1.1 路边视觉3D检测的重要性 在自动驾驶领域,车辆端的视觉感知系统面临视角局限性(如遮挡、短距离感知)和安全挑战。相比之下,路边摄像头通过高位安装,可覆盖更广的感知范围(如交叉路口、高速公路)…...
华为手机清理大数据的方法
清理手机最大的问题是,手动和自动清理了多次,花费了很长时间,但是只腾挪出来了一点点空间,还是有很大空间无法使用,这篇文章就告诉你怎样做,以花瓣剪辑为例,如下: 删除数据ÿ…...
tcp特点+TCP的状态转换图+time_wait详解
tcp特点TCP的状态转换图time wait详解 目录 一、tcp特点解释 1.1 面向连接 1.1.1 连接建立——三次握手 1.1.2 连接释放——四次挥手 1.2 可靠的 1.2.1 应答确认 1.2.2 超时重传 1.2.3 乱序重排 1.2.4 去重 1.2.5 滑动窗口进行流量控制 1.3 流失服务(字节…...
flutter 桌面应用之窗口自定义
在开发桌面软件的时候我们经常需要配置软件的窗口的大小以及位置 我们有两个框架选择:window_manager和bitsdojo_window 对比bitsdojo_window 特性bitsdojo_windowwindow_manager自定义标题栏✅ 支持❌ 不支持控制窗口行为(大小/位置)✅(基本…...
【C++】NAN相关研究
先说结论:NAN对比一切都是false INF 对INF 是true 正无穷与正无穷比较相等,正无穷与负无穷比较不相等 window linux环境下基本相同, debug release基本相同 NAN -NAN INF -INF 不做论述 // TestNan.cpp : 此文件包含 "main" 函数。…...
windows下Git安装及其IDEA配置
1.下载Git安装包 阿里镜像链接(建议从这里下载,速度很快) git-scm.com(官方网站,提供了各个平台(Windows、Mac、Linux)的安装程序) 选择版本号后,在选择此版本的不同包…...
迷你世界脚本脚本常见问题
脚本常见问题 彼得兔 更新时间: 2024-05-22 17:54:44 在查阅开发者学院中的脚本API时,若有任何问题或建议,欢迎通过问卷进行反馈!【点我填写问卷】 1.Block中的data在什么地方使用 data使用有具体需求,此处不建议开发者使用。开发者尽可能使…...
2025蓝桥杯C++ A组省赛 题解
昨天打完蓝桥杯本来想写个 p y t h o n python python A A A 组的题解,结果被队友截胡了。今天上课把 C A CA CA 组的题看了,感觉挺简单的,所以来水一篇题解。 这场 B B B 是一个爆搜, C C C 利用取余的性质比较好写&#…...
链接世界:计算机网络的核心与前沿
计算机网络引言 在数字化时代,计算机网络已经成为我们日常生活和工作中不可或缺的基础设施。从简单的局域网(LAN)到全球互联网,计算机网络将数以亿计的设备连接在一起,推动了信息交换、资源共享以及全球化的进程。 什…...
MySQL 常见存储引擎全解析:InnoDB、MyISAM、Memory 等对比与实战
一、什么是存储引擎? 存储引擎(Storage Engine)是 MySQL 中负责数据存储与管理的底层模块。不同的存储引擎负责处理表的读写、索引维护、事务支持、崩溃恢复等机制。 在创建表时可以指定使用的存储引擎: CREATE TABLE user (id…...
21天Python计划:零障碍学语法(更新完毕)
目录 序号标题链接day1Python下载和开发工具介绍https://blog.csdn.net/XiaoRungen/article/details/146583769?spm1001.2014.3001.5501day2数据类型、字符编码、文件处理https://blog.csdn.net/XiaoRungen/article/details/146603325?spm1011.2415.3001.5331day3基础语法与…...
Python中NumPy的统计运算
在数据分析和科学计算领域,Python凭借其丰富的库生态系统成为首选工具之一,而NumPy作为Python数值计算的核心库,凭借其高效的数组操作和强大的统计运算功能,广泛应用于机器学习、信号处理、统计分析等场景。本文将系统介绍NumPy在…...
SQL 解析 with as
sql的运行顺序 <select id"getTrendList" parameterType"java.util.HashMap" resultType"java.util.Map"><![CDATA[WITH-- 生成连续年份列表(当前年前8年到前1年)year_range AS (SELECT EXTRACT(YEAR FROM SYSD…...
07-算法打卡-链表-移除链表-leetcode(203)-第七天
1 题目地址 203. 移除链表元素 - 力扣(LeetCode)203. 移除链表元素 - 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1:[https://assets.leetc…...
抓包神器,自研EtherCAT抓包工具
大家好,博主自研了一款以太网抓包神器,可以用于EtherCAT抓包。 把抓包工具接入以太网总线中,就能正常使用了。 上位机软件采用wireshark。 开启以下协议 抓包截图如下 时间戳的精度为5ns。...
五、adb常用命令
SDK路径下的 \Android\Sdk\platform-tools\adb.exe adb devices 查看连接的设备 adb shell getprop ro.build.version.release 查看系统版本 adb shell dumpsys window windows | findstr mFocusedApp 获取正在运行的app启动包名 结果为空,我不知道是不是Android…...
Java第四节:idea在debug模式夏改变变量的值
作者往期文章 Java第一节:debug如何调试程序(附带源代码)-CSDN博客 Java第二节:debug如何调试栈帧链(附带源代码)-CSDN博客 Java第三节:新手如何用idea创建java项目-CSDN博客 步骤一 在需要修改…...
Java学习手册:Java反射与注解
Java反射(Reflection)和注解(Annotation)是Java语言中两个强大的特性,它们在框架开发和复杂应用中扮演着重要角色。反射允许程序在运行时检查和操作类、对象、接口、字段和方法,而注解则提供了一种元数据形…...
21 天 Python 计划:MySQL事务四大隔离级别深度剖析
文章目录 一、事务1.1 什么是事务?1.2 事务的四大特性 二、事务并发存在的问题2.1 脏读(dirty read)2.2 不可重复读(unrepeatable read)2.3 幻读 三、事务的四大隔离级别实践3.1 读未提交(Read Uncommitted…...
IO多路复用沉浸式体验
这篇文章主要讲解一下IO多路复用常见问题,包含常见面试题,对你有帮助的话可以留个赞和关注嘛?谢谢大家支持! 1.epoll 相比于 select/poll 的优点有哪些? 高效的数据结构:epoll使用红黑树管理fd࿰…...
音视频学习(三十三):GOP详解
GOP 概念 GOP(图像组)是视频编码中一组帧的集合(按相关性分组),它从一个关键帧(I帧)开始,后面跟随若干个参考帧(P帧)和预测帧(B帧)。其结构决定了视频帧的压…...
部署YUM仓库
目录 一.YUM 1.1yum概述 1.2yum的实现 1.3yum服务的组成 1.4yum服务实现过程 1.5yum配置文件位置 二.yum相关命令 三.搭建yum仓库的方式 3.1使用HTTP方式搭建yum仓库 准备工作(服务端和客户端都需要做) 服务端 客户端 3.2使用ftp方式搭建yu…...
中位数学习(低估它了)
-----------------------------------------------------------------中位数------------------------------------------------------- 中位数有一个很好的性质:假设有一批数据,你想找一个数,使得这批数据与它差的绝对值的和最小࿰…...
音视频转换器 AV 接口静电保护方案
方案简介 音视频转换器是将音视频(AV)信号转换成其他格式或信号类型的设备或软件。 它能够实现大多数视频、音频以及图像格式之间的转换,包括但不限于 RMVB、AVI、 MP4、MOV 等常见格式,同时也支持将不同采样率、位深度、声道数…...