详解Java中的异常和处理

JAVA中异常处理详解 异常(Exception)是程序执行期间发生的事件,它会中断程序的正常指令流。简单来说,异常是一个表示程序出现错误或异常状态的对象。在Java中,异常是一种特殊类型的对象,它从类继承而来。当方法遇到无法处理的情况时,会创建一个异常对象并将其"抛出",然后Java运行时系统会寻找能够"捕获"并处理这个异常的代码。当标准异常类不足以表达特定的错误情况时,可以创建自定义异常类。// 自定义已检查异常super("余额不足,还需 " + amount + " 元");// 使用自定义异常A6。 阅读详情

简介

程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函数返回值作为执行状态?。

Java提供了更加优秀的解决办法:异常处理机制。

异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。

Java中的异常可以是函数中的语句执行时引发的,也可以是程序员通过throw 语句手动抛出的,只要在Java程序中产生了异常,就会用一个对应类型的异常对象来封装异常,JRE就会试图寻找异常处理程序来处理异常。

Throwable类是Java异常类型的顶层父类,一个对象只有是 Throwable 类的(直接或者间接)实例,他才是一个异常对象,才能被异常处理机制识别。JDK中内建了一些常用的异常类,我们也可以自定义异常。

Java异常的分类和类结构图

Java标准裤内建了一些通用的异常,这些类以Throwable为顶层父类。

Throwable又派生出Error类和Exception类。

错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。

异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。

 

总体上我们根据Javac对异常的处理要求,将异常类分为2类。

非检查异常(unckecked exception):Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try...catch...finally)这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。

检查异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try...catch...finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着。如SQLException , IOException,ClassNotFoundException 等。

需要明确的是:检查和非检查是对于javac来说的,这样就很好理解和区分了。

初识异常

下面的代码会演示2个异常类型:ArithmeticException 和 InputMismatchException。前者由于整数除0引发,后者是输入的数据不能被转换为int类型引发。

package com.example; import java. util .Scanner ; public class AllDemo
{ public static void main (String [] args ){
            System . out. println( "----欢迎使用命令行除法计算器----" ) ;
            CMDCalculate ();
      } public static void CMDCalculate (){
            Scanner scan = new Scanner ( System. in ); int num1 = scan .nextInt () ; int num2 = scan .nextInt () ; int result = devide (num1 , num2 ) ;
            System . out. println( "result:" + result) ;
            scan .close () ;
      } public static int devide (int num1, int num2 ){ return num1 / num2 ;
      }
} /*****************************************

----欢迎使用命令行除法计算器----
2
0
Exception in thread "main" java.lang.ArithmeticException : / by zero
     at com.example.AllDemo.devide( AllDemo.java:30 )
     at com.example.AllDemo.CMDCalculate( AllDemo.java:22 )
     at com.example.AllDemo.main( AllDemo.java:12 )

----欢迎使用命令行除法计算器----
1
r
Exception in thread "main" java.util.InputMismatchException
     at java.util.Scanner.throwFor( Scanner.java:864 )
     at java.util.Scanner.next( Scanner.java:1485 )
     at java.util.Scanner.nextInt( Scanner.java:2117 )
     at java.util.Scanner.nextInt( Scanner.java:2076 )
     at com.example.AllDemo.CMDCalculate( AllDemo.java:20 )
     at com.example.AllDemo.main( AllDemo.java:12 )
*****************************************/

异常是在执行某个函数时引发的,而函数又是层级调用,形成调用栈的,因为,只要一个函数发生了异常,那么他的所有的caller都会被异常影响。当这些被影响的函数以异常信息输出时,就形成的了 异常追踪栈 。

异常最先发生的地方,叫做 异常抛出点 。

 

从上面的例子可以看出,当devide函数发生除0异常时,devide函数将抛出ArithmeticException异常,因此调用他的CMDCalculate函数也无法正常完成,因此也发送异常,而CMDCalculate的caller——main 因为CMDCalculate抛出异常,也发生了异常,这样一直向调用栈的栈底回溯。这种行为叫做异常的冒泡,异常的冒泡是为了在当前发生异常的函数或者这个函数的caller中找到最近的异常处理程序。由于这个例子中没有使用任何异常处理机制,因此异常最终由main函数抛给JRE,导致程序终止。

