Javase面向对象9:异常、常用类

目录

1. 笔记

1.2 异常

1.2 常用类

2. 练习

2.1 异常练习

2.2 字符串练习


1. 笔记

1.2 异常

1、什么是异常:
 指的是程序在执行过程中,出现的非正常的情况,如果不处理最终会导致JVM的非正常停止

2、异常处理方式
 (1)遇到错误就终止程序的运行
 (2)程序员编写代码处理

3、java异常体系结构
(1)Throwable顶层异常类
(2)Throwable两个子类
   Error:编译时候出现
   Exception(运行时异常):执行时候出现
(3)两个常用方法
  getMessage() :得到异常基本内容
  printStackTrace() :得到异常详细信息

4、常见异常
(1)栈溢出异常:StackOverflowError
    //演示StackOverflowError
    @Test
    public void testStackOverflowError() {
        digui();
    }
    public void digui() {
        digui();
    }

(2)数组下标越界 ArrayIndexOutOfBoundsException
    //1 感受异常
    public static void main(String[] args) {
        //定义数组
        int[] arr = {1,2,3};

        System.out.println(arr[3]);
    }

(3)空指针异常NullPointerException
    //空指针异常
    @Test
    public void testNullPointerException() {
        String[] names = new String[5];
        System.out.println(names[0].length());//字符串的长度
    }

(4)类型转换异常 ClassCastException
    //类型转换
    @Test
    public void testClassCastException() {
        Object obj = new Object();
        String str = (String) obj;
    }

(5)类型不匹配异常InputMismatchException
        //InputMismatchException
        Scanner input = new Scanner(System.in);
        System.out.print("请输入一个整数:");
        int num = input.nextInt();

(5)数学操作异常 ArithmeticException
    @Test
    public void test05(){
        int i = 1/0;
    }

5、运行时异常可以不处理,编译时异常必须进行处理

6、java异常抛出机制
(1)当前方法如果处理异常,后面调用者直接使用了
    如果当前方法不处理异常,由调用者处理

7、java异常处理-throw抛出异常
(1)throw  new  异常类名称(参数)
//throw抛出异常
public class ExceptionDemo2 {

    public static void main(String[] args) {

        //创建一个数组
        int[] arr = {2,4,52,2};  //null
        //根据索引找对应的元素
        int index = 4;
        //调用
        int arrayValue = getArrayValue(arr, index);
        System.out.println(arrayValue);
    }

    //根据下标获取数组值
    //int[] arr  数组 ,int index 数组下标
    public static int getArrayValue(int[] arr,int index) {
        //判断数组如何为空,抛出空指针异常
        if(arr == null) {
            //throw  new  异常类名称(参数)
            throw new NullPointerException("要访问的arr数组不存在");
        }
        //判断数组下标是否越界,如果越界抛出数组下标越界异常
        //数组最大下标 arr.length-1
        if(index < 0 || index > arr.length-1) {
            throw new ArrayIndexOutOfBoundsException("哥们,角标越界了");
        }
        //根据下标获取数组值
        int value = arr[index];
        return value;
    }
}


8、java异常处理-throws声明异常
//throws声明异常
public class ExceptionDemo3 {

    public static void main(String[] args) throws Exception {
       add();
    }

    //声明异常
    public static void add() throws Exception{
        System.out.println("add......");
    }
}
(1)将问题标识出来,报告给调用者。如果方法内通过throw抛出了**编译时异常**,而没有捕获处理(稍后讲解该方式),那么必须通过throws进行声明,让调用者去处理。
运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).

(2)如果方法出现异常,可以在方法里面进行处理,如果方法不进行处理,异常声明出来,由调用者进行处理


9、java异常处理-try catch捕获异常
(1)捕获异常 try  catch
public class ExceptionDemo4 {

    public static void main(String[] args)  {
        //获取方法异常信息
        try {
            //正常执行代码
            add();
        } catch (Exception e) {
            //捕获异常
            System.out.println("异常.......");
//            String message = e.getMessage();
//            System.out.println(message);
           e.printStackTrace();
        }
    }

    //声明异常
    public static void add() throws Exception{
        //System.out.println("add......");
        int i = 1/0;
    }
}

(2)如果程序可能会出现多个异常,一般建议分别处理;或者直接写Exception进行处理
        try {

      } catch (FileNotFoundException e) {

      } catch (IllegalAccessException e) {
         e.printStackTrace();
      }


