常用API和异常

常用API

date

获取当前系统时间

下面展示一些 内联代码片

// A code block
var foo = 'bar';
public class date_01 {
	public static void main(String[] args) {
		Date now = new Date();
		//  Thu Jan 21 09:40:19 CST 2021  Date 重写了toString  但是是欧美风格
		System.out.println(now);
		
		// 格式化类  
		// y 是 年 M 是 月  d 是 日    H 是 时  m 是 分 s 是 秒  最后一个大写的S 是 毫秒
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss SSS");
		String strTime = sdf.format(now);
		// 2021年01月21日 09:45:44 212  最后212 代表 缺
		System.out.println(strTime);
	}
}

字符串转date

下面展示一些 内联代码片

*  SimpleDateFormat
 *  Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat
 *  类是一个不与语言环境有关的方式来格式化和解析日期的具体类。
 *  它允许进行格式化:日期à文本、解析:文本à日期
 *
 *  SimpleDateFormat() :默认的模式和语言环境创建对象
 *  public SimpleDateFormat(String pattern):该构造方法可以用参数pattern
 *  指定的格式创建一个对象,该对象调用:
 *  public String format(Date date):方法格式化时间对象date
 *
 *  public Date parse(String source):从给定字符串的开始解析文本,以生成
 *  一个日期。
 * @杜智慧
 *
 * @Date 2021年1月21日
 */
public class date_02 {
	public static void main(String[] args) throws ParseException {
		// 首先创建一个String类型的字符串 , 其内存储具有一定格式的时间字符串 , 这里用了date_01里的格式
		String stringDate = "2021年01月21日 18:20:31 416";
		// 将这个字符串的格式以yyyy年MM月dd日 HH:mm:ss SSS的方式创建一个 SimpleDateFormat对象
		SimpleDateFormat sd = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss SSS");
		// 再将这个对象的.parse赋值给Date类型的对象
		Date date = sd.parse(stringDate); // 这里会报错 , 需要抛出异常 异常机制在Exception项目中讲解
		// 这样输出的date就回归了默认的格式  
		System.out.println(date);
		
	}
}

有参构造创建的对象

下面展示一些 内联代码片

 * Date d1 = new Date();  这种以无参构造创建的对象 , 是获取当前系统时间 
 * Date d2 = new Date(long millisecond);  这种以有参构造创建的对象 , 是获取从时间原点到指定毫秒数的时间
public class date_03 {
	public static void main(String[] args) {
		// 这样获取的是当前系统时间
		Date d1 = new Date();
		System.out.println(d1);
		
		// 这样获取的是从时间原点到指定毫秒数的时间
		Date d2 = new Date(1000);
		// Thu Jan 01 08:00:01 CST 1970  从时间原点1970年1月1日 08:00:00  开始 往后一毫秒
		System.out.println(d2);
		
		// 问 : 如何获取当前 系统时间的前10分钟的时间 
		// 结题思路 : 首先我们可以获取当前系统时间的毫秒数 , 然后可以算出来十分钟有多少毫秒
		// 那么十分钟前的毫秒数就可以通过计算得出 , 再利用有参构造就可以输出十分钟前的时间了
		// 获取当前时间的毫秒数
		long millisecond = System.currentTimeMillis();
		millisecond = millisecond - 1000*60*10; // 1000代表一毫秒
		Date d3 = new Date(millisecond);
		// 这样就可以输出十分钟前的时间了
		System.out.println(d3);
		// 如果想输出date_01里格式的时间 , 就再创建一个SimpleDateFormat对象
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss SSS");
		// 并输出sdf.format  这样输出的就是我们能接受的格式了
		System.out.println(sdf.format(d3));
	}
}

日历

下面展示一些 内联代码片

* 1、Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
 * 2、获取Calendar实例的方法
 * 使用Calendar.getInstance()方法
 * 调用它的子类GregorianCalendar的构造器。
 * 3、一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想 要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、 MINUTE、SECOND
 * public void set(int field,int value)
 * public void add(int field,int amount)
 * public final Date getTime()
 * public final void setTime(Date date)
 * 4、注意:
 * 获取月份时:一月是0,二月是1,以此类推,12月是11
 * 获取星期时:周日是1,周二是2 , 。。。。周六是7
