java基础_day12

一 枚举

1.1枚举的使用

枚举是一种自定义的数据类型, 可以声明变量。 在使用的时候, 直接使用枚举类型.枚举值
这样的形式进行枚举值的获取。
​
​
public class Test {
    public static void main(String[] args) {
// 枚举的使用
    Gender gender1 = Gender.Male;
    Gender gender2 = Gender.Female;
    Month m1 = Month.Jan;
    Month m2 = Month.Nov;
    Week week1 = Week.Sat;
    }
}

1.2 枚举中的成员定义

枚举,其实实可以认为是Object类的一个最终子类。 不能被其他的类、枚举继承。
public class EnumTest {
public static void main(String[] args) {
// 1. 获取一个枚举对象
Gender gender = Gender.Male;
// 1.1. 证明方式1: 枚举对象,可以调用Object类中的方法,说明这些方法是从
Object类中继承到的。
String str = gender.toString();
// 1.2. 证明方式2: 可以向上转型为 Object 类型。
Object obj = gender;
    }
}
enum Gender {
Male, Female
}

1.3 枚举中的属性定义

public enum Gender {
    Male, Female;
// 1. 在枚举中定义属性、方法、构造方法... 是需要写在枚举元素的下方!
// 如果需要在枚举中定义成员,需要在最后一个枚举元素后面添加一个分号。
    public String desc;
}

1.4 枚举中的构造方法定义

public class Test2 {
// 为了防止和当前包中的Gender枚举重复,在这里写成了静态内部枚举
    private static enum Gender {
// 其实,所谓枚举中的元素,其实就是一个静态的、当前类的对象。
    Male("男"), Female("女");
// 添加属性
        private String desc;
// 添加构造方法,为这个属性赋值
// 在枚举中定义构造方法,一般情况下,只是在当前的枚举中使用
// 所以,枚举的构造方法,一般情况下,权限都是私有的
    Gender(String desc) {
    this.desc = desc;
    }
}
public static void main(String[] args) {
// 1. 枚举对象的获取
Gender gender = Gender.Male;
    }
}

二 异常

2.1异常的结构和分类

在Java中,用 Throwable 类来描述所有的不正常的情况。 Throwable 有两个子类:
Exception 和 Error 。
​
Error: 描述发生在JVM虚拟机级别的错误信息, 这些错误无法被处理, 不做为现在的重点。
StackOverflowError: 栈溢出错误。
Exception: 描述程序遇到的异常。 异常是可以被捕获处理的, 是现在考虑的重点内容。
​
根据创建异常类的主体
第一:系统异常,系统提前定义好的,我们直接使用
第二:自定义异常,需要我们自己定义.
​

2.2 异常的特点

程序出现异常的时候,会打印异常的信息并中断程序,所以当有多个异常同时出现的时候,默认只能执行第一个.
​
public class Demo8 {
    public static void main(String[] args) {
    int[] arr = new int[] {4,5,6,6};
//会报NullPointerException异常:空指针异常
    arr = null;
//会报ArrayIndexOutOfBoundsException异常:数组下标越界异常
//当前的情况下,这个异常不会执行,执行空指针异常时,程序中断
    System.out.println(arr[10]);
    }
}

2.3 异常的捕获处理

2.3.1 try-catch

​
 如果一个异常不去处理, 会导致程序无法编译或者运行。
 
 try {
// 将可能出现异常的代码写到这里
// 如果这里的代码出现了异常, 从出现异常的位置开始, 到try代码段结束, 所有的
代码不执行。
}
catch (异常类型 标识符) {//捕获异常
// 如果try中的代码出现了异常,并且异常的类型和catch的异常的类型是可以匹配上
的,就会执行这里的逻辑
}

2.3.2 多个catch子句

如果在try代码段中, 出现了多种类型的异常, 此时如果需要对这些异常进行不同的处理,可以写多个catch子句。
​
try{
可能发生异常的代码
}catch(异常一 e){ //捕获异常 e就是要捕获的异常对当前异常的处理
}catch(异常二 e){ //捕获异常 e就是要捕获的异常对当前异常的处理
}catch(Exception e){ //捕获异常 e就是要捕获的异常对当前异常的处理
}

2.3.3 一个catch捕获多种异常