10、finally块
(1)try  catch  finally  或者 try  finally
(2)finally里面代码总会被执行,一般在finally放关闭资源代码
//捕获异常 try  catch finally
public class ExceptionDemo5 {

    public static void main(String[] args)  {
        try {
            System.out.println("程序开始执行了.......");
            int i = 1/0;
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            //总会被执行
            System.out.println("finally.......");
        }
    }
}


11、自定义异常
(1)异常类如何定义:**
   自定义一个编译期异常: 自定义类 并继承于`java.lang.Exception
   自定义一个运行时期的异常类:自定义类 并继承于`java.lang.RuntimeException

(2)继承Exception实现自定义异常
//自定义异常类
class RegisterException extends Exception {
    //无参数构造
    public RegisterException() {
    }

    //有参数构造
    public RegisterException(String message) {
        super(message);
    }
}

    //模拟注册 用户名重复判断
    public static boolean checkName(String name) throws RegisterException {
        //用户名是admin,提示已经存在
        if("admin".equals(name)) {
            //抛出异常
            throw new RegisterException("用户名已经存在");
        }
        return true;
    }

(3)继承RuntimeException实现自定义异常
//自定义异常类
class RegisterException extends RuntimeException {
    //无参数构造
    public RegisterException() {
    }

    //有参数构造
    public RegisterException(String message) {
        super(message);
    }
}

1.2 常用类

(前面已经写过一些数学类,这里主要完整介绍字符串,非常重要)

 1、 字符串 ☆☆☆☆☆
(1)字符串不是基本数据类型,字符串使用双引号包起来 "abcd"

(2)字符串String类型本身是final声明的,不能继承String。

(3)字符串的对象也是不可变对象,意味着一旦进行修改,就会产生新对象

(4)创建字符串
    public static void main(String[] args) {
        //第一种
        String str1 = "abc";

        //第二种
        String str2 = new String("www");

        //第三种
        char data[] = {'a', 'b', 'c'};
        String str3 = new String(data);
    }

(5)jvm结构:栈   堆   方法区
JDK1.6及其之前:常量池放到方法区
JDK1.7:常量池放到堆
JDK1.8:常量池放到元空间(没有方法区)

(6)如果使用String str1 = "abc";创建字符串,存储结构
* 在方法区创建对象 abc
* 在栈指向方法区对象(引用)
* 方法区对象可以被共享

(7)如果使用String str2 = new String("www");创建字符串,存储结构
* 首先在方法区创建对象 www
* 在堆创建方法对象副本 www
* 方法区对象和堆里面指向同一个数组
* 在栈在栈指向堆对象(引用)

2、字符串操作常用方法
public class StringDemo2 {

    public static void main(String[] args) {
       //  获取字符串长度 length()
        String str1 = "abcd";
        int length = str1.length();
        //System.out.println(length);

        //String concat(xx):拼接,等价于+
        String str2 = "atguigu";
        String newStr = str2.concat(str1);
        //System.out.println(newStr);

        //toUpperCase
        String str3 = "lucymary";
        String newStr1 = str3.toUpperCase();
       // System.out.println(newStr1);

        //contains(xx):是否包含xx
        boolean flag = str3.contains("l");
       // System.out.println(flag);

        //indexOf(xx):查找字符串中字符位置
        String str4 = "lucymary";
        int c = str4.indexOf("c");
        //System.out.println(c);

        //lastIndexOf(xx):最后一个查找字符位置
        String str5 = "l-u-c-y";
        int i = str5.lastIndexOf("-");
        //System.out.println(i);

       //substring(int beginIndex) :返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
        String str6 = "lucy";
        //String substring = str6.substring(1);
       // System.out.println(substring);

        //substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。

        String str7 = "lucymary";
//        String substring = str7.substring(1,3);
//        System.out.println(substring);

        // charAt(index):返回[index]位置的字符
        char c1 = str7.charAt(2);
        System.out.println(c1);

    }
}


3、字符串拼接相关问题
(1)java字符串拼接约定原则
   第一、常量+常量:结果是常量池
   第二、常量与变量 或 变量与变量:结果是堆
   第三、拼接后调用intern方法:结果在常量池
   第四、concat方法拼接,结果都是在堆