上面的代码不使用异常处理机制,也可以顺利编译,因为2个异常都是非检查异常。但是下面的例子就必须使用异常处理机制,因为异常是检查异常。

代码中我选择使用throws声明异常,让函数的调用者去处理可能发生的异常。但是为什么只throws了IOException呢?因为FileNotFoundException是IOException的子类,在处理范围内。

@Test public void testException() throws IOException
{ //FileInputStream的构造函数会抛出FileNotFoundException
    FileInputStream fileIn = new FileInputStream("E:\\a.txt"); int word; //read方法会抛出IOException
    while((word =  fileIn.read())!=-1) 
    {
        System.out.print((char)word);
    } //close方法会抛出IOException
    fileIn.clos
}

异常处理的基本语法

在编写代码处理异常时,对于检查异常,有2种不同的处理方式:使用try...catch...finally语句块处理它。或者,在函数签名中使用throws 声明交给函数调用者caller去解决。

try...catch...finally语句块

try{ //try块中放可能发生异常的代码。
     //如果执行完try且不发生异常,则接着去执行finally块和finally后面的代码(如果有的话)。
     //如果发生异常,则尝试去匹配catch块。
 }catch(SQLException SQLexception){ //每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。Java7中可以将多个异常声明在一个catch中。 //catch后面的括号定义了异常类型和异常参数。如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常。 //在catch块中可以使用这个块的异常参数来获取异常的相关信息。异常参数是这个catch块中的局部变量,其它块不能访问。 //如果当前try块中发生的异常在后续的所有catch中都没捕获到,则先去执行finally,然后到这个函数的外部caller中去匹配异常处理器。
    //如果try中没有发生异常,则所有的catch块将被忽略。 
}catch(Exception exception){
    //...
}finally{

    //finally块通常是可选的。
 //无论异常是否发生,异常是否匹配被处理,finally都会执行。 //一个try至少要有一个catch块,否则, 至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获异常。 //finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。 
}

需要注意的地方

1、try块中的局部变量和catch块中的局部变量(包括异常变量),以及finally中的局部变量,他们之间不可共享使用。

2、每一个catch块用于处理一个异常。异常匹配是按照catch块的顺序从上往下寻找的,只有第一个匹配的catch会得到执行。匹配时,不仅运行精确匹配,也支持父类匹配,因此,如果同一个try块下的多个catch异常类型有父子关系,应该将子类异常放在前面,父类异常放在后面,这样保证每个catch块都有存在的意义。

3、java中,异常处理的任务就是将执行控制流从异常发生的地方转移到能够处理这种异常的地方去。也就是说:当一个函数的某条语句发生异常时,这条语句的后面的语句不会再执行,它失去了焦点。执行流跳转到最近的匹配的异常处理catch代码块去执行,异常被处理完后,执行流会接着在“处理了这个异常的catch代码块”后面接着执行。

有的编程语言当异常被处理后,控制流会恢复到异常抛出点接着执行,这种策略叫做: resumption model of exception handling (恢复式异常处理模式 )

而Java则是让执行流恢复到处理了异常的catch块后接着执行,这种策略叫做: termination model of exception handling (终结式异常处理模式)

public static void main(String[] args){ try {
            foo();
        }catch(ArithmeticException ae) {
            System.out.println("处理异常");
        }
} public static void foo(){ int a = 5/0;  //异常抛出点
        System.out.println("为什么还不给我涨工资!!!");  //////////////////////不会执行
}

throws 函数声明

throws声明:如果一个方法内部的代码会抛出检查异常(checked exception),而方法自己又没有完全处理掉,则javac保证你必须在方法的签名上使用throws关键字声明这些可能抛出的异常,否则编译不通过。

throws是另一种处理异常的方式,它不同于try...catch...finally,throws仅仅是将函数中可能出现的异常向调用者声明,而自己则不具体处理。

