JavaSE_day37(异常介绍,异常处理方式2种,确定相对路径的技巧两种,如何处理多个异常,Throwable的常用方法,Fianlly关键字)

1 A.java

/*异常(机制)介绍


 * Exception in thread "main" java.lang.ArithmeticException: / by zero
    at com.itjinling_01.ExceptionDemo.main(ExceptionDemo.java:5)
    
    我们在写代码的时候,经常的出现一些小问题,那么为了方便我们处理这些问题,java为我们提供了异常机制
    
    异常包含了错误的类型、原因以及位置
    
    异常:不正常,我们在代码的时候出现的编译或者运行时的错误
    
    异常的体系结构:
            Throwable(最顶层)
                    Error:出现的不能够处理的严重问题
                    Exception:可以处理的问题
                    
    电脑坏了:
        系统中毒:重装系统就可以了   exception
        主板坏了:买一台新的             error
 * 
 */

public class A {
	public static void main(String[] args) {
		/*
		int a = 10 / 0;//编译正常
		System.out.println(a);  //运行异常  :Exception in thread "main" java.lang.ArithmeticException: / by zero
											at com.itjinling_01.ExceptionDemo.main(ExceptionDemo.java:5)
		*/
//		FileWriter fw = new FileWriter("a.txt"); //编译错误 , 需要在方法中抛出异常
		
	}
}

2 B.java 

 *     异常的处理方式:
        捕获处理:见C.java
            try...catch语句
        抛出去   :见D.java
            throws
 *         
 * 【个人理解】:

【补充】:

try-catch是说明这段代码可能因为抛出异常而执行不了下面的语句

throws是说明这段可能会报什么xx异常,这种异常你没办法解决,只能让他眼睁睁报错

而try-catch调用了有throws过的代码,说明这是你自己选的,所以要用try-catch来控制你的代码,如果这段代码真throws了,那么下面的语句没必要执行了,所以就catch了。所以try-catch是有办法控制的


 *  jvm处理异常的方式:
 *      如果出现异常我们没有处理,jvm会帮我们进行处理,他会把异常的类型,原因还有位置显示在命令行
 *      并且还终止了程序,异常后面的代码将不在执行


public class B {
	
	public static void main(String[] args) throws Exception {
	   
		System.out.println(2/0);
		
		System.out.println("hello");
	     		
		}
}

3 C.java

 *     异常的处理方式:
 *             捕获处理
 *                 try...catch语句
 * 
 *                 try {
 *                     有可能出现问题的代码;
 *                 } catch(ArithmeticException ae) {
 *                     处理异常;
 *                 }
 * 
 *                 try...catch的执行顺序:
 *                     首先执行try语句
 *                         如果发现异常,异常下面的代码不在执行直接跳入catch语句中,catch语句结束后,整个try...catch结束
 *                         如果没有发现异常,try语句执行结束后,try...catch直接结束, 不在执行catch语句
 * 

 *  jvm处理异常的方式:
 *      如果出现异常我们没有处理,jvm会帮我们进行处理,他会把异常的类型,原因还有位置显示在命令行
 *      并且还终止了程序,异常后面的代码将不在执行
 */
 

public class C {
	public static void main(String[] args) throws Exception {
		try 
		{
			System.out.println(1);
			
			System.out.println(2 / 0);//这段报错的代码后面的代码不会执行!
			
			System.out.println(2);
		} catch (ArithmeticException ae) {
			
			System.out.println("除数不能为0");
		}

		System.out.println(3);

	}

}

4 D.java

 *     异常的处理方式:
 *             捕获处理
 *                 try...catch语句
 * 
 *                 try {
 *                     有可能出现问题的代码;
 *                 } catch(ArithmeticException ae) {
 *                     处理异常;
 *                 }
 * 
 *                 try...catch的执行顺序:
 *                     首先执行try语句
 *                         如果发现异常,异常下面的代码不在执行,直接跳入catch语句中,catch语句结束后,整个try...catch结束
 *                         如果没有发现异常,try语句执行结束后,try...catch直接结束, 不在执行catch语句
 * 
 * 
 *             抛出去throws
 *                 当我们不想处理异常,或者没有能力处理的时候,我们可以选择抛出异常,谁调用方法谁处理异常
 *                 使用关键字throws在方法的声明出抛出异常

 *         
 * 
 *  jvm处理异常的方式:
 *      如果出现异常我们没有处理,jvm会帮我们进行处理,他会把异常的类型,原因还有位置显示在命令行
 *      并且还终止了程序,异常后面的代码将不在执行

