1,异常处理
1,异常概述
在程序中,异常可能由程序员没有预料到的各种情况产生,如试图打开一个根本不存在的文件。在Java中的一些错误称作异常
2,异常的抛出与捕捉
(1)抛出异常
异常出现不做处理就会程序终止
(2)捕捉异常
分为三个部分try,catch,finally。
其中,try语句存放的是可能发生异常的java语句:catch语句块在try语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块。
3.常见的异常
4.自定义异常
1、创建自定义
1)创建自定义异常类。
(2)在方法中通过throw关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过关键字throw关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常的方法的调用者中捕获并处理异常。
5.在方法中抛出异常
throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常。多个异常可使用逗号分隔。
使用throws关键字将异常类抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
说明:如果是Error类、RuntimeException类或它们的子类,可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。
throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try-catch语句块。
throw通常用来抛出用户自定义异常。下面通过实例介绍throw的用法。
使用throw关键字捕捉异常。在项目中创建Captor类,该类中的quotient()方法传递两个int型参数,如果其中的一个参数为负数,则会抛出MyException异常,最后在main()方法中捕捉异常。
6.运行时的异常
RuntimeException异常是程序运行过程中抛出的异常。Java类库的每个包中都定义了异常类,所有这些类都是Throwable类的子类。Throwable类派生了两个子类,分别是Exception类和Error类。Error类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,这类错误比较严重。Exception类称为非致命类,可以通过捕捉处理使程序继续执行。Exception类又根据错误发生的原因分为RuntimeException异常和除RuntimeException之外的异常
7.异常使用原则
Java异常强制用户去考虑程序的强健性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕获程序在运行时发生的异常并进行相应的处理。编写代码处理某个方法可能出现的异常时,可遵循以下几条原则:
1.在当前方法声明中使用try-catch语句捕获异常。
2.一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。
3.如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常。
2,字符串
1,String 类
单个字符可以用char类型保存,多个字符组成的文本就需要保存在String对象中。String通常被称为字符串,一个String对象最多可以保存(2³²–1)个字节(占用4GB空间大小)的文本内容。
(1)声明字符串
在Java语言中,字符串必须包含在一对双引号("")之内。
String:指定该变量为字符串类型
str:任意有效的标识符,表示字符串变量的名称。
(2)创建字符串
在Java语言中,将字符串作为对象来处理,因此可以像创建其他类对象一样来创建字符串对象。创建对象要使用类的构造方法。
2,连接字符串
(1)连接多个字符串
使用“+”运算符可实现连接多个字符串的功能。“+”运算符可以连接多个String对象并产生一个新的Stiring对象。
使用“+”运算符可实现连接多个字符串的功能。“+”运算符可以连接多个String对象并产生一个新的Stiring对象。
(2)连接其他数据类型
误区警示:
只要“+”运算符的一个操作是字符串,编译器就会将另一个操作数转换成字符串形式,所以应谨慎地将其他数据类型的数据与字符串相连,以免出现意想不到的结果。
3,获取字符串信息
(1)获取指定索引位置的字符
String类提供了两种查找字符串的方法,即indexOf()与lastIndexOf()方法。这两种方法都允许在字符串中搜索指定条件的字符或字符串。indexOf()方法返回的是搜索的字符或字符串首次出现的位置,lastIndexOf()方法返回的是搜索的字符或字符串最后一次出现的位置。
4,字符串的操作
通过String类的substring()方法可对字符串进行截取。substring()方法被两种不同的重载形式,来满足不同的需要。这些形式的共同点就是都利用字符串的下标进行截取,且应明确字符串下标是从0开始的。
substring(int beginIndex)
该方法返回的是从指定的索引位置开始截取直到该字符串结尾的子串。语法如下:
str.substring(int beginIndex)
其中,beginIndex指定从某一索引处开始截取字符串.
去除首位空格
3,常用类库
1、包装类
1.Integer类
java.lang包中的Integer类、Byte类、Short类和Long类,分别将基本数据类型int、byte、short和long封装成一个类,由于这些类都是Number类的子类,区别就是封装不同的数据类型,其包含的方法基本相同,所以本节以Integer类为例讲解整数包装类。
Integer类在对象中包装了一个基本数据类型int的值,该类的对象包含一个int型的字段。此外,该类提供了多个方法,能在int类型和String类型之间互相转换,同时还提供了其他一些处理int类型时非常有用的常量和方法。
Integer类提供了以下4个常量:
MAX_VALUE:表示int类型可取的最大值,即。
MIN_VALUE:表示int类型可取的最小值,即。
SIZE:用来以二进制补码形式表示int值的位数。
TYPE:表示基本类型int的Class实例。
2.Double类
Double类和Float类是对double、float基本类型的封装,它们都是Number类的子类,都是对浮点数进行操作,所以常用方法基本相同。
Double类在对象中包装一个基本数据类型为double的值,每个Double类的对象都包含一个double类型的字段。此外,该类还提供多个方法,可以将double类型转换为String类型,将String类型转换为double类型,也提供了其他一些处理double类型时有用的常量和方法。
创建一个DoubleDemo类,首先使用Double类的valueOf()方法创建一个Double对象,然后使用Double类的常用方法对该对象进行操作,并查看它们的显示结果。
Double类主要提供了以下常量:
MAX_EXPONENT:返回int值,表示有限double变量可能具有的最大指数。
MIN_EXPONENT:返回int值,表示标准化double变量可能具有的最小指数。
NEGATIVE_INFINITY:返回double值,表示保存double类型的负无穷大值的常量。
3.Boolean类
Boolean类将基本类型为boolean的值包装在一个对象中。一个Boolean类型的对象只包含一个类型为boolean的字段。此类还为boolean类型和String类型的相互转换提供了许多方法,并提供了处理boolean类型时非常有用的其他一些常量和方法。在项目中创建BooleanDemo类,在主方法中以不同的构造方法创建Boolean对象,并调用booleanValue()方法将创建的对象重新转换为boolean类型数据输出。
Boolean提供了以下3个常量:
TRUE:对应基值true的Boolean对象。
FALSE:对应基值false的Boolean对象。
TYPE:基本类型boolean的Class对象。
4.Character类
Character类在对象中包装一个基本类型为char的值,该类提供了多种方法,以确定字符的类别(小写字母、数字等),并可以很方便地将字符从大写转换为小写,反之亦然。Character类提供了很多方法来完成对字符串地操作在项目中创建UpperOrLower类,在主方法中创建Character类的对象,通过判断字符的大小写状态确认将其转换为大写还是小写
Character类提供了大量表示特定字符的常量,例如:
CONNECTOR_PUNCTUATION:返回byte型值,表示Unicode规范中的常规类别“Pc”。
UNASSIGNED:返回byte型值,表示Unicode规范中的常规类别“Cn”。
TITLECASE_LETTER:返回byte型值,表示Unicode规范中的常规类别“Lt”。
5.Number类
前面介绍了Java中的包装类,对于数值型的包装类,它们有一个共同的父类——Number类,该类是一个抽象类,它是Byte、Integer、Short、Long、Float和Double类的父类,其子类必须提供将表示的数值转换为byte、int、short、long、float和double的方法。例如,doubleValue()方法返回双精度浮点值,floatValue()方法返回大单精度浮点值Number类的方法分别被其各子类所实现,也就是说,在Number类的所有子类中都包含以上这几种方法。
6,数字处理
数字格式化
可见用0来会出现前面有0的情况
0表示在这个位置有数字显示数字没数字显示0
可改为#
可得到正确结果
math 类
三角函数
public static double sin(double a): 返回角的三角正弦。
public static double cos(double a): 返回角的三角余弦。
public static double tan(double a): 返回角的三角正切。
public static double asin(double a): 返回角的三角反正弦。
public static double acos(double a): 返回角的三角反余弦。
public static double atan(double a): 返回角的三角反正切。
public static double toRadians(double a): 将角度转换为弧度。
public static double toDegrees(double a): 将弧度转化为角度。
指数函数
Math类中与指数相关的函数方法如下。
public static double exp(double num):用于获取e的a次方。
public static double log(double num):用于取自然对数,即取lna的值。
public static double log10(double num):用于取底数为10的a的对数。
public static double sqrt(double num):用于取num的平方根,其中a的值不能为负值。
public static double cbrt(double num):用于取a的立方根。
public static double pow(double num1,double num2):用于取a的b次方。
指数运算包括求方根、取对数以及求n次方的运算。
取整函数
在具体的问题中,取整操作使用也很普遍,所以Java在Math类中添加了数字取整方法。Math类中主要包括以下几种取整方法:
public static double ceil(double num):返回大于等于参数的最小整数(向上取整)。
public static double floor(double num):返回小于等于参数的最大整数(向下取整)。
public static double rint(double num):返回与参数最接近的整数,如果存在两个相同接近的整数,则结果取偶数。
public static int round(float num):将参数加上0.5后返回与参数最近的整数。
public static long round(double num):将参数加上0.5后返回与参数最近的整数,然后强制转换为长整型。
取最大值、最小值、绝对值函数方法
在程序中最常用的方法就是最大值、最小值、绝对值等,Math类中包括的操作方法如下:
public static double max(double a,double b):取a,b中的最大值。
public static int min(int a,int b):取a,b中的最小值,参数为整形。
public static long min(long a,long b):取a,b中的最小值,参数为长整型。
public static float min(float a,float b):取a,b中的最小值,参数为单精度浮点型。
public static double min(double a,double b):取a,b中的最小值,参数为双精度浮点型。
public static int abs(int a):返回整形参数的绝对值。
public static long abs(long a):返回长整型参数的绝对值。
public static float abs(float a):返回单精度浮点型参数的绝对值。
public static double abs(double a):返回双精度浮点型参数的绝对值。
7.Random类
Random类是JDK中随机数生成器,可以通过实例化一个Random对象创建一个随机数生成器,语法如下:
Random r = Random();
以这种方式实例化对象时,Java编译器将以系统当前时间作为随机生成器的种子。因为每时每刻的时间不可能相同,所以产生的随机数不同。但是如果运行速度太快,也会产生两个运行结果相同的随机数。
用户也可以在实例化Random类对象时,设置随机生成器的种子。语法如下:
Random r = new Random(seedValue);
r:Random类对象。
seedValue:随机数生成器的种子。
在Random类中,提供了获取各种数据类型随机数的方法,下面例举几个常用的方法:
public int nextInt():返回一个随机整数。
public int nextInt(int n):返回大于等于0且小于n的随机整数。
public int nextLong():返回一个随机长整数。
public boolean nextBoolean():返回一个随机布尔型值。
public float nextFloat():返回一个随机单精度浮点型值。
public double nextDouble():返回一个随机双精度浮点型值
public double nextGaussian():返回一个概率密度为高斯分布的双精度浮点型值。
8.BigInteger类
BigInteger类的数字范围较Integer类的数字范围要大得多。前文介绍过Integer类是int的包装类,int的最大值为2³¹-1,如果要计算更大的数字,使用Integer类就无法实现了,所以Java中提供了BigInteger类来处理更大的数字。BigInteger类支持任意精度的整数,也即是说,在运算中BigInteger类可以准确地表示任何大小的整数值而不会丢失信息。
在BigInteger类中封装了多种操作,除了基本的加、减、乘、除操作,还提供了绝对值、相反数、最大公约数以及判断是否为质数等操作。
使用BigInteger类,可以实例化一个BigInteger对象,并自动调用相应的构造函数。BigInteger类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数字。
例如,将2转换为BigIntege类型,可以使用以下语句进行初始化操作:
BigInteger twoInstance = new BigInteger("2");
注意:参数2的双引号不能省略,因为参数是以字符串的形式存在的。
一旦创建了对象实例,就可以调用BigInteger类中的一些方法进行运算操作,包括基本的数学运算和位运算以及一些取相反数、取绝对值等操作。下面列举了BigInteger类中常用的几种运算方法:
public BigInterger add(BigInteger val):做加法运算。
public BigInteger subtract(BigInteger val):做减法运算。
public BigInteger muItiply(BigInteger val):做乘法运算。
public BigInteger divide(BigInteger val):做除法运算。
public BigInteger renmainder(BigInteger val):做取余操作。
public BigInteger[] divideAndRemainder(BigInteger va):用数组返回余数和商,结果数组中第一个值位商,第二个值位余数。
public BigInteger pow(int exponet):进行取参数的exponent次方操作。
public BigInteger negate():取相反数。
public BigInteger shiftLeft(int n):将数字左移n位,如果n为负数,做右移操作。
public BigInteger shiftRight(int n):将数字右移n位,如果n位负数,做左移操作。
public BigInteger and(Bigteger val):做与操作。
public BigInteger or(Bigteger val):做或操作。
public int compareTo(Bigteger val):做数字比较操作
public boolean equals(Object x):当参数x是Bigteger类型的数字并且数值与对象实例的数值相等时,返回true。
public BigInteger min(Bigteger val):返回较小的数值。
public BigInteger max(Bigteger val):返回较大的数值。
9.BigDecimal类
BigDecimal类和BigInteger类都能实现大数字的运算,不同的是BigDecimal类加入了小数的概念。一般的float型和double型数据只可以用来做科学计算或工程计算,但由于在商业计算中要求数字精度比较高,所以要用到BigDecimal类。BigDecimal类支持任何精度的定点数,可以用它来精确计算货币值。在BigDecimal类中
BigDecimal类型的数字可以用来做超大的浮点数的运算,如加、减、乘、除等,但是在所有的运算符中除法是最复杂的,因为在除不尽的情况下商小数点后的末位的处理是需要考虑的。
10,system类
System类是JDK中提供的系统类,该类是用final修饰的,所以不允许被继承。System类提供了很多系统层面的操作,并且这些方法全部都是静态的。System类提供的较常用方法如下表所示。本节重点讲解利用System类控制台输出和计时这两个操作。
1.控制台输出字符
System类提供了标准输入、标准输出和错误输出流,也就是说,System类提供了3个静态对象:in、out和err。本书中的代码多次使用了这些对象,最常见的就是out对象。在控制台输出字符串,输出的方法有两种,下面分别进行讲解。
(1)不会自动换行的print()方法
print()方法的语法如下:
System.out.print("Hello!");
此方法输出“Hello”文字,输出完毕后,光标会停留在“Hello”文字末尾,不会自动换行。
(2)可以自动换行的println()方法
println()方法在print后面加上了“ln”后缀(就是line的简写),语法如下:
System.out.println("书籍是人类进步的阶梯!");
此方法输出“书籍是人类进步的阶梯!”后会自动换行。光标停留在下一行的开头。
print()方法与println()方法输出的对比效果如下表所示。
两种输出方法的效果比较
Java语法 运行结果 Java语法 运行结果
System.out.println("左");
System.out.println("中");
System.out.println("右");
左中右
System.out.println("上");
System.out.println("中");
System.out.println("下");
上
中
下
综上所述,Java输出换行的方法有以下两种:
System.out.print("\n");//利用换行符\n实现换行
System.out.println();//空参数即可实现换行
误区警示:
使用这两个输出方法时还要注意以下两点:
(1)“System.out.println("\n");”会打印两个空行。
(2)“System.out.print();”无参数会报错。
2.计时
System.currentTimeMillis()方法可以获取自1970年1月1日零点至今的毫秒数。虽然Date日期类也有类似的方法,但代码会比System类多,所以System.currentTimeMillis()方法是为获取当前毫秒数最常用的方法。因为该方法的返回值精确到毫秒,所以可以利用该方法来记录程序的运行时间。
11,Scanner类
与c语言不同,Java从控制台中读出用户输入的值,用到的不是一行可以直接使用的代码,而是由一个叫Scanner的类来实现的。Scanner英文直译就是扫描仪,它的用途就和现实生活的扫描仪一样,可以把数字化信息转为人类可识别的文字。控制台输出内容用到了System.out就表示向控制台输出,System.in就表示从控制台输入,让Scanner扫描System.in就可以获取用户输入的值了。
使用Scanner类首先要引入该类,其语法如下:
import java.util.Scanner; //引入Scanner类
Scanner类提供了如下表所示的几种常用的方法,通过这些方法可以获取控制台中输入的不同类型的值。
Scanner类的几个常用方法
方法名 返回类型 功能说明 方法名 返回类型 功能说明
next() String 查看并返回此扫描器获取的下一个完整标记 nextInt() int 扫描一个值返回int类型
nextBoolean() boolean 扫描一个布尔值标记并返回 nextLine() String 扫描一个值返回String类型
nextByte() byte 扫描一个值返回byte类型 nextLong long 扫描一个值返回long类型
nextDouble() double 扫描一个值返回double类型 nextShort short 扫描一个值返回short类型
nextFloat() float 扫描一个值返回float类型 close() void 关闭此扫描器
误区警示:
nextLine()方法扫描的内容是从第一个字符开始到换行符为止,而next()、nextInt()等方法扫描的内容是从第一个字符开始到这段完整内容结束。
使用Scanner类扫描控制台的代码如下:
Scanner sc = new Scanner(System.in);
System.in表示控制台输入流,在创建Scanner对象时把System.in作为参数,这样创建出的扫描器对象扫描的目标就是用户在控制台中输入的内容,再通过表中列出的方法将用户输入的内容转为Java的数据类型,就可以对数据进行加工了、显示了。
日期时间格式化
如果在程序中直接输出Date对象,显示的是“MonFeb 29 17:39:50 CST 2016”这种格式的日期时间,那么应该如何将其显示为“2016-02-29”或者“17:39:50”这样的日期时间格式呢?Java中提供了DateFormat类来实现类似的功能。
DateFormat类是日期时间格式化子类的抽象类,可以按照指定的格式对日期或时间进行格式化。DateFormat类提供了很多方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期时间Formatter,格式化风格主要包括SHORT、MEDIUM、LONG和FULL4种:
SHORT:完全为数字,如12.13.52或3:30pm。
MEDIUM:较长,如jan12,1952。
LONG:更长,如January12,1952或3:30:32pm。
FULL:完全指定,如Tuesday、April12、1952AD或3:30:42pm PST。
另外,使用DateFormat类还可以自定义日期时间的格式。要格式化一个当前语言环境下的日期,首先需要创建DateFormat类的一个对象,由于它是抽象类,因此可以使用其静态方法getDateInstance()进行创建,语法如下:
DateFormat df = DateFormat.getDateInstance();
使用getDateInstance()方法获取的是所在国家或地区的标准日期格式。另外,DateFormat类还提供了一些其他静态方法。例如,使用getTimeInstance()方法可获取所在国家或地区的时间格式,使用getDateTimeInstance()方法可获取日期和时间格式。
例如,将当前日期按照DateFormat类默认格式输出:
DateFormat df = DateFormat.getInstance();
System.out.println(df.format(new Date()));
结果如下:
2023/5/19 下午 15:32
输出长类型格式的当前时间:
DateFormat df = DateFormat.getTimeInstance(DateFormat.LONG);
System.out.println(df.format(new Date()));
结果如下:
CST 下午 15:41:00
输出长类型格式的当前日期:
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);
System.out.println(df.format(new Date()));
结果如下:
2023 年 5 月 19 日
输出长类型格式的当前时间和当前日期:
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
System.out.println(df.format(new Date()));
结果如下:
2023 年 5 月 19 日 CST 上午 10:01:12
由于DateFormat类是一个抽象类,不能用new创建实例对象。因此,除了使用getXXXInstance()方法创建其对象,还可以使用子类,如SimpleDateFormat类,该类是一个以语言环境相关的方式来格式化和分析日期的具体类,它允许进行格式化(日期→文本)、分析(文本→日期)和规范化。
3.Calendar类
打开JavaAPI文档可以看到java.util.Date类提供的大部分方法都已经过时了,因为Date类在设计之初没有考虑到国际化,而且很多方法也不能满足用户需求,比如需要获取指定时间的年月日时分秒信息,或者想要对日期时间进行加减运算等复杂的操作,Date类已经不能胜任,因此JDK提供了新的时间处理类一Calendar日历类。
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期)提供了一些方法。另外,该类还为实现包范围外的具体日历系统提供了其他字段和方法,这些字段和方法被定义为 protected。
Calendar 提供了一个类方法 getInstance(),以获得此类型的一个通用的对象。Calendar 类的getlinstance0方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化,其使用方法如下:
Calendar rightNow = Calendar.gerInstance();
说明
由于Calendar 类是一个抽象类,不能用new创建实例对象,因此除了使用getinstance()方法创建其对象,如果需要创建其对象,必须使用其子类,如 GregorianCalendar类。
12、Runtime类
Runtime类是JDK提供的运行时类,该类为Java程序提供了与当前运行环境相连接的一个通道,Java程序可以利用该类对当前的运行环境执行一些简单的操作。Runtime类不能使用new关键字创建实例,只能通过Runtime.getRuntime()方法获取实例。