当前位置:首页 > Java技术 > java基础异常处理

java基础异常处理

2022年11月09日 21:40:43Java技术6
package com.quzihang.ErrorPrefine;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.junit.Test;

/*
 * Error:
 * Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError和OOM。
 * 
 * 一般不编写针对性的代码进行处理。
 * 
 * 一、异常体系结构
 * 
 * java.lang.Throwable
 * 		|-----java.lang.Error:一般不编写针对性的代码进行处理。
 * 		|-----java.lang.Exception:可以进行异常的处理
 * 			|------编译时异常(checked)
 * 					|-----IOException
 * 						|-----FileNotFoundException
 * 					|-----ClassNotFoundException
 * 			|------运行时异常(unchecked,RuntimeException)
 * 					|-----NullPointerException
 * 					|-----ArrayIndexOutOfBoundsException
 * 					|-----ClassCastException
 * 					|-----NumberFormatException
 * 					|-----InputMismatchException
 * 					|-----ArithmeticException
 * 
 */
public class ErrorTest {
	public static void main(String[] args) {
		// Error

		// 1.栈溢出:java.lang.StackOverflowError
//		main(args);//递归mian方法调用

		// 2.堆溢出:java.lang.OutOfMemoryError
//		Integer[] arr = new Integer[1024*1024*1024]; //相当于创建了1024^3长度的Integer对象数组

		// 异常

		// 空指针异常
//		String [] str1  = null;
//		System.out.println(str1.toString());			//java.lang.NullPointerException

		// 空指针异常
//		int [] int2  = new int[3];			//java.lang.ArrayIndexOutOfBoundsException
//		System.out.println(int2[3]);
//		String str = new String("abc");
//		str.charAt(3);			//java.lang.StringIndexOutOfBoundsException

		// 数据转换异常
//		String str = "abc";
//		Integer integer = Integer.parseInt(str);			//java.lang.NumberFormatException

		// classcast
//		Object obj = new Object();
//		String str = (String)obj;		//java.lang.ClassCastException

		// 不举例了。。。。。。

		// 处理机制
		// 1. try-catch-finally
		// 2. throws + 异常处理
		// 1. try-catch-finally
		
		/*
		 * 一、异常的处理:抓抛模型
		 * 
		 * 过程一:"抛":程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。 并将此对象抛出。
		 * 一旦抛出对象以后,其后的代码就不再执行。
		 * 
		 * 关于异常对象的产生:① 系统自动生成的异常对象 ② 手动的生成一个异常对象,并抛出(throw)
		 * 
		 * 过程二:"抓":可以理解为异常的处理方式:① try-catch-finally ② throws
		 * 
		 * 
		 * 二、try-catch-finally的使用
		 * 
		 * try{ //可能出现异常的代码
		 * 
		 * }catch(异常类型1 变量名1){ //处理异常的方式1 }catch(异常类型2 变量名2){ //处理异常的方式2 }catch(异常类型3
		 * 变量名3){ //处理异常的方式3 } .... finally{ //一定会执行的代码 }
		 */


		//每次运行的时候注意导入包
		// 数据转换异常
		String str = "abc";
		int int1 = 0;// 如果没有在try{}结构中赋值,之后使用的时候会出现没有初始化的情况,所以这里赋值为0
		try {
			int1 = Integer.parseInt(str); // java.lang.NumberFormatException
		} catch (NullPointerException e) {
			System.out.println("空指针异常");
		} catch (NumberFormatException e) {
			// 返回值是String的方法 getMessage (对象中提供的)
			System.out.println(e.getMessage());
			// 返回值是void 方法 printStackTrace 详细的结构调用 Trace
			e.printStackTrace();
			System.out.println("数值转换异常");
		}

		catch (Exception e) {// 一旦catch到就不会执行下一个catch
			System.out.println("异常啦");
		} finally {
			System.out.println("finally执行的代码");
		}

		System.out.println("catch之后代码执行");
	}

	/*
	 * 说明: 1. finally是可选的。
     *        2. 使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配 
     *		3. 一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的try-catch结构(在没有写finally的情况)。继续执行其后的代码
	 * 		4.catch中的异常类型的对象如果没有子父类关系,则谁声明在上,谁声明在下无所谓。 catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。否则,报错 
	 *		5. 常用的异常对象处理的方式: ① String getMessage() ② printStackTrace()
     * 		 6. 在try结构中声明的变量,再出了try结构以后,就不能再被调用
	 *		7.try-catch-finally结构可以嵌套
	 * 
	 * 体会1:使用try-catch-finally处理编译时异常,是得程序在编译时就不再报错,但是运行时仍可能报错。
	 * 相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。
	 * 
	 * 体会2:开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。
	 * 针对于编译时异常,我们说一定要考虑异常的处理。
	 */
	