4、字符串操作其他方法
(1)charAt方法:获取指定位置字符
    public static void main(String[] args) {
        //charAt方法:获取指定位置字符
        String str = "abcd";
        char c = str.charAt(2);
        System.out.println(c);
    }
(2)Arrays类相关方法

(3)boolean startsWith(xx):是否以xx开头

(4)boolean endsWith(xx):是否以xx结尾


5、字符串编码问题
    //演示字符串编码操作
    @Test
    public void test01() throws UnsupportedEncodingException {
        String str = "尚硅谷";
        System.out.println(new String(str.getBytes("ISO8859-1"), "ISO8859-1"));// 乱码
        System.out.println(new String(str.getBytes("GBK"), "GBK"));// 中国
        System.out.println(new String(str.getBytes("UTF-8"), "UTF-8"));// 中国
    }

iso8859-1  gbk  utf-8


6、正则匹配
- 定义:一组验证数据的规则

- 常用语法格式:

  **第一种** **直接定义**

   验证规则

  **第二种** **(使用这种方法)**

  ^[验证规则]{验证次数}$

   @Test
   public void test1(){
      //简单判断是否全部是数字,这个数字可以是1~n位
      String str = "12a345";

      //正则不是Java的语法,它是独立与Java的规则
      //在正则中\是表示转义,
      //同时在Java中\也是转义
      boolean flag = str.matches("\\d+");
      System.out.println(flag);
   }


7、字符串操作其他方法
(1)替换方法
replace("要替换内容","替换成内容"):不支持正则
replaceFirst("要替换内容(正则)","替换成内容"):替换第一个匹配部分
repalceAll("要替换内容(正则)","替换成内容"):替换所有匹配部分
    //替换
    @Test
    public void test2() {
        String str = "abcd-ddew-ewdd-sssw";
        String newStr = str.replaceAll("-", "");
        System.out.println(newStr);
    }

(2)拆分方法
    //拆分
    @Test
    public void test3() {
        String str = "a-b-c-d";
        String[] values = str.split("-");
        System.out.println(Arrays.toString(values));
    }


8、可变字符操作
(1)StringBuffer Bulider
public class StringMethod2 {

    public static void main(String[] args) {

    }

    //删除
    @Test
    public void test03(){
        StringBuilder s = new StringBuilder("helloworld");
        //s.delete(1, 3);  //[1,3)
        s.deleteCharAt(1);
        System.out.println(s);
    }

    //insert
    @Test
    public void test02() {
        StringBuilder stringBuilder = new StringBuilder("helloworld");
        stringBuilder.insert(2,"atguigu");
        System.out.println(stringBuilder);
    }

   //追加
    @Test
    public void test01() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("hello").append(true).append('a').append(12).append("atguigu");
        //.toString(
        System.out.println(stringBuilder);
    }
}

9、日期时间操作
public class DateTimeDemo {

    //获取当前系统日期时间
    @Test
    public void test01() {
        Date date = new Date();
        System.out.println(date);
    }

    //获取当前时间毫秒数
    @Test
    public void test02() {
        long mill = System.currentTimeMillis();
        System.out.println(mill);
        //当前系统时间距离1970-1-1 0:0:0 0毫秒的时间差,毫秒为单位
    }

    //获取当前时间毫秒数
    @Test
    public void test03() {
        Date date = new Date();
        long time = date.getTime();
        System.out.println(time);
    }

    //获取当前系统日期时间,格式
    @Test
    public void test04() {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new
               SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        String dateTime = simpleDateFormat.format(date);
        System.out.println(dateTime);
    }
} 

2. 练习

2.1 异常练习

练习一:

1、声明Husband类,包含姓名和妻子属性,属性私有化,提供一个Husband(String name)的构造器,重写toString方法,返回丈夫姓名和妻子的姓名

2、声明Wife类,包含姓名和丈夫属性,属性私有化,提供一个Wife(String name)的构造器,重写toString方法,返回妻子的姓名和丈夫的姓名

3、声明TestMarry类,在main中,创建Husband和Wife对象后直接打印妻子和丈夫对象,查看异常情况,看如何解决