public class date_04 {
	public static void main(String[] args) {
		// 创建日历对象  创建之前导包 
		Calendar c1 = Calendar.getInstance();
		// 获取现在是一周的第几天 (以周日为第一天)
		System.out.println(c1.get(Calendar.DAY_OF_WEEK));
		// 获取现在是一个月里的第几天 (今天是几号)
		System.out.println(c1.get(Calendar.DAY_OF_MONTH));
		// 获取今年是几几年
		int year = c1.get(Calendar.YEAR);
		// 获取月 从0开始,所以结果+1
		int month = c1.get(Calendar.MONTH) + 1;
		// 获取日
		int day = c1.get(Calendar.DAY_OF_MONTH);

		// 获取时
		int hour = c1.get(Calendar.HOUR);
		// 获取分
		int minute = c1.get(Calendar.MINUTE);
		// 获取秒
		int second = c1.get(Calendar.SECOND);
		// 获取本周第几天
		int weekday = c1.get(Calendar.DAY_OF_WEEK);
		
		
		// 把本周的第几天转换为星期几
		String weekDaystr = "星期";
		// 利用switch case语句 做一个类似枚举的操作
		switch (weekday) {
		case 1:
			weekDaystr += "日";
			break;
		case 2:
			weekDaystr += "一";
			break;
		case 3:
			weekDaystr += "二";
			break;
		case 4:
			weekDaystr += "三";
			break;
		case 5:
			weekDaystr += "四";
			break;
		case 6:
			weekDaystr += "五";
			break;
		case 7:
			weekDaystr += "六";
			break;

		default:
			break;
		}
		System.out.println(year+"年"+month+"月"+day+"日  "+hour+":"+minute+":"+second+"  "+ weekDaystr);
	}
}

枚举

第一种

下面展示一些 内联代码片

* 枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型
 * 之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束
 * 但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。
 * 
 *          -------------- https://www.cnblogs.com/zhanqing/p/11076646.html
 *          
 * 比如_01_DATE包 date_04类里的将其转换为星期几的方法 就是枚举
 * 写枚举 更容易发现错误,因为在编译阶段对类型进行检查,从而减少错误
 * 当我们需要一系列的有限的值的时候 ,并且用的较多 , 而且不更改的情况下(使用常量的时候 )
 * 写枚举更容易发现错误 , 因为在编译阶段对类型进行检查 , 从而减少错误
 *  (单独搞一个类写枚举  这样可以避免拼写错误 , 但是 从Java1.5之后 , 这种写法就显得比较繁琐了 , 因为1.5引入了枚举)
 *  Enum将枚举变得更为简洁方便
 *  
 *  简单来讲 , 枚举就是一个常量集
public class Enum_01 {
	public static void main(String[] args) {
		String  userName = "admin";
		String password = "root";
		String  result = login(userName, password);
		// 始终是报错 , 原因在于SUCCESSS 多写了一个S 这很显然是一个粗心大意的错 
		// 但是如果找的话是很难找到的 , ,如果使用枚举就可以避免这种错误
		if ("SUCCESSS".equals(result)) {
			System.out.println("登陆成功");
		}else {
			System.out.println("登陆失败");
		}
	}
	public static String login (String  userName ,String password){
		if ("admin".equals(userName) && "root".equals(password)) {
			return "SUCCESS";
		}else{
			return "FAIL";
		}
		
	}
}

对第一种的优化

下面展示一些 内联代码片

// A code block
var foo = 'bar';
public class Enum_02 {
	public static void main(String[] args) {
		String  userName = "admin";
		String password = "root";
		String  result = login(userName, password);
		// 始终是报错 , 原因在于SUCCESSS 多写了一个S 这很显然是一个粗心大意的错 
		// 但是如果找的话是很难找到的 , ,如果使用枚举就可以避免这种错误
		// 在需要使用这个常量的地方 都用这个类的静态变量来代替
		if (Result.SUCCESS.equals(result)) {
			System.out.println("登陆成功");
		}else {
			System.out.println("登陆失败");
		}
	}
	public static String login (String  userName ,String password){
		if ("admin".equals(userName) && "root".equals(password)) {
			return Result.SUCCESS;
		}else{
			return Result.FAIL;
		}
	}
}
// 首先我们在这里写一个常量类 这样在需要的时候 , 编译器会直接提示 , 只需要将提示的词搞上去就行
// 这样可以避免拼写错误
final class Result {
	public static final String SUCCESS = "SUCCESS";
	public static final String FAIL = "FAIL";
}