采取这种异常处理的原因可能是:方法本身不知道如何处理这样的异常,或者说让调用者处理更好,调用者需要为可能发生的异常负责。

public void foo() throws ExceptionType1 , ExceptionType2 ,ExceptionTypeN
{ 
     //foo内部可以抛出 ExceptionType1 , ExceptionType2 ,ExceptionTypeN 类的异常,或者他们的子类的异常对象。
}

finally块

finally块不管异常是否发生,只要对应的try执行了,则它一定也执行。只有一种方法让finally块不执行:System.exit()。因此finally块通常用来做资源释放操作:关闭文件,关闭数据库连接等等。

良好的编程习惯是:在try块中打开资源,在finally块中清理释放这些资源。

需要注意的地方:

1、finally块没有处理异常的能力。处理异常的只能是catch块。

2、在同一try...catch...finally块中 ,如果try中抛出异常,且有匹配的catch块,则先执行catch块,再执行finally块。如果没有catch块匹配,则先执行finally,然后去外面的调用者中寻找合适的catch块。

3、在同一try...catch...finally块中 ,try发生异常,且匹配的catch块中处理异常时也抛出异常,那么后面的finally也会执行:首先执行finally块,然后去外围调用者中寻找合适的catch块。

throw 异常抛出语句

throw exceptionObject

程序员也可以通过throw语句手动显式的抛出一个异常。throw语句的后面必须是一个异常对象。

throw 语句必须写在函数中,执行throw 语句的地方就是一个异常抛出点,它和由JRE自动形成的异常抛出点没有任何差别。

public void save(User user){ if(user  == null) throw new IllegalArgumentException("User对象为空"); //......
 }

异常的链化

在一些大型的,模块化的软件开发中,一旦一个地方发生异常,则如骨牌效应一样,将导致一连串的异常。假设B模块完成自己的逻辑需要调用A模块的方法,如果A模块发生异常,则B也将不能完成而发生异常,但是B在抛出异常时,会将A的异常信息掩盖掉,这将使得异常的根源信息丢失。异常的链化可以将多个模块的异常串联起来,使得异常信息不会丢失。

异常链化:以一个异常对象为参数构造新的异常对象。新的异对象将包含先前异常的信息。这项技术主要是异常类的一个带Throwable参数的函数来实现的。这个当做参数的异常,我们叫他根源异常(cause)。

查看Throwable类源码,可以发现里面有一个Throwable字段cause,就是它保存了构造时传递的根源异常参数。这种设计和链表的结点类设计如出一辙,因此形成链也是自然的了。

public class Throwable implements Serializable { private Throwable cause = this; public Throwable(String message, Throwable cause){
        fillInStackTrace();
        detailMessage = message; this.cause = cause;
    } public Throwable(Throwable cause){
        fillInStackTrace();
        detailMessage = (cause==null ? null : cause.toString()); this.cause = cause;
    } //........
}

下面是一个例子,演示了异常的链化:从命令行输入2个int,将他们相加,输出。输入的数不是int,则导致getInputNumbers异常,从而导致add函数异常,则可以在add函数中抛出

一个链化的异常。

public static void main(String[] args){

    System.out.println("请输入2个加数"); int result; try {
        result = add();
        System.out.println("结果:"+result);
    } catch (Exception e){
        e.printStackTrace();
    }
} //获取输入的2个整数返回
private static List<Integer> getInputNumbers(){
    List<Integer> nums = new ArrayList<>();
    Scanner scan = new Scanner(System.in); try { int num1 = scan.nextInt(); int num2 = scan.nextInt();
        nums.add(new Integer(num1));
        nums.add(new Integer(num2));
    }catch(InputMismatchException immExp){ throw immExp;
    }finally {
        scan.close();
    } return nums;
} //执行加法计算
private static int add() throws Exception
{ int result; try {
        List<Integer> nums =getInputNumbers();
        result = nums.get(0)  + nums.get(1);
    }catch(InputMismatchException immExp){ throw new Exception("计算失败",immExp);  /////////////////////////////链化:以一个异常对象为参数构造新的异常对象。
 } return result;
}

