流年似水博客开通了,本站主要是写关于Web和大数据方面内容,正在更新中,欢迎大家光临!
  1. 文章:97 篇
  2. 总浏览:54,200 次
  3. 评论:22条
  4. 最后更新:2020-06-08
  5. 分类目录:39 个

Java之枚举、注解、异常处理(try...catch...finally)

Java l, xy 347℃ 0评论

  1.   枚举

(1)      概念

1           用于描述一组固定常量的集合,是单例模式的升级版。例如:星期、月份、四季等

 

(2)      作用

1           用于定义一组固定值的集合

(3)      自己定义

1           步骤:

1)         构造方法私有化(private修饰)

2)         在本类中定义公共静态常量的本类对象(public static final 修饰)

3)         类使用final修饰(final修饰)

4)         一般不提供setter方法


/**
* 类使用final修饰
*/
public final class Season {
//提供本类对象
public static final Season SPRING = new Season("春天");
public static final Season SUMMER = new Season("夏天");
public static final Season AUTUME = new Season("秋天");
public static final Season WINTER = new Season("冬天");
private String name;
//私有化构造器
private Season(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
//提供getter方法,对外暴露属性
public String getName() {
return name;
}
}

(4)      使用enum定义


/**
* 使用JDK5以后提供的enum关键字定义
*/
public enum SeasonEnum {
//提供本类对象
SPRING ("春天"),
SUMMER ("夏天"),
AUTUME ("秋天"),
// 注意这里枚举常量以后有代码,分号不可以省略
WINTER ("冬天");


private String name;
//私有化构造器
private SeasonEnum(String name) {
this.name = name;
}

@Override
public String toString() {
return name;
}
//提供getter方法,对外暴露属性
public String getName() {
return name;
}

}

这里补充一下,反编译以后的SeasonEnum 

(5)      特点:(使用enum定义枚举)---观察上边反编译的结果

1           枚举本质是一个类,该类使用final修饰,并且继承了Enum<T>T为自己定义的枚举类名)

2           枚举名都是公共的静态常量(使用 public static final 修饰)

3           枚举中会自动添加values()方法和valueOf(String)方法

4           枚举常量的定义必须在枚举类的第一句

5           如果枚举常量类中没有参数,可以省略枚举常量后面的小括号(例如 SPRING

6           枚举常量最后的分号可以省略(当后面没有其他代码时),如果后面有其他代码,则不可以省略。建议不省略。

(6)      实现接口

1           枚举实现接口可以让枚举类本身实现,也可以让每一个枚举常量都实现接口。


public enum SeasonEnum implements A{
//提供本类对象
SPRING ("春天"),
SUMMER ("夏天"),
AUTUME ("秋天"),
WINTER ("冬天");


private String name;
//私有化构造器
private SeasonEnum(String name) {
this.name = name;
}

@Override
public String toString() {
return name;
}
//提供getter方法,对外暴露属性
public String getName() {
return name;
}


@Override
public void show() {
System.out.println("通用实现,四个枚举常量公用!");
}
}

interface A{
void show();
}

2           若枚举常量中需要不同的实现,则每个枚举常量都可以实现(相当于匿名内部类)


/**
* 使用JDK5以后提供的enum关键字定义
*/
public enum SeasonEnum implements A{
//提供本类对象
SPRING ("春天"){
// 这里相当于匿名内部类
@Override
public void show() {
System.out.println("春天实现,只有SPRING枚举常量可以调用");
}
},
SUMMER ("夏天"){
@Override
public void show() {
System.out.println("夏天实现,只有SPRING枚举常量可以调用");
}
},
AUTUME ("秋天"),
WINTER ("冬天");


private String name;
//私有化构造器
private SeasonEnum(String name) {
this.name = name;
}

@Override
public String toString() {
return name;
}
//提供getter方法,对外暴露属性
public String getName() {
return name;
}


@Override
public void show() {
System.out.println("通用实现,四个枚举常量公用!");
}
}

interface A{
void show();
}

(7)      常用方法

1           Static Values() E[] :获取所定义的所有枚举常量数组

2           Static valueOf(String name) E :根据传入的name获取指定的枚举常量对象(注意,若传入的name没有匹配到,则会抛出异常)

3           Final String name() :返回枚举常量的name

4           Final int ordinal(): 返回枚举常量的下标(从0开始,和定义的位置有关)

5           String toString() : 默认返回枚举常量的name,建议重写

6           Final Boolean equals(Object obj):比较两个枚举的地址,判断是否相等

7           Final int hashCode() : 返回对象的hashCode

8           Final Object clone() :没有实现

9           Final int compareTo(E e):比较两个枚举常量的下标

10       Final class<E> getDeclaringClass():返回定义常量的class对象类型

11       Static <T extends Enum<E>> T ValueOf(Class<T> enumType,String name): 静态方法,放回指定枚举类型,指定名称的枚举常量

12       举例:


//1.values()
WeekEnum[]values=WeekEnum.values();

//2.valueOf(String name)
WeekEnum mon=WeekEnum.valueOf("MON");

//3.name()
String name=mon.name();
System.out.println("name = "+name); //name = MON

//4.ordinal()
int ordinal=mon.ordinal();
System.out.println("MON ordinal = "+ordinal); //MON ordinal = 0

//5.toString()
System.out.println(mon.toString());//MON

//9.compareTo(E e )
WeekEnum fri=WeekEnum.FRI;
System.out.println(mon.compareTo(fri));//-4

//10. getDeclaringClass()
Class<WeekEnum> declaringClass=mon.getDeclaringClass();
System.out.println("class : "+declaringClass); //class : class cn.cupcat.enmuExer.WeekEnu

//11.valueOf(Class clazz , String name)
WeekEnum mon1=Enum.valueOf(WeekEnum.class,"MON");
System.out.println("mon == mon1 "+(mon==mon1));//mon == mon1 true

总结:
从11的结果可以看出 mon==mon1,说明枚举是一个常量,只有一个对象。

  1.   注解

(1)      概念

1           描述数据的数据

2           是对程序的一种描述,不会影响到程序的逻辑

(2)      好处

1           标记程序,利于新老版本兼容

2           可以在不改变逻辑的情况下,通过反射来动态添加功能(强大)

(3)      Java自带三个常用注解

1           @Override : 实现或者重写中,不合法实现/重写时,编译器发出警告(只能用于方法)

2           @Deprecated:标记过时

3           @SuppressWarnings:抑制编译器警告

(4)      元注解

1           @Target : 标志注解的应用元素

1)         ElementType

