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
try{ //可能出现异常的代码 }catch(异常类型1 变量名1){ //处理异常的方式1 }catch(异常类型2 变量名2){ //处理异常的方式2 }catch(异常类型3 变量名3){ //处理异常的方式3 } … finally{ //一定会执行的代码 }
说明:
示例一:
@Test public 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异常处理干货内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
统一错误处理 文档:https://eggjs.org/zh-cn/tutorials/restful.html 自定义一个异常基类 // app / exceptions / http_exceptions.js class HttpExceptions extends Error { constructor(msg='服务器异常', code=1, httpCode=400) {
问题内容: 有没有一种方法可以在Java中创建全局异常处理程序。我想这样使用: 处理程序可能无法捕获在主体中引发的异常。 马丁 问题答案: 使用Thread.setDefaultUncaughtExceptionHandler。有关示例,请参见Rod Hilton的“ Global Exception Handling ”博客文章。
Middleware: 全局异常处理 我们在岩浆的实例其实已经注意到了,compose 的连接方式,让我们有能力精确控制异常。 Koa中间件最终行为强依赖注册顺序,比如我们这里要引入的异常处理,必须在业务逻辑中间件前注册,才能捕获后续中间件中未捕获异常,回想一下我们的调度器实现的异常传递流程。 <?php class ExceptionHandler implements Middleware
在做android项目开发时,大家都知道如果程序出错了,会弹出来一个强制退出的弹出框,这个本身没什么问题,但是这个UI实在是太丑了,别说用户接受不了,就连我们自己本身可能都接受不了。虽然我们在发布程序时总会经过仔细的测试,但是难免会碰到预料不到的错误。 今天就来自定义一个程序出错时的处理,类似iphone的闪退。(虽然闪退也是用户不愿意看到的,但是在用户体验上明显比那个原生的弹窗好多了) 废话不多
有没有办法在泽西进行全局异常处理?与其单个资源具有try/catch块,然后调用一些方法来清理所有要发回客户端的异常,我希望有一种方法可以将其放在实际调用资源的地方。这可能吗?如果是这样,怎么做? 相反,where会向Jersey servlet抛出某种Jersey配置的异常: 有: 其中异常将被抛出到我可以拦截并从那里调用的东西。 这实际上只是为了简化所有Jersey资源,并确保返回给客户机的异
问题内容: 有没有办法在Jersey中进行全局异常处理?我希望有一种方法可以将其放置在实际调用资源的地方,而不是单个资源具有try / catch块,然后调用某种方法来清理将要发送回客户端的所有异常。这有可能吗?如果是这样,怎么办? 而是在哪里向Jersey Servlet抛出某种Jersey配置的异常: 具有: 异常会被抛出到我可以拦截并从那里调用的东西。 实际上,这仅仅是为了简化Jersey的