/*
请输入2个加数
r 1
java.lang.Exception: 计算失败
    at practise.ExceptionTest.add(ExceptionTest.java:53)
    at practise.ExceptionTest.main(ExceptionTest.java:18)
Caused by: java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at practise.ExceptionTest.getInputNumbers(ExceptionTest.java:30)
    at practise.ExceptionTest.add(ExceptionTest.java:48)
    ... 1 more

*/

自定义异常

如果要自定义异常类,则扩展Exception类即可,因此这样的自定义异常都属于检查异常(checked exception)。如果要自定义非检查异常,则扩展自RuntimeException。

按照国际惯例,自定义的异常应该总是包含如下的构造函数:

  • 一个无参构造函数
  • 一个带有String参数的构造函数,并传递给父类的构造函数。
  • 一个带有String参数和Throwable参数,并都传递给父类构造函数
  • 一个带有Throwable 参数的构造函数,并传递给父类的构造函数。

下面是IOException类的完整源代码,可以借鉴。

public class IOException extends Exception
{ static final long serialVersionUID = 7818375828146090155L; public IOException(){ super();
    } public IOException(String message){ super(message);
    } public IOException(String message, Throwable cause){ super(message, cause);
    } public IOException(Throwable cause){ super(cause);
    }
}

异常的注意事项

1、当子类重写父类的带有 throws声明的函数时,其throws声明的异常必须在父类异常的可控范围内——用于处理父类的throws方法的异常处理器,必须也适用于子类的这个带throws方法 。这是为了支持多态。

例如,父类方法throws 的是2个异常,子类就不能throws 3个及以上的异常。父类throws IOException,子类就必须throws IOException或者IOException的子类。

至于为什么?我想,也许下面的例子可以说明。

2、Java程序可以是多线程的。每一个线程都是一个独立的执行流,独立的函数调用栈。如果程序只有一个线程,那么没有被任何代码处理的异常 会导致程序终止。如果是多线程的,那么没有被任何代码处理的异常仅仅会导致异常所在的线程结束。

也就是说,Java中的异常是线程独立的,线程的问题应该由线程自己来解决,而不要委托到外部,也不会直接影响到其它线程的执行。

finally块和return

首先一个不容易理解的事实:在 try块中即便有return,break,continue等改变执行流的语句,finally也会执行。

public static void main(String[] args){
    int re = bar();
    System.out.println(re);
}
private static int bar(){
    try{
        return 5;
    } finally{
        System.out.println("finally");
    }
}
/*输出:
finally
5
*/

很多人面对这个问题时,总是在归纳执行的顺序和规律,不过我觉得还是很难理解。我自己总结了一个方法。用如下GIF图说明。

也就是说:try...catch...finally中的return 只要能执行,就都执行了,他们共同向同一个内存地址(假设地址是0x80)写入返回值,后执行的将覆盖先执行的数据,而真正被调用者取的返回值就是最后一次写入的。那么,按照这个思想,下面的这个例子也就不难理解了。

finally中的return 会覆盖 try 或者catch中的返回值。

public static void main(String[] args){ int result;

        result = foo();
        System.out.println(result); /////////2
 result = bar();
        System.out.println(result); /////////2
 }

    @SuppressWarnings("finally") public static int foo(){
        trz{ int a = 5 / 0;
        } catch (Exception e){ return 1;
        } finally{ return 2;
        }

    }

    @SuppressWarnings("finally") public static int bar(){ try { return 1;
        }finally { return 2;
        }
    }

finally中的return会抑制(消灭)前面try或者catch块中的异常

class TestException
{ public static void main(String[] args){ int result; try{
            result = foo();
            System.out.println(result); //输出100
        } catch (Exception e){
            System.out.println(e.getMessage()); //没有捕获到异常
 } try{
            result = bar();
            System.out.println(result); //输出100
        } catch (Exception e){
            System.out.println(e.getMessage()); //没有捕获到异常
 }
    } //catch中的异常被抑制
    @SuppressWarnings("finally") public static int foo() throws Exception
    { try { int a = 5/0; return 1;
        }catch(ArithmeticException amExp) { throw new Exception("我将被忽略,因为下面的finally中使用了return");
        }finally { return 100;
        }
    } //try中的异常被抑制
    @SuppressWarnings("finally") public static int bar() throws Exception
    { try { int a = 5/0; return 1;
        }finally { return 100;
        }
    }
}