2           @Retention : 标志注解的声明周期

1)         RetentionPolicy

3           @Documented : 标志注解是否在API文档中出现

4           @Inherited : 标志注解是否能被继承

(5)      自定义注解

1           使用@interface关键字定义

2           注解中方法的类型只能是八大基本数据类型(byteshortintlongfloatdoublebooleanchar)、String、枚举、Class类型以及上类型的数组类型

3           可以给方法指定默认值 (使用 default 值),如果有默认值在使用的时候则可以不指定。

4           使用注解时,是以键值对的形式传入的。如果方法名称是value的话,则可以省略键值


import java.lang.annotation.*;

/**
* 自定义注解
*/

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
String[] value() default "hello";

String name() default "zxy";

int age();
}

--------------------------------测试注解使用------------------------------

// 因为自定义注解内value有默认值,所以可以不指定
@MyAnnotation(age = 12)
public void test(){

}

  1.   异常

(1)      概念

1           所谓异常就是程序中一些不正常的现象,就像我们人会得病异常,程序也会出问题

2           java中,将异常也封装成一些类来描述这些问题

(2)      异常体系

(3)      异常处理

1           Try处理

1)         Try ...catch


try{
//可能发生异常的语句
}catch(异常类型 变量名){
//异常处理语句
}

2)         Try....catch...finally


try {
//可能发生异常的语句
}catch (异常类型 变量名){
//异常处理语句
}finally {
//最有一定会执行的语句
}

3)         Try...finally, (其实并没有处理异常)


try {
//可能发生异常的语句
}finally {
//最有一定会执行的语句
}

4)         注意细节:

  1. 针对具体的异常可以有多个catch块,但是父类异常的catch块一定要方法子类的后面,否则编译错误。
  2. Finally块代码不管有没有异常发生都会执行(包括在try块或者catch块中有return的情况),一般在finally块中做释放资源的动作
  3. 执行过程:

try {

//可能发生异常的语句 ②

}catch (异常类型 变量名){

}finally {
//最有一定会执行的语句⑤
}

 

a)         发生异常: ①②④⑤

b)        未发生异常:①②③⑤

 

2           Throws处理

   a. throws处理异常可以直接在方法上抛出,交给调用者来处理。throws后面跟的是异常类,而非异常类的对象

   b. throws如果抛出的是受检异常,则一定要抛出。如果是非受检异常,则可以不抛出

public FileInputStream(File file) throws FileNotFoundException {
String name = (file != null ? file.getPath() : null);
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(name);
}
if (name == null) {
throw new NullPointerException();
}
if (file.isInvalid()) {
throw new FileNotFoundException("Invalid file path");
}
fd = new FileDescriptor();
fd.attach(this);
path = name;
open(name);
}

        3.          Throw关键字

             a. 通过throw关键字可以自己决定什么时候抛出异常,throw关键字后面跟的是异常类的对象

public FileInputStream(File file) throws FileNotFoundException {
String name = (file != null ? file.getPath() : null);
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(name);
}
if (name == null) { // 这里是throw抛出异常
throw new NullPointerException();
}
if (file.isInvalid()) {
throw new FileNotFoundException("Invalid file path");
}
fd = new FileDescriptor();
fd.attach(this);
path = name;
open(name);
}

转载请注明:流年似水 » Java之枚举、注解、异常处理(try...catch...finally)

喜欢 (0)or分享 (0)

Warning: copy(https://cn.gravatar.com/avatar/?s=54&d=%2Fwp-content%2Fthemes%2Fyusi1.0%2Fimg%2Fdefault.png&r=g): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in /usr/share/nginx/html/timewentby/wp-content/themes/yusi1.0/functions.php on line 239

Warning: copy(/wp-content/themes/yusi1.0/img/default.png): failed to open stream: No such file or directory in /usr/share/nginx/html/timewentby/wp-content/themes/yusi1.0/functions.php on line 243
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址