对第二种的优化(从java1.5开始)

下面展示一些 内联代码片

// A code block
var foo = 'bar';
public class Enum_03 {
	public static void main(String[] args) {
		String  userName = "admin";
		String password = "root";
		ResultEnum  result = login(userName, password);
		// 始终是报错 , 原因在于SUCCESSS 多写了一个S 这很显然是一个粗心大意的错 
		// 但是如果找的话是很难找到的 , ,如果使用枚举就可以避免这种错误
		// 在需要使用这个常量的地方 都用这个类的静态变量来代替
		if (ResultEnum.SUCCESS==result) {
			System.out.println("登陆成功");
		}else {
			System.out.println("登陆失败");
		}
	}
	// 要注意 , 返回的应该是ResultEnum  这个枚举类类型的值
	public static ResultEnum login (String  userName ,String password){
		if ("admin".equals(userName) && "root".equals(password)) {
			return ResultEnum.SUCCESS;
		}else{
			return ResultEnum.FAIL;
		}
	}
		
}
// 枚举  他也是一个类
enum ResultEnum {
	SUCCESS,FAIL
}

Integer

下面展示一些 内联代码片

* 包装类 : 封装了基本类型的操作,更方便我们使用  一共八种
 *      byte -- java.lang.Byte
 * 		short -- java.lang.Short
 * 		int  -- java.lang.Integer
 * 		long -- java.lang.Long
 * 		float -- java.lang.Float
 * 		double  -- java.lang.Double
 * 		char  -- java.lang.Character
 * 		boolean -- java.lang.Boolean
 * 
 * 使用包装类一是为了 方便 二是 为了理论上的完整(面向对象)
 *  
 * 想要创建一个方法,该方法可以接收任何类型
 * 		使用Object类 ,因为Object是所有类的祖类,由于多态的原因,可以接收任何对象
 * 			但是基本类型并不是Object的子类 , 所以就有了包装类的概念
 * 			包装类 ,  可以把基本类型转换为对应的包装类类型,而包装类也是个类,也是Object的子类
 * @杜智慧
 *
 * @Date 2021年1月20日
 */
public class integer_01 {
	public static void main(String[] args) {
		// 基本类型
		byte b1 = 2;
		// 引用类型
		Byte b2 = null;
		// 把 b1 基本类型封装到b2引用类型中
		b2 = new Byte(b1);
		
		// 可以把b2 传入 接收Object的方法中,因为多态
		m1(b2);
	}
	public static void m1(Object obj){
		// 由于 覆写了toString方法,所以可以直接打印 2 ,而不是内存地址
		System.out.println(obj);
	}
}

以integer为例 讲解八种包装类

下面展示一些 内联代码片

// A code block
var foo = 'bar';
public class integer_02 {
	public static void main(String[] args) {
		// 1 获取最大值和最小值
		System.out.println("int最大值 : " + Integer.MAX_VALUE);
		System.out.println("int最小值 : " + Integer.MIN_VALUE);
		System.out.println("long最大值 : " + Long.MAX_VALUE);
		System.out.println("long最小值 : " + Long.MIN_VALUE);
		System.out.println(Short.MAX_VALUE);
		System.out.println(Short.MIN_VALUE);
		System.out.println((int) (Character.MAX_VALUE));
		System.out.println((int) (Character.MIN_VALUE));
		
		// 2 创建对象
		Integer i1 = new Integer(12); // int -- Integer
		// 可以传入纯数字的字符串
		Integer i2 = new Integer("19776"); // String -- Integer
		
		System.out.println(i1);
		System.out.println(i2);
		// 编译可以通过,但是运行出错
		// java.lang.NumberFormatException: For input string: "19776a"
		Integer ie = new Integer("19776a");
	}
}

常用方法

下面展示一些 内联代码片