finally中的异常会覆盖(消灭)前面try或者catch中的异常

class TestException
{ public static void main(String[] args){ int result; try{
            result = foo();
        } catch (Exception e){
            System.out.println(e.getMessage()); //输出:我是finaly中的Exception
 } try{
            result = bar();
        } catch (Exception e){
            System.out.println(e.getMessage()); //输出:我是finaly中的Exception
 }
    } //catch中的异常被抑制
    @SuppressWarnings("finally") public static int foo() throws Exception
    { try { int a = 5/0; return 1;
        }catch(ArithmeticException amExp) { throw new Exception("我将被忽略,因为下面的finally中抛出了新的异常");
        }finally { throw new Exception("我是finaly中的Exception");
        }
    } //try中的异常被抑制
    @SuppressWarnings("finally") public static int bar() throws Exception
    { try { int a = 5/0; return 1;
        }finally { throw new Exception("我是finaly中的Exception");
        }

    }
}

上面的3个例子都异于常人的编码思维,因此我建议:

  • 不要在fianlly中使用return。
  • 不要在finally中抛出异常。
  • 减轻finally的任务,不要在finally中做一些其它的事情,finally块仅仅用来释放资源是最合适的。
  • 将尽量将所有的return写在函数的最后面,而不是try ... catch ... finally中。
JAVA环境变量设置 JAVA环境变量设置 介绍如何配置java环境变量,以及如何测试变量配置成功 立即下载

相关推荐

java环境变量设置

java环境变量设置亲测可用,适用于win10系统,自己根据百度摸索的,配置并成功实现命令行javac,java命令可以正确应用

java基础---异常详解

原文地址:http://www.cnblogs.com/lulipro/p/7504267.html 1、简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。 异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。 Java中的异常可以是函数中的语句执行时引发的,也可以...

yangchuanan的博客 232

PMOS缓启动电路设计实战:用LTspice优化上电时序,把60A冲击降到15A

本文通过一个实战案例,深入解析了PMOS缓启动电路如何有效抑制上电冲击电流。文章指出,低ESR电容是导致冲击电流飙升的元凶,并详细阐述了利用LTspice仿真工具,通过优化栅极电阻和栅源电容等参数,将高达60A的冲击电流成功降至15A的设计与优化过程,为电源开关电路设计提供了可复用的方法论。

onion的博客 896

Java命令参数说明大全

[url]http://hi.baidu.com/anlylove/blog/item/b4a0cc1fa9779cffe0fe0bd3.html[/url] 序言: Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOME"bin"java –option 来启动,-option为虚拟机参数,JAVA_HOME为JDK安装路径,通...

myharmony的专栏 1085

别光看文档了!手把手带你用Habitat-Lab跑通第一个PointNav任务(附完整代码与避坑指南)

本文详细介绍了如何使用Habitat-Lab快速跑通第一个PointNav任务,包括环境配置、依赖安装、数据集下载与路径配置等关键步骤,并提供了完整的代码实现与常见问题排查指南。特别适合刚接触Habitat-Lab的开发者,帮助避开官方Quickstart未提及的坑,快速上手具身AI任务。

weixin_42662293的博客 271

MySQL等保三级合规实践:如何安全配置root账户的本地与受信主机登录策略

本文详细介绍了MySQL在等保三级合规框架下如何安全配置root账户的本地与受信主机登录策略。通过分析root账户的特殊保护需求,提供三种安全加固方案,包括限制访问范围、限定登录IP和完全禁止远程登录,并指导创建安全的远程管理账户。文章还涵盖了密码策略强化、日志审计配置和网络层防护等关键合规要求,帮助用户实现MySQL的等保三级全面合规。

