首页 > 其他分享 >异常处理和泛型

异常处理和泛型

时间:2022-10-01 13:03:48浏览次数:43  
标签:处理 void System static 泛型 new 异常 public out

异常

  • 处理异常的格式
public static void main(String[] args) {
// 可能会出异常的代码,需要使用try来处理,try不能单独使用,必须配合finally或catch使用
try {
int i = 10 / 0;
System.out.println(i);
} catch(Exception e) { // 捕获异常
// 获取异常信息
String message = e.getMessage();
System.out.println("异常信息:" + message);
// 一定要打印e.printStackTrace()
e.printStackTrace();
} finally { //最终都会执行的(当有必须程序需要处理时)
System.out.println(111);
}
System.out.println(222);
}

# 运行结果
异常信息:/ by zero
111
222
  • 抛出异常
static void f1() throws Exception {
try {
int i = 10/0;
System.out.println(i);
} catch (Exception e) {
// 捕获到异常后抛出异常,丢到方法名的后面
throw new Exception();
}
}

// f1()方法抛出了1个异常,main方法中调用时就需要main方法处理异常
public static void main(String[] args) throws Exception {
// 将异常抛给他的父级处理
f1();
}
  • 捕获多个异常时,因为程序是从上往下运行,所以小的异常类型必须放在前面
static Integer f(String str) {
try {
return Integer.parseInt(str);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("捕获到异常");
} catch(NumberFormatException e) {
e.printStackTrace();
} catch (ClassCastException e) {
System.out.println("类型转换");
} catch (Exception e) {
System.out.println("最大的异常");
}
return 0;
}

// 测试
public static void main(String[] args){
try {
int f;
f = f("111a");
System.out.println(f);
} catch (Exception e) {
e.printStackTrace();
}
}
  • 自定义异常
// 自定义的异常类需继承Throwable、Exception、RuntimeException
public class MyException extends RuntimeException {
// 实现序列化id
private static final long serialVersionUID = 1L;

MyException() {
super();
}

MyException(String msg) {
super(msg);
}
}

public class Test {
static void f(String str) throws MyException{
try {
int i = Integer.parseInt(str);
} catch (MyException e) {
System.out.println("111");
throw new MyException("类型转换错误");
}
}

public static void main(String[] args) {
f("a");
}
}
  • throw和throws的区别:
    throw在方法体内,表示抛出异常的动作
    throws表示可能会抛出的异常类型
  • 异常处理的方式:try-catch或throws
    try放可能出现异常的代码,catch捕获后处理;throws在方法头部抛出异常,交给方法的调用者处理

泛型

  • 集合中使用泛型
// 给集合指定泛型,那么该集合中只能存入该类型的数据
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("adc");
}
  • 方法中使用泛型
// 格式:访问修饰符 [static] <T> void  方法名(T  t){  方法体}    //可传多个参数
public class Test {
// 泛型方法
public static < E > void printArray( E[] inputArray ) {
// 输出数组元素
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
}
  • 判断是否是泛型方法
# 格式:访问修饰符 [static] <T> void 方法名(T t){方法体}
public void f(){ # 普通方法
}
public T f() { # 类泛型化后的方法
}
public void f(T t) { # 普通方法,传入的参数可以是泛型
}
public <T> void f(T t){ # 泛型方法
}
  • 类中使用泛型
public class Box<T> {
private T t;

public void add(T t) {
this.t = t;
}

public T get() {
return t;
}

// 测试:main方法中new一个泛型类的对象,调用其中的方法
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
Box<String> stringBox = new Box<String>();

integerBox.add(new Integer(10));
stringBox.add(new String("菜鸟教程"));

System.out.printf("整型值为 :%d\n\n", integerBox.get());
System.out.printf("字符串为 :%s\n", stringBox.get());
}
}
public  interface Interface01 <M>{
public abstract void f1(M m);
}

public class Interface01impl<M> implements Interface01<M>{
@Override
public void f1(M m) {
System.out.println(m);
}
}

public class Interface02impl implements Interface01<String> {
@Override
public void f1(String s) {
System.out.println(s);
}
}
  • 类型通配符 ?
public class Test {
// 为List集合指定类型统配符号
public static void getData(List<?> data) {
System.out.println("data :" + data.get(0));
}

// 若是使用泛型,则集合只能存入一种类型
// 若是使用通配符,则可以接受任意不确定类型
public static void main(String[] args) {
List<String> name = new ArrayList<String>();
List<Integer> age = new ArrayList<Integer>();
List<Number> number = new ArrayList<Number>();

name.add("icon");
age.add(18);
number.add(314);

getData(name);
getData(age);
getData(number);
}
}
  • 泛型边界