public class D {
	public static void main(String[] args) throws IOException {
		method();
		
		function();
		
	}
	
	public static void function() throws IOException {
		FileWriter fw = new FileWriter("src/day37/a.txt");
		fw.write("aSA");
		fw.flush();
		fw.close();
	}

	private static void method() {
		try {
			System.out.println(1);
			//System.out.println(2 / 0);
			System.out.println(2);
		} catch(ArithmeticException ae) {
			System.out.println("除数不能为0");
		}
		
		System.out.println(3);
	}
}

补充题外话,确定相对路径的小技巧:

eclipse软件的相对路径在java项目根目录下开始,vscode的会有提示比较方便)

①new FileWriter(a.txt)看生成在哪里

②File f2 = new File("a.txt"); 与

 System.out.println(f2.getAbsolutePath()); or

 System.out.println(f2.getAbsoluteFile());输出绝对路径。

5 E.java

 *     如何处理多个异常:
 *         可以使用多个try...catch语句
 *         使用一个try和多个catch
 * 
 * 多个catch之间的顺序:
 *             多个catch之间可以有子父类,如果有子父类,父类异常必须放在后面  ,Exception就是最大的父类,,需要放在最后面的catch
 *             平级之间没有顺序关系:  NullPointerException,ArrayIndexOutOfBoundsException
 *             
 *         

public class E {
	public static void main(String[] args) {
		
		method();
		
		System.out.println("---------");
		
		metho2();
		
	}

	private static void metho2() {
		try 
		{
			String s = null;
			System.out.println(s.length());
			
			int[] arr = new int[5];
			System.out.println(arr[8]);
			
			System.out.println(2 / 0);
			
		} 
		catch(NullPointerException e) {
			System.out.println("出现空指针了");
		}
		catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("出现数组越界了");
		} 
		
		catch(Exception e) {
			System.out.println("出现异常了");
		}
		
		try 
		{
		
		} catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("出现数组越界了");
		}
	}

	private static void method() {
		try
		{
			String s = null;
			System.out.println(s.length());
		} catch(NullPointerException e) {
			System.out.println("出现空指针了");
		}
		
		try {
			int[] arr = new int[5];
			System.out.println(arr[8]);
		} catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("出现数组越界了");
		}
	}


}

6 F.java

 * Throwable的常用方法:
        String getMessage()        原因
        String toString()               类型和原因
        void printStackTrace()     类型原因和位置

public class F {
	public static void main(String[] args) {
	
//		method();
		System.out.println("----------");
	
	
	
	}


	private static void method() {
		try 
		{
			System.out.println(2 / 0);
		
		} catch(ArithmeticException e) {
			//String getMessage() : 原因
			System.out.println(e.getMessage());  /// by zero
			
			//String toString()  类型和原因
			System.out.println(e.toString());  //java.lang.ArithmeticException: / by zero

			//void printStackTrace():类型原因和位置
			
			e.printStackTrace();
			/*
			 报错如下:java.lang.ArithmeticException: / by zero
			hello
			----------
				at day37.F.method(F.java:30)
				at day37.F.main(F.java:13)*/

		}
		
		System.out.println("hello");//注意是在try那边如果有报错才会停止下面的代码,不是catch
	}

}

7 G.java

 *  finally:组合try...catch使用,用于释放资源等收尾工作,无论try...catch语句如何执行,finally的代码一定会执行
 *  
 *  try {
 *      有可能出现问题的代码;
 *  
 *  } catch(异常对象) {
 *      处理异常;
 *  } finally {
 *      释放资源;
 *      清理垃圾;

public class G {
	public static void main(String[] args) throws IOException {
//		method();
//		System.out.println("--------------");
		
		FileWriter fw = null;
		try {

			fw = new FileWriter("src/day37/a.txt");
			fw.write("hello");
			fw.write("world");
			fw.flush();
			System.out.println(2 / 0);//  ,Exception in thread "main" java.lang.ArithmeticException: / by zero
//			下面代码运行不了 所以关闭不了资源,所以在finally里面关闭
			fw.write("java");
			fw.flush();
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//释放资源
			fw.write("11aa11");
			fw.close();
//			fw.write("abc");   会报错 说资源已关闭
		}
		
	}


		


	private static void method() {
		try {
			System.out.println(2 / 0);
			
		} catch(ArithmeticException e) {
			System.out.println("除数不能为0");
		} finally {
			
			System.out.println("清理垃圾");
		}

}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值