使用场景:
如果try中出现了多种异常,并且某些类型的异常,处理方式相同。 并且与其他类型的处理方式不同。 此时, 可以使用一个catch捕获处理多种异常。区分一个catch里面的多个异常时通过instanceof.
缺点:这种分类方式代码很混乱,所以不推荐.
​
   示例代码:
   public class Handle3 {
public static void main(String[] args) {
// 需求:
// NullPointerException ArrayIndexOutOfBoundsException 这两种异常处理方式相同, 输出 “数组相关异常”
// ArithmeticException NumberFormatException 这两种异常处理方式相同, 输出 “格式异常”
try {
nullPointerTest(); // NullPointerException
outOfBoundsTest(); // ArrayIndexOutOfBoundsException
arithmeticTest(); // ArithmeticException
formatException(); // NumberFormatException
}
catch (NullPointerException | ArrayIndexOutOfBoundsException e) {
System.out.println("数组相关异常");
if (e instanceof NullPointerException) {
System.out.println("NullPointerException");
}else if (e instanceof ArrayIndexOutOfBoundsException)
{
System.out.println("ArrayIndexOutOfBoundsException");
}
}
catch (ArithmeticException | NumberFormatException e) {
System.out.println("格式异常");
}
}
// NullPointerException
private static void nullPointerTest() {
int[] array = null;
array[0] = 10;
}
// ArrayIndexOutOfBoundsException
private static void outOfBoundsTest() {
int[] array = new int[5];
array[5] = 10;
}
// ArithmeticException
private static void arithmeticTest() {
int a = 10 / 0;
}
// NumberFormatException
private static void formatException() {
Integer i = Integer.valueOf("123a");
}
}

2.3.4 finally子句

概念:
finally出现在try-catch子句的结尾, finally代码段中的内容, 始终会执行。
​
语法:
try{
可能发生异常的代码
}catch(Exception e){ //捕获异常 e就是要捕获的异常
对当前异常的处理
}finally{
必须执行的代码:主要用于资源的释放:比如关闭数据库,关闭流,关闭锁等
}
​
特点
无论try代码段中有没有异常出现,无论try里面出现的异常没有被捕获处理,finally中的代码始终会执行。基于这个特点,常常在finally中进行资源释放、流的关闭等操作
​
作用范围
我们发现在catch中执行return后main方法结束,finally还能正常执行catch中执行System.exit(0)后,程序退出,finally不能执行了
​
结论:只要当前的程序在运行,finally代码就能执行.
    
 try-finally语句
  try{
获取资源
}finally{
释放资源
}  
​
特点
这个结构跟异常没有关系,主要用于资源的管理.

2.3.5 两个关键字

throw

概念/使用场景:
一个异常对象,被实例化完成后,没有任何意义。不会影响到程序的编译或者运行。如果希望某一个异常对象生效(可以影响程序的编译、运行),需要使用关键字 throw 进行异常的抛出。
​
public class Handle5 {
    public static void main(String[] args) {
        int ret = calculate(10, 20);
        System.out.println(ret);
}
private static int calculate(int a, int b) {
    if (a > b) {
        return a - b;
        }
// 否则,视为实参有逻辑错误,抛出一个异常
RuntimeException exception = new RuntimeException();
// 让当前的exception异常生效,使其可以终止程序的运行。
// 而且,在一个方法中抛出了异常,从这个位置开始,向后所有的代码都不执行
了。
throw exception;
    }
}
​

throws

概念/使用场景:
用在方法的声明部分,写在参数列表后面,方法体前面。
定义在方法中,表示这个方法过程结束中,可能会遇到什么异常。
定义了throws异常抛出类型的方法,在当前的方法中,可以不处理这个异常,由调用方处理。
​

2.4 自定义异常

如何自定义异常:
其实,系统提供的每一种异常,都是一个类。所以,自定义异常,其实就是写一个自定义的
异常类。
    如果要自定义一个编译时的异常,需要继承自 Exception 类。
特点:对异常进行处理的所有工作都要我们手动完成
如果要自定义一个运行时的异常,需要继承自    RuntimeException 类。
​
特点:所有的工作我们都可以不管

三 字符串

3.1 不可变字符串

对应的类:String.
特点:字符串本身不能发生改变,与指向字符串的引用无关.
直接使用"",创建的是不可变字符串

3.2 可变字符串:

对应的类:StringBuilder/StringBuffer.
特点:字符串本身可以发生变化,与指向可变字符串的引用无关
创建可变字符串
StringBuffer stringBuffer = new StringBuffer("hello world");

3.3 字符串的常用方法

 

3.4 字符串的非静态方法

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值