weixin_42522964的博客 259

JAVA环境变量的配置

首先右键点击【此电脑】,找到【属性】单击左键点进去找到【高级系统设置】,最下面有一个【环境变量】,单击进去看【系统变量】找到【Path】一行后点击编辑,这时会弹出一个文本框,紧接着我们需要在文本框中输入即将添加的%JAVA-HOME\bin,添加好后点击确认,这样我们就完成了Path的环境变量配置,完成后我们可以检验环境变量是否配置成功。环境变量中最重要的是Path,该变量是告诉操作系统可执行文件的搜索路径,它的作用就是在我们没有这个应用的路径下打开我们需要的应用,接下来我们详细说明下Path的配置流程。

2301_79532293的博客 4588

GNSS数据处理(一)——开源软件RTKLIB与G-Nut/Anubis实战入门

本文详细介绍了GNSS数据处理的开源软件RTKLIB与G-Nut/Anubis的实战入门指南。从软件安装、数据获取到静态短基线解算,逐步讲解操作技巧与常见问题排查,帮助测绘与地质监测人员快速掌握GNSS数据处理技术,提升工作效率。

weixin_30733003的博客 133

Java环境变量的配置

简介:环境变量是为了让操作系统识别某一个程序而进行的配置在Java的运行环境中需要配置三个环境变量:JAVA_HOME、PATH、CLASSPATH这三个环境变量各有不同的作用:JAVA_HOME : 配置 JDK 的安装路径,主要是为了后期学习的Java程序提供服务,例如tomcat, maven等。PATH : 配置 Java的 常见命令所在的路径, 目的是为了在命令提示符下可以找到对应的命令。CLASSPATH : 配置 Java的类路径(字节码文件),为了执行Java程序的时候找到字节码文件。...

weixin_52953038的博客 1万+

FPGA中Verilog HDL/VHDL实现NCO(数字控制振荡器)的查表法优化与性能分析

本文深入探讨了在FPGA中使用Verilog HDL/VHDL实现数字控制振荡器(NCO)的查表法优化与性能分析。文章详细解析了NCO的核心工作原理,包括相位累加器、查找表(ROM)的设计,并重点介绍了利用波形对称性压缩ROM、相位抖动注入等关键优化技巧,以提升无杂散动态范围(SFDR)并平衡速度、精度与资源消耗。

vscode6remote的博客 455

智能车图像处理2-入门级分析1 ---基础扫线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 7747

Java开发环境变量配置

一、环境准备   Windows10专业版、jdk-8u144-windows-x64、apache-tomcat-7.0.54-windows-x64、apache-maven-3.5.0-bin、node-v10.16.0-x64.msi 二、下载并安装JDK 选择一个适合自己的JDK版本下载并安装即可,具体流程不详述。 2.1、JDK环境变量配置 1、右键桌面上“我的电脑”&g......

WLong1027的博客 2581

【经验&技巧】如何在ADS中导入示波器的时域波形?

从示波器中导出的时域波形数据,需要按照固定的格式进行修改,并通过Display dataset对话框导入ADS。

一只豌豆象的博客 1572

java的异常和处理详解

java的异常和处理详解 异常,用大白话讲,就是在程序运行期间发生的不正常情况。大家都知道java语言最大的特点就是面向对象的思想,它会把一个事物用类的形式去封装,所以异常也不例外。java就是通过这种思想将问题封装成了对象。在java中,描述这些不正常情况的类就称为异常类。 一、异常分类 话不多说,先看一张图吧 从图上,可以看到异常中的父类就是Throwable类,该类就是将所有的问题的共性向上抽取,而形成的一个异常体系。该体系最大的特点就是Throwable及其子类都具有可抛性。 注意:无论是Error

Recruit_vay的博客 303

Docker(八):Docker Compose(容器编排) 管理多容器应用—实战案例演示

🟢 Docker(八):Docker Compose(容器编排) 管理多容器应用—实战案例演示

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 6万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java异常处理机制你真的会了吗?完全详解来了