// 格式:<? extends ClassName>
// 为通配符指定一个类型,则该集合只能接受这种类型
public class Test {
public static void getUperNumber(List<? extends Number> data) {
System.out.println("data :" + data.get(0));
}

public static void main(String[] args) {
List<String> name = new ArrayList<String>();
List<Integer> age = new ArrayList<Integer>();
List<Number> number = new ArrayList<Number>();

name.add("icon");
age.add(18);
number.add(314);

//getUperNumber(name);//1
getUperNumber(age);//2
getUperNumber(number);//3
}

}
  • 超类型通配符
// 父类
public class Fruit {
}

// 子类
public class Apple extends Fruit {
}

// 使用超类型通配符
// Apple、Orange类继承了Fruit类,使用超类型通配符可存入父类和子类的类型
// 格式:<? super 父类>
public class Test {
// 1. 声明泛型方法
static <T extends Apple> void f(T t) {
}

public static void main(String[] args) {
// 2. 调用泛型方法;
f(new Apple());
f(new Orange());

// 报错:<? extends ClassName> 不能往里存,只能取数据
List<? extends Apple> l = new ArrayList<Apple>();
// l.add(new Apple());
l.add(null);
System.out.println(l.get(0));

// **超类型通配符使用方式:集合中添加当前类及其子类**
List<? super Fruit> l2 = new ArrayList<Fruit>();
l2.add(new Orange());
l2.add(new Fruit());
l2.add(new Apple());
}
}
  • 总结
# 泛型边界:T的类型只能是当前ClassName或ClassName的子类        
<T extends ClassName>

# 通配符? 不能存数据,只能取数据,具有任何从ClassName继承的类型的列表
<? extends ClassName>
# 超类型通配符,声明通配符是有某个特定类的任何基类来界定的
<? super ClassName>
# 无界通配符
<?>
# 表示类型的上界,表示参数化类型的可能是T 或是 T的子类;即类型只能是T或T的子类
<? extends T>
# 表示类型下界,表示参数化类型是此类型的超类型(父类型),直至Object;即类型只能是T或T的父类
<? super T>



标签:处理,void,System,static,泛型,new,异常,public,out
From: https://blog.51cto.com/chniny/5728242

相关文章

  • mysql基础(十六):定义条件、定义处理程序
    简介定义条件是事先定义程序执行过程中可能遇到的问题,处理程序定义了在遇到问题时应当采取的处理方式,并且保证存储过程或函数在遇到警告或错误时能继续执行。这样可以增......
  • Spring03:展现模型数据、处理及校验表单
    1展现模型数据1.1图解过程在上一节“Spring-02:构建并运行基础Spring应用”中,我们运行的基础应用所展现的视图home.html还未包含任何领域类的信息,如下图:想要构建真实......
  • JavaWeb-----进行事务处理的Filter
    详细资源:https://heavy_code_industry.gitee.io/code_heavy_industry/pro001-javaweb/lecture/详细博客:https://blog.csdn.net/jsdoulaoula/article/details/125648785?sp......
  • .NET Core泛型约束
    .NETCore泛型约束如果一个类/引入了泛型类型,那么可以对引入的泛型写一个约束,让传入的泛型类型必须具备某些条件才能传入publicclassPerson<T>whereT:base-cla......
  • 数据处理的软件构造
    数据处理:要按需选择、使用数据和数据持久性,具体实例有将程序变量的值转化为可共享的、持久性的文件数据,文件的产生、存储和读取操作,学习一个特殊的文本文件按格式CSV。在编......
  • 如何处理 SSR 服务端渲染时候后端接口报错导致无法渲染问题 All In One
    如何处理SSR服务端渲染时候后端接口报错导致无法渲染问题AllInOne预先构建出,兜底的静态页面SSR动态渲染时候出错,返回兜底的静态页面CDN缓存refs......
  • TI AM5728 DSP+ARM+FPGA多核异构工业控制处理器
    TIAM5728DSP+ARM+FPGA多核异构工业控制处理器。DSP用于复杂算法处理,ARM用于通用事务管理,FPGA用于高速信号采集,是个完美的高性能嵌入式工业主板组合。 DSP算法开发对于DSP......
  • 信迈AM5728 DSP+ARM高性能图像处理核心板功能介
    1. 核心板简介➢SOM-XM5728 是信迈科技基于TIAM5728处理器的工业级核心板,采用沉金无铅、十层板、工业级设计,可应用于运动控制系统、机器视觉处理系统、图像识别系统、......
  • 0067-Tui-panic 处理
    环境Time2022-08-17Rust1.63.0Tui0.18.0前言说明参考:https://github.com/fdehau/tui-rs/blob/master/examples/panic.rs目标使用tui-rs定义一个panichook......
  • Python异常处理
    认识异常通俗讲,异常就是程序运行中报的错。异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行异常的类型Python程序运行出......