时间:2021-05-19
1、对异常的理解:异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
2、Java程序在执行过程中所发生对异常事件可分为两类:
3、运行时异常和编译时异常
运行时异常
编译时异常
代码示例一:java.lang.OutOfMemoryError(堆溢出)
public class ErrorTest { public static void main(String[] args) { //堆溢出:java.lang.OutOfMemoryError Long[] arr = new Long[1024*1024*1024]; }}运行结果:
代码示例二:java.lang.StackOverflowError(栈溢出)
public class ErrorTest { public static void main(String[] args) { //栈溢出:java.lang.StackOverflowError main(args); }}运行结果:
2.Exception(运行时异常和编译时异常)
运行时异常
/* ******************以下是运行时异常****************** */ //ArithmeticException @Test public void test1(){ int num1 = 3; int num2 = 0; int num3 = 3 / 0; } //InputMismatchException @Test public void test2(){ Scanner scanner = new Scanner(System.in); int i = scanner.nextInt(); System.out.println(i); scanner.close(); } //NumberFormatException @Test public void test3(){ String str = "abcd"; int num = Integer.parseInt(str); } //ClassCastException @Test public void test4(){ Object obj = new Boolean(true); String str = (String)obj; } //IndexOutOfBoundsException @Test public void test5(){ ArrayIndexOutOfBoundsException Byte[] bytes = new Byte[3]; System.out.println(bytes[4]); } //NullPointerException @Test public void test6(){ int[] arr = null; System.out.println(arr[1]); }编译时异常
/* ******************以下是编译时异常****************** */ @Test public void test7(){ File file = new File("a.txt"); //java.io.FileNotFoundException FileInputStream fis = new FileInputStream(file); //java.io.IOException int date = fis.read(); while (date != -1){ System.out.println((char)date); date = fis.read(); } fis.close(); }ps:对于编译时异常,我们需要异常处理
过程一:“抛”:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象, 并将此对象抛出;一旦抛出对象以后,其后的代码就不再执行。
关于异常对象的产生:
① 系统自动生成的异常对象
② 手动的生成一个异常对象,并抛出(throw)
过程二:“抓”:可以理解为异常的处理方式:① try-catch-finally ② throws
说明:
示例一:
@Testpublic void test1(){ String str = "abcd"; int num = 1314; try { num = Integer.parseInt(str); System.out.println("进入try代码块!"); }catch (NumberFormatException e){ System.out.println("出现数值转换异常了!"); System.out.println(e.getMessage()); e.printStackTrace(); System.out.println("该catch语句块将要执行完了!"); } catch (NullPointerException e){ System.out.println("出现空指针异常!"); } catch (Exception e){ System.out.println("出现异常了"); }finally { System.out.println("执行finally语句了!"); } System.out.println(num);}输出结果:
示例二:
@Test public void test2(){ File file = new File("a.txt"); FileInputStream fis = null; try { fis = new FileInputStream(file); int date = fis.read(); while(date != -1){ System.out.println((char)date); date = fis.read(); } } catch (FileNotFoundException e) { e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); }finally { System.out.println("执行finally语句了!"); try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } }输出结果:
总结:
"throws + 异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行!
try-catch-finally:真正的将异常给处理掉了。
throws的方式只是将异常抛给了方法的调用者。 并没有真正将异常处理掉。
子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(子类重写的方法也可以不抛出异常)
public class SuperClass { public void method() throws IOException { }}class SubClass extends SuperClass{ //报错,子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型// public void method() throws Exception{//// } public void method() throws FileNotFoundException{ }}开发中如何选择使用try-catch-finally 还是使用throws? 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果
子类重写的方法中有异常,必须使用try-catch-finally方式处理。执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throws
的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。
代码示例:
public class ErrorThrows { public static void method1() throws IOException { File file = new File("a.txt"); FileInputStream fileInputStream = new FileInputStream(file); int data = fileInputStream.read(); while(data != -1){ System.out.println((char)data); data = fileInputStream.read(); } fileInputStream.close(); } public static void method2() throws IOException { method1(); } public static void method3() throws IOException { method1(); } public static void main(String[] args) { try { method3(); } catch (IOException e) { e.printStackTrace(); } }}代码示例:
public class ReturnException { static void method1(){ try{ System.out.println("进入方法1"); throw new RuntimeException("手动抛出异常"); }catch (Exception e){ e.printStackTrace(); System.out.println(e.getMessage()); } finally { System.out.println("执行finally语句了!"); } } public static void main(String[] args) { method1(); }}输出结果:
自定义异常类,有如下三步骤:
自定义异常类:
public class MyExceptionClass extends Exception{ static final long serialVersionUID = -5641210210148784L; public MyExceptionClass() { } public MyExceptionClass(String message) { super(message); }}手动抛出上述自定义的异常类对象:
public class MyExceptionTest { static void method1() throws MyExceptionClass { Scanner scanner = new Scanner(System.in); System.out.println("请输入大于0的数据:"); double next = scanner.nextDouble(); if(next >0){ System.out.println("您输入的数据为:"+next); }else { throw new MyExceptionClass("您输入的数据不满足要求!"); } } public static void main(String[] args) { try { method1(); } catch (MyExceptionClass myExceptionClass) { myExceptionClass.printStackTrace(); } }}运行结果:
到此这篇关于非常全面的Java异常处理的文章就介绍到这了,更多相关Java异常处理干货内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Java异常处理与throws关键字用法。分享给大家供大家参考,具体如下:Java异常处理认识异常:1.异常是导致程序中断运行的一种指令流,如果不
导读:在Java中我们使用try-catch进行异常处理,同样的JavaScript也提供了和异常处理类似的异常处理机制,本节我们将对JavaScript异常处
Java异常处理运行时异常(RuntimeException)详解及实例RuntimeExceptionRunntimeException的子类:ClassCa
本文实例分析了Java的异常机制,分享给大家供大家参考。相信有助于大家提高大家Java程序异常处理能力。具体分析如下:众所周知,java中的异常(Excepti
本文实例为大家分享了Java异常处理的具体代码,供大家参考,具体内容如下一.异常的分类1.由Java虚拟机抛出的异常(Error):程序无法处理的问题,用户不用