一、什么是异常? 实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个板块,用户输入不一定符合你的要求;你的程序要打开某个文件,这个文件不存在或者文件格式不对;你要读取数据库的数据,数据可能是空的;程序在运行,内存或硬盘可能满了等等。 二、异常和错误有什么区别? Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。 三、异常有什么用? 可以.

筱寒小记 1293

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java异常处理详解

在Java开发中,异常处理是一项至关重要的任务。合理处理异常能够增强程序的稳定性和可靠性,提高用户体验。本文将带领读者深入了解Java异常处理的方方面面,为您提供全面的指导和实践经验。异常处理是Java程序设计中的一个重要话题,合理处理异常是每个Java开发人员都应该掌握的基本技能。通过本文的学习,相信读者已经对Java异常处理有了更加深入的了解,并能够在实际项目中编写健壮的Java应用程序。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 5390

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java的异常处理机制详解

Java异常的处理主要依赖于try,catch,finally,throws,throw这五个关键字。下面分别介绍它们:

jingwen的博客 1万+

java 异常_Java 中的异常和处理详解

一, 什么是java里的异常由于java是c\c++ 发展而来的, 首先我们先看看c语言里的错误.1.1 c语言里的错误我们实现1个程序的过程包括, 代码编写, 编译代码成为程序, 执行程序..其中大部分常见的语法错误都会被编译代码这样部过滤掉. 但是即使通过了编译. 执行程序这一步可能还是会有错误.原因很多, 例如常见的除数为0, 内存溢出(数组的index超出界限), 或者内存...

weixin_36204626的博客 1487

【Java】异常处理详解

本文详细介绍了Java异常处理机制,内容包括异常概述、分类、处理方式及最佳实践。异常分为Error(不可恢复的系统级错误)和Exception(可处理的程序异常),其中Exception又分为受检异常(必须处理,如IO操作)和非受检异常(编程错误,应修复代码)。文章重点讲解了try-catch-finally结构、多重catch块、自定义异常创建及异常链的使用方法,并提供了异常处理的最佳实践建议,帮助开发者编写更健壮的Java程序。

小昭的博客 1135

Java中的异常和处理详解及总结

Java中的异常 首先,在下图先看看异常之间的关系 异常的概念 什么是(现实生活中的)异常? 在回家的路上,见到老太太摔倒,扶了老太太. 什么是Java中的异常 代码正常运行不会出问题,但是遇到意外,参数变量,不符合要求,发生意外,代码终止运行 代码中的异常处理好了,代码就可以顺利的继续运行! 初学者一般见到的几个异常 异常后面的代码执行布了,只有解决好异常后,才能执行下次 例如: ...

Gzycode的博客 413

Java 异常处理机制详解

在 Java 编程中,异常处理是一个至关重要的概念。它帮助我们处理程序执行过程中可能出现的错误或异常情况,从而提高程序的可靠性和稳定性。本文将详细介绍 Java 异常处理机制,包括异常的定义、分类、处理方式以及一些最佳实践。

专注Java和MySQL领域知识分享 1989

Java 异常处理详解

Java 异常处理机制是 Java 编程中至关重要的一部分。一个好的 Java 程序应该能够正确地处理异常,避免异常泄露到用户界面,保证程序的健壮性和稳定性。在 Java 开发过程中,需要充分认识和了解异常处理的相关知识和技巧,并且在编写代码时合理地使用异常处理机制。

兴趣是最好的老师,勤能补拙 3215

Java 异常处理 详解

Java异常体系结构提供了丰富的工具来处理程序执行中的各种错误情境。通过理解异常的分类和处理机制,遵循标准化的处理规则,并运用适当的技巧,可以编写更加健壮、可维护的代码。特别需要注意的是,合理使用异常处理,不仅仅是为了捕获错误,更重要的是确保程序在异常情境下的正确性、可控性和用户体验。

goTsHgo的博客 1491
上一篇: 【JavaWeb】JDBC实战
下一篇: 惊呆面试官的回答:HashMap和TreeMap的区别
java小姜在线冲
博客等级 码龄4年 53粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值