// A code block
var foo = 'bar';
public class integer_03 {
	public static void main(String[] args) {
		// 1 int --> Integer
		Integer i1 = new Integer(22);

		// 2 Integer --> int
		int i2 = i1.intValue();

		// 3 重要 : static int parseInt(String s) : 把字符串转换为int
		// String --> int
		int i3 = Integer.parseInt("123");
		System.out.println(i3);

		// 4 重要
		double d1 = Double.parseDouble("12.3");
		System.out.println(d1);

		// 5 static String toBinaryString(int value) : 把指定int值转换为二进制的字符串形式展示
		String s1 = Integer.toBinaryString(10);
		System.out.println(s1);

		// 6 十六进制展示
		System.out.println(Integer.toHexString(30));
		// 7 八进制展示
		System.out.println(Integer.toOctalString(10));
		
		// 8 int --> Integer 
		Integer i31 = Integer.valueOf(28); 
		// String --> Integer
		Integer i32 = Integer.valueOf("123");
		
		// 9 Integer -- String
		String s2 = i31.toString();
		System.out.println(i31);
		System.out.println(s2);
	}
}

Integer , int , String 三者之间类型转换

下面展示一些 内联代码片

// A code block
var foo = 'bar';
public class integer_04 {

	public static void main(String[] args) {
		// 1 int -- > Integer
		Integer i1 = new Integer(222);
		Integer i2 = Integer.valueOf(222);
		
		// 2 Integer --> int
		int i3 = i2.intValue();

		// 3 String --> Integer
		Integer i4 =  Integer.valueOf("123");
		Integer i5 = new Integer("12313");

		// 4 Integer --> String
		String s1 = i5.toString();

		// 5 String --> int
		int i6 = Integer.parseInt("12321");

		// 6 int --> String
		String s2 = 333+"";
	}
}

java1.5新特性

下面展示一些 内联代码片

 * 		自动装箱
 * 				把 基本数据类型 自动转换为 对应的包装类
 * 		
 * 		自动拆箱
 * 				把 包装类 自动转换为 基本数据类型
 * @杜智慧
 *
 * @Date 2021年1月20日
 */
public class integer_05 {
public static void main(String[] args) {
		
		// 1.5之前
		// 自动装箱之前的转换方式
		Integer i1 = new Integer(223); // Integer.vlaueOf(2222)
		// 自动拆箱之前的转换方式
		int i3 = i1.intValue();
		
		
		// 1.5 开始
		// 自动装箱之后的转换方式  
		Integer i2 = 222;  // 编译完后 就等于是 : Integer i2  = Integer.vlaueOf(222);
		// 自动拆箱之后的转换方式
		int i4 = i1; // 拆箱
		
		// 2 是基本类型,会先自动装箱转换为Integer类型,然后再向上转型(多态) 转换为Object
		m1(2);
	}
	public static void m1(Object obj){
		// 由于 覆写了toString方法,所以可以直接打印 2 ,而不是内存地址
		System.out.println(obj);
	}
}

自动装箱和拆箱的底层原理

下面展示一些 内联代码片

*      1 都是编译时的概念,和运行时无关
 * 		 2 装箱的时候,会在编译时 自动把赋值 操作 变成 Integer.valueOf(222)
 * 
 * String , Integer,Double 等 八种包装类 和String 都覆写了toString(),equals() , hashCode() 方法
 * 
 * valueOf : 把基本类型转换为Integer类型
 * 
 * 		但是里面初始化了一个整型常量池,值的范围是在 -128~127之间
 * 		其实  就是一个Integer[] 数组 有 256个对象,对象中的int值 分别为 -128,-127.....126,127  下标 是 0~ 255
 * 				如果 值 在 -128~127之间 就直接去这个缓存数组中找对应的对象即可,不用再重新创建Integer对象
 * @杜智慧
 *
 * @Date 2021年1月20日
 */
public class integer_06 {
public static void main(String[] args) {
		
		// 自动装箱 , 就等于 Integer i1 = Integer.valueOf(123);
		Integer i1 = 123;
		Integer i2 = 123;
		System.out.println(i1 == i2);
		// 等于 Integer i3 = Integer.valueOf(128);  不过 和 new Integer(128)  没啥区别,因为不符合常量池值的大小,所以是新new
		Integer i3 = 128;
		Integer i4 = 128;
		System.out.println(i3 == i4);
		
		// 以下  结果 和 上面结果 相同
		Integer i5 = Integer.valueOf(123);
		Integer i6 = Integer.valueOf(123);
		System.out.println(i5 == i6);
		
		Integer i7 = Integer.valueOf(128);
		Integer i8 = Integer.valueOf(128); 
		System.out.println(i7 == i8);
		
		// new 的方式  肯定是不行的,因为new了两次,对象内存地址不同,所以 == 比较内存地址,肯定是false,但是 使用equals 一定是true,因为都是1
		Integer i9 = new Integer(1);
		Integer i10 = new Integer(1);
		System.out.println(i9 == i10);
		System.out.println(i9.equals(i10));
	}
}