	/*
	@Test    //导入Junit
	public void FilesReadTest1() {
		FilesRead1();
	}

	public void FilesRead1() {
		FileInputStream fis = null;
		
		try {
			File file = new File("hello.txt");//在项目中创建hello.txt
			fis = new FileInputStream(file);

			int data = fis.read();
			while (data != -1) {
				System.out.print((char) data);
				data = fis.read();
			}
		} catch (FileNotFoundException e) {
			System.out.println("found file error!");
		} catch (IOException e) {
			System.out.println("io error!");
		}finally {
				try {
					if (fis != null) {
					fis.close();
					}
				} catch (IOException e) {
					e.printStackTrace();
				
			}
		}
	}

	/*
	 * try-catch-finally中finally的使用: 1.finally是可选的
	 * 2.finally中声明的是一定会被执行的代码。即使catch中又出现异常了,try中有return语句,catch中有 return语句等情况。
	 * 3.像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的
	 * 释放。此时的资源释放,就需要声明在finally中。
	 */
	// 2. throws + 异常处理
	@Test
	public void FilesReadTest2() throws FileNotFoundException,IOException {
		FilesRead2();		//在main中try-catch-finally
	}
	
		public void FilesRead2() throws FileNotFoundException,IOException{	
			File file = new File("hello1.txt");
			FileInputStream fis = new FileInputStream(file);
			
			int data = fis.read();
			while(data != -1){
				System.out.print((char)data);
				data = fis.read();
			}
			fis.close();
		}
}
/*
 * 异常处理的方式二:throws + 异常类型
 * 
 * 1. "throws + 异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。
 *     一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后的异常
 *     类型时,就会被抛出。异常代码后续的代码,就不再执行!
 *     
 * 2. 体会:try-catch-finally:真正的将异常给处理掉了。
 *        throws的方式只是将异常抛给了方法的调用者。  并没有真正将异常处理掉。  
 * 
 * 3. 开发中如何选择使用try-catch-finally 还是使用throws?
 *   3.1 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果
 *       子类重写的方法中有异常,必须使用try-catch-finally方式处理。
 *   3.2 执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throws
 *       的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。
 */
	/*
	 * 方法重写的规则之一:
	 * 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(重要!!)
	 */

``` java
//下面给一个例子(通过命令行输入参数!)
public class ErrorFinder1 {
	public static void main(String[] args) {

		try {
			if (args.length != 2) {
				throw new ArrayIndexOutOfBoundsException();
			}
			int int1 = Integer.parseInt(args[0]);
			int int2 = Integer.parseInt(args[1]);
			method(int1, int2);
		} catch (NumberFormatException e) {
			System.out.println("数据类型不一致");
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("输入不正确");
		} catch (ArithmeticException e) {
			System.out.println("除0");
		}

	}

	public static int method(int a, int b) {
		if (a < 0 || b < 0) {
			throw new ArrayIndexOutOfBoundsException("");
		}

		return a / b;
	}

}

作者:QU头
来源链接:https://www.cnblogs.com/aquawius/p/14315083.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/69200.html

分享给朋友:

“java基础异常处理” 的相关文章

Java空指针异常解决java.lang.NullPointerException解决心得

Java空指针异常解决java.lang.NullPointerException解决心得

今天做课设的时候运行程序报出以下错误 java.lang.NullPointerException 首先要理解的是此错误并不会在 程序中报错,只会在运行的时候报错。 是由于某个参数(集合,数组等数据)可能出现一个null值而导致后面的程序不能运行时...

Java 并发核心机制

Java 并发核心机制

📦 本文以及示例源码已归档在 javacore 一、J.U.C 简介 Java 的 java.util.concurrent 包(简称 J.U.C)中提供了大量并发工具类,是 Java 并发能力的主要体现(注意,不是全部,有部分并发能力的支持在其他包中)。...

冒泡排序的原理,思路,以及算法分析(Java实现)

冒泡排序的原理,思路,以及算法分析(Java实现)

冒泡排序 如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。 1.原理:比较两个相邻的元素,将值大的元素交换到右边 2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。 (1)第一次比较:首先比较第...

初探设计:Java继承何时用?怎么用?

初探设计:Java继承何时用?怎么用?

Writer      :BYSocket(泥沙砖瓦浆木匠) 一、回顾继承 常见的如下: 1、依赖(”uses-a“) 2、聚合(”has-a“) 3、继承(”is-a“)类...

java总结文章

java总结文章

java总结文章 原创地址: http://www.cnblogs.com/Alandre/ (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks Talk is cheap. Show me the...

Java常用日志框架介绍

Java常用日志框架介绍

目录 Java日志概述 Java常用日志框架类别 Java常用日志框架历史 java常用日志框架关系 Commons Logging与Slf4j实现机制对比 Commons Logg...

JavaWeb 并发:FOR UPDATE 实战,监测并解决。

JavaWeb 并发:FOR UPDATE 实战,监测并解决。

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket   一、前言 针对并发,老生常谈了。目前一个通用的做法有两种:锁机制:1.悲观锁;2.乐观锁。 但是这篇我主要用于记录我...

Java Calendar类的使用总结

  在实际项目当中,我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年。。。。某些网站会记录下用户登陆的时间,比如银行的一些网站,对于这些经常需要处理的问题,Java中提供了Calendar这个专门用于对日期进行操作的类,那么这个类有什么...

Java反射机制详解

Java反射机制详解

     Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。 1、关于Class &n...

Java Web 学习路线

Java Web 学习路线

实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了。大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算是学完了,找工作对你来说或许还有些距离,而我已经有了自己喜欢的工作,从一个自学狂人的角...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。