public class TestException {
	public static void main(String[] args) {
		Husband h = new Husband("张三");
		Wife w = new Wife("李四");
		/*	
		 * 发生空指针异常,因为丈夫的妻子属性和妻子的丈夫属性没有赋值	
		System.out.println(h);
		System.out.println(w);*/
		
		h.setWife(w);
		w.setHusband(h);
		System.out.println(h);
		System.out.println(w);
	}
}
class Husband{
	private String name;
	private Wife wife;
	public Husband(String name) {
		super();
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Wife getWife() {
		return wife;
	}
	public void setWife(Wife wife) {
		this.wife = wife;
	}
	@Override
	public String toString() {
		return "Husband [name=" + name + ", wife=" + wife.getName() + "]";
	}
	
}
class Wife{
	private String name;
	private Husband husband;
	public Wife(String name) {
		super();
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Husband getHusband() {
		return husband;
	}
	public void setHusband(Husband husband) {
		this.husband = husband;
	}
	@Override
	public String toString() {
		return "Wife [name=" + name + ", husband=" + husband.getName() + "]";
	}
	
}

2.2 字符串练习

练习一:模拟一个trim方法,去除字符串两端的空格

	public static void main(String[] args) {
		String str ="    he   llo   ";
		System.out.println(myTrim(str));
		System.out.println(myTrim2(str));
		System.out.println(myTrim3(str));
	}
	
	public static String myTrim3(String str){
		//利用正则表达式
		//^表示开头    \s表示  空白符   *表示0次或多次     |表示或者    $表示结尾
		return str.replaceAll("(^\\s*)|(\\s*$)", "");
	}
	
	public static String myTrim2(String str){
		while(str.startsWith(" ")){
			str = str.replaceFirst(" ", "");
		}
		while(str.endsWith(" ")){
			str = str.substring(0, str.length()-1);
		}
		return str;
	}
	
	public static String myTrim(String str){
		char[] array = str.toCharArray();
		int start =0;
		for(int i=0;i<array.length;i++){
			if(array[i] == ' '){
				start++;
			}else{
				break;
			}
		}
		int end = array.length-1;
		for(int i=end;i>=0;i--){
			if(array[i] == ' '){
				end--;
			}else{
				break;
			}
		}
		
		String result = str.substring(start,end+1);
		
		return result;
	}

练习二:

将一个字符串进行反转。将字符串中指定部分进行反转。比如将“abcdefgho”反转为”abfedcgho”

public static void main(String[] args) {
		String str ="abcdefgho";
		System.out.println(str);
		System.out.println(reverse(str,2,5));

	}
	
	//从第start个字符,到第end个字符
	public static String reverse(String str,int start,int end){
		char[] array = str.toCharArray();
		for(int i = start,j=end;i< j;i++,j--){
			char temp =array[i];
			array[i]=array[j];
			array[j]=temp;
		}
		String s = new String(array);
		return s;
	}

练习三:

获取一个字符串在另一个字符串中出现的次数。

比如:获取"ab"在 “abababkkcadkabkebfkabkskab”中出现的次数

	public static void main(String[] args) {
		String str1="ab";
		String str2="abababkkcadkabkebfkabkskab";
		System.out.println(count(str1,str2));
	}
	
	public static int count(String str1,String str2){
		int count =0;
		do{
			int index = str2.indexOf(str1);
			if(index !=-1){
				count++;
				str2 = str2.substring(index + str1.length());
			}else{
				break;
			}
			
		}while(true);
		return count;
	}

练习四:

获取两个字符串中最大相同子串。比如:

str1 = "abcwerthelloyuiodef“;str2 = "cvhellobnm"

提示:将短的那个串进行长度依次递减的子串与较长的串比较。

	public static void main(String[] args) {
		String str=findMaxSubString("abcwerthelloyuiodef","cvhellobnm");
		System.out.println(str);
	}
	
	//提示:将短的那个串进行长度依次递减的子串与较长的串比较。
	public static String findMaxSubString(String str1,String str2){
		String result="";
		
		String mixStr = str1.length()<str2.length()?str1:str2;
		String maxStr = str1.length()>str2.length()?str1:str2;
		
		//外循环控制从左到右的下标,内循环控制从右到左的下标
		for(int i=0;i<mixStr.length();i++){
			for(int j=mixStr.length();j>=i;j--){
				String str=mixStr.substring(i, j);
				if(maxStr.contains(str)){
					//找出最大相同子串
					if(result.length()<str.length()){
						result = str;
					}
				}
			}
		}
		return result;
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯丰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值