Math

下面展示一些 内联代码片

 * 提供科学的计算和基本的数字操作方法
 * 常用的方法都是静态的 , 直接类名调用就可以 , Math在Java.lang.Matj 所以不需要导包
public class Math_01 {
	public static void main(String[] args) {
		// abs  绝对值
		System.out.println(Math.abs(-9.2));
		
		// ceil: 向上取整
		System.out.println(Math.ceil(12.1));
		
		// floor : 向下取整
		System.out.println(Math.floor(12.1));
		
		// max : 比较谁大
		System.out.println(Math.max(3, 2));
		
		// min : 比较谁小
		System.out.println(Math.min(3, 2));
		
		// sqrt  : 开平方  取负数的时候会有-----> NaN : Not a Number
		System.out.println(Math.sqrt(9));
		
		// cbrt  : 立方根
		System.out.println(Math.cbrt(27));
		
		// random  :  随机数  从0~1之间  *10 就是1~10之间
		System.out.println(Math.random()*10);
		
		// rint  : 四舍五入  注意 , X.5的值是取偶数 比如1.5会取2 , 2.5也取2 除了xx.5 其他的按照四舍五入来
		System.out.println(Math.rint(1.1));
		System.out.println(Math.rint(1.5));
		System.out.println(Math.rint(2.6));
		System.out.println(Math.rint(3.5));
		
		// pow : 几次幂 , 如 2的3次方
		System.out.println(Math.pow(2, 3)); // 8.0
	}
}

Nmuber

数字格式化

下面展示一些 内联代码片

 *     #代表任意数字  , 0~9任意单个数字
 *     ,表示千分位 
 *     . 小数点
 *     0 补位
public class Nmuber_01 {
	public static void main(String[] args) {
		// 千分位分割
		DecimalFormat df = new DecimalFormat("###,###");
		System.out.println(df.format(123456));
		
		// 加入千分位 保留两位小数
		 df = new DecimalFormat("###,###.##");
		 System.out.println(df.format(123456.123)); // 进行四舍五入
	}
}

BigInteger

下面展示一些 内联代码片

// A code block
var foo = 'bar';
public class BigInteger_01 {
	public static void main(String[] args) {
		BigInteger v1 = new BigInteger("100");
		BigInteger v2 = new BigInteger("20");
		// 加法
		System.out.println(v1.add(v2)); // 120
		// 减法
		System.out.println(v1.subtract(v2)); // 80
		// 乘法
		System.out.println(v1.multiply(v2)); // 2000
		// 除法
		System.out.println(v1.divide(v2)); // 5
		// 取余
		System.out.println(v1.remainder(v2)); // 0
		
		
		BigDecimal v3 = new BigDecimal(123);
		BigDecimal v4 = new BigDecimal(123);
		v3.add(v4);
		v3.subtract(v4);
		// .....
	}
}

Random

下面展示一些 内联代码片

//  随机数  从0 开始
public class Random_01 {
	public static void main(String[] args){
		// 创建对象 
		Random r = new Random();
		// 在0~100之间随机输出 共101个数
		int i = r.nextInt(101);
		
		System.out.println(i);
		System.out.println(i+100);
		
		int j = r.nextInt(10);
		// 包括10 不包括20 
		System.out.println(j+10);
	}
}

异常

概念

Java提供的一种识别以及响应错误的一种机制

try…catch…

解决异常 , 一般在客户端 catch语句可以写多个 , 如果异常有继承关系 , 应该先写子类再写父类
否则因为多态 , 父类会把子类捕捉 , 多个异常只会执行一个 , 就是最开始发生错误的异常 , 剩下的就不会再执行了

throws

抛出异常 , 一般在类库端(服务端)

throw

制造异常 , 异常源点 , 创建一个异常对象

finally语句块

必须执行的语句块

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值