浅谈十个常见的Java异常出现原因

异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题。

1、NullPointerException

空指针异常,操作一个 null 对象的方法或属性时会抛出这个异常。具体看上篇文章:空指针常见案例。

2、OutofOutofMemoryError

内存出现异常的一种异常,这不是程序能控制的,是指要分配的对象的内存超出了当前最大的堆内存,需要调整堆内存大小(-Xmx)以及优化程序。

3、IOException

IO,即:input, output,我们在读写磁盘文件、网络内容的时候经常会生的一种异常,这种异常是受检查异常,需要进行手工捕获。

如文件读写会抛出 IOException:

 public int read() throws IOException
 public void write(int b) throws IOException

4、FileNotFoundException

文件找不到异常,如果文件不存在就会抛出这种异常。

如定义输入输出文件流,文件不存在会报错:

 public FileInputStream(File file) throws FileNotFoundException
 public FileOutputStream(File file) throws FileNotFoundException

FileNotFoundException 其实是 IOException 的子类,同样是受检查异常,需要进行手工捕获。

5、ClassNotFoundException

类找不到异常,Java开发中经常遇到,是不是很绝望?这是在加载类的时候抛出来的,即在类路径下不能加载指定的类。

看一个示例:

public static <T> Class<T> getExistingClass(ClassLoader classLoader, String className) {
 try {
   return (Class<T>) Class.forName(className, true, classLoader);
 }
 catch (ClassNotFoundException e) {
   return null;
 }
}

它是受检查异常,需要进行手工捕获。

6、ClassCastException

类转换异常,将一个不是该类的实例转换成这个类就会抛出这个异常。

如将一个数字强制转换成字符串就会报这个异常:

Object x = new Integer(0);
System.out.println((String)x);

这是运行时异常,不需要手工捕获。

7、NoSuchMethodException

没有这个方法异常,一般发生在反射调用方法的时候,如:

public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException {
  checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
  Method method = getMethod0(name, parameterTypes, true);
  if (method == null) {
    throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
  }
  return method;
}

它是受检查异常,需要进行手工捕获。

8、IndexOutOfBoundsException

索引越界异常,当操作一个字符串或者数组的时候经常遇到的异常。

例:一个ArrayList数组中没有元素,而你想获取第一个元素,运行是就会报此类型的错误。

public class test{
   public static void main(args[] ){
     List<String> list = new ArrayList<>();
     System.out.println(list.get(0));
   }
}  

它是运行时异常,不需要手工捕获。

9、ArithmeticException

算术异常,发生在数字的算术运算时的异常,如一个数字除以 0 就会报这个错。

double n = 3 / 0;

这个异常虽然是运行时异常,可以手工捕获抛出自定义的异常,如:

public static Timestamp from(Instant instant) {
  try {
    Timestamp stamp = new Timestamp(instant.getEpochSecond() * MILLIS_PER_SECOND);
    stamp.nanos = instant.getNano();
    return stamp;
  } catch (ArithmeticException ex) {
    throw new IllegalArgumentException(ex);
  }
}

10、SQLException

SQL异常,发生在操作数据库时的异常。

如下面的获取连接:

public Connection getConnection() throws SQLException {
  if (getUser() == null) {
    return DriverManager.getConnection(url);
  } else {
    return DriverManager.getConnection(url, getUser(), getPassword());
  }
}

又或者是获取下一条记录的时候:

1 boolean next() throws SQLException;

它是受检查异常,需要进行手工捕获。

以上所述是小编给大家介绍的十个常见的Java异常出现原因详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Java的异常类型总结

    Java的设计目的是让程序员有机会设计一个没有错误的应用程序.当应用程序与资源或用户交互时,程序员可能会知道一些异常,这些异常是可以处理的.不幸的是,也有程序员无法控制或简单忽略的例外情况.简而言之,并不是所有的异常都是相同的,因此程序员需要考虑几种类型. 异常是导致程序无法在其预期的执行中运行的事件.异常有三种类型--检查异常.错误和运行时异常. The Checked Exception(检查异常) 已检查异常是Java应用程序应该能够处理的异常.例如,如果应用程序从文件中读取数据,它应该能

  • Java异常处理中的各种细节汇总

    前言 今天我们来讨论一下,程序中的错误处理. 在任何一个稳定的程序中,都会有大量的代码在处理错误,有一些业务错误,我们可以通过主动检查判断来规避,可对于一些不能主动判断的错误,例如 RuntimeException,我们就需要使用 try-catch-finally 语句了. 有人说,错误处理并不难啊,try-catch-finally 一把梭,try 放功能代码,在 catch 中捕获异常.处理异常,finally 中写那些无论是否发生异常,都要执行的代码,这很简单啊. 处理错误的代码,确实并

  • Java中内存区域的划分与异常详解

    前言 JAVA内存区域主要由程序计数器.java 虚拟机栈.本地方法栈.Java堆.方法区以及运行时常量池组成.本文将给大家详细介绍关于Java内存区域的划分与异常的相关内容,下面话不多说了,来一起看看详细的介绍吧. 运行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域. 程序计数器 线程私有.可看作是 当前线程所执行的字节码的行号指示器 ,字节码解释器的工作是通过改变这个计数值来读取下一条要执行的字节码指令. 多线程是通过线程轮流切换并分配处理器执行时间来实现的,任何

  • Java异常处理之try...catch...finally详解

    异常处理机制已经成为判断一门编程语言是否成熟的标准之一,其对代码的健壮性有很大影响.一直以来异常处理使用不是很得心应手,今天对异常进行了较为深入的学习,这篇主要是对try-catch-finally的一个总结. 一.java继承体系 Java语言为异常处理提供了丰富的异常类,这些类之间有严格的继承关系.如图: 从图中我们可以看出,所有的类都是继承于Throwable这个父类,java将所有的非正常情况分为两种:Error(错误)和Exception(异常),Error错误一般是于虚拟机相关的问题

  • Java异常跟踪栈定义与用法示例

    本文实例讲述了Java异常跟踪栈定义与用法.分享给大家供大家参考,具体如下: 一.异常跟踪栈简介 异常对象的printStackTrace方法用于打印异常的跟踪栈信息,根据printStackTrace方法的输出结果,我们可以找到异常的源头,并跟踪到异常一路触发的过程. 二.main方法中异常跟踪栈的应用 1 代码示例 class SelfException extends RuntimeException { SelfException(){} SelfException(String msg

  • Java如何自定义异常打印非堆栈信息详解

    前言 在学习Java的过程中,想必大家都一定学习过异常这个篇章,异常的基本特性和使用这里就不再多讲了.什么是异常?我不知道大家都是怎么去理解的,我的理解很简单,那就是不正常的情况,比如我现在是个男的,但是我却有着女人所独有的东西,在我看来这尼玛肯定是种异常,简直不能忍.想必大家都能够理解看懂,并正确使用. 但是,光学会基本异常处理和使用不够的,在工作中出现异常并不可怕,有时候是需要使用异常来驱动业务的处理,例如: 在使用唯一约束的数据库的时候,如果插入一条重复的数据,那么可以通过捕获唯一约束异常

  • 浅谈十个常见的Java异常出现原因

    异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题. 1.NullPointerException 空指针异常,操作一个 null 对象的方法或属性时会抛出这个异常.具体看上篇文章:空指针常见案例. 2.OutofOutofMemoryError 内存出现异常的一种异常,这不是程序能控制的,是指要分配的对象的内存超出了当前最大的堆内存,需要调整堆内存大小(-Xmx)以及优化程序. 3.IOException I

  • 浅谈Linux系统中的异常堆栈跟踪的简单实现

    在Linux中做C/C++开发经常会遇到一些不可预知的问题导致程序崩溃,同时崩溃后也没留下任何代码运行痕迹,因此,堆栈跟踪技术就显得非要重要了.本文将简单介绍Linux中C/C++程序运行时堆栈获取,首先来看backtrace系列函数--使用范围适合于没有安装GDB或者想要快速理清楚函数调用顺序的情况 ,头文件execinfo.h int backtrace (void **buffer, int size); 该函数用来获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针

  • 浅谈Redis常见延迟问题定位与分析

    目录 使用复杂度高的命令 存储bigkey 集中过期 实例内存达到上限 fork耗时严重 绑定CPU 使用Swap 网卡负载过高 使用复杂度高的命令 如果在使用Redis时,发现访问延迟突然增大,如何进行排查? 首先,第一步,建议你去查看一下Redis的慢日志.Redis提供了慢日志命令的统计功能,我们通过以下设置,就可以查看有哪些命令在执行时延迟比较大. 首先设置Redis的慢日志阈值,只有超过阈值的命令才会被记录,这里的单位是微妙,例如设置慢日志的阈值为5毫秒,同时设置只保留最近1000条慢

  • 浅谈vue在html中出现{{}}的原因及解决方式

    原因: 浏览器渲染机制,解析html结构 -> 加载外部脚本和样式表文件 -> 解析并执行脚本代码 -> 构造html dom模型 -> 加载图片等外部文件 -> 页面加载完毕. 初始化vue的js写在页面底部,也就是最后才执行js脚本. 所以页面从头到尾开始渲染时,渲染到标签时,由于vue还未初始化,所以就会显示类似这样的代码 <h2>{{courseName}}</h2> 当网速很慢的时候就看得比较清楚,可能会让用户误以为bug之类的,快一点的话就

  • 浅谈三分钟学习Java泛型中T、E、K、V、?的含义

    泛型是Java中一个非常重要的内容,对于Java进阶学习是必须要掌握的知识点之所以说这个知识点重要,如果你有过阅读过一些开源框架的代码,那你一定会看到源码中有很多地方使用到了泛型. 随便举两个例子,一个List,一个Map. 看了上面的源码,简单聊一下泛型,也就是回顾一下泛型的相关知识,来源百度百科. [泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法.Java语

  • 浅谈C#中简单的异常引发与处理操作

    异常和异常处理 C# 语言的异常处理功能可帮助您处理程序运行时出现的任何意外或异常情况.异常处理使用 try.catch 和 finally 关键字尝试某些操作,以处理失败情况,尽管这些操作有可能失败,但如果您确定需要这样做,且希望在事后清理资源,就可以尝试这样做.公共语言运行时 (CLR)..NET Framework 或任何第三方库或者应用程序代码都可以生成异常.异常是使用 throw 关键字创建的. 很多情况下,异常可能不是由代码直接调用的方法引发,而是由调用堆栈中位置更靠下的另一个方法所

  • 浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别

    Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo { private static String str =null; public static void main(String[] args) { System.out.println("test exception"); try { if(str.equals("name")){ System.out.println

  • 浅谈java异常链与异常丢失

    1.在java的构造方法中提供了 异常链.. 也就是我们可以通过构造方法不断的将 异常串联成一个异常链... 之所以需要异常连,是因为处于代码的可理解性,以及阅读和程序的可维护性... 我们知道我们每抛出一个异常都需要进行try catch ...那么岂不是代码很臃肿... 我们如果可以将异常串联成一个异常连,然后我们只捕获我们的包装 异常,我们知道 RuntimeException 以及其派生类可以不进行try catch 而被jvm自动捕获并处理.. 当然了我们可以自己定义自己的异常类从Ru

  • 浅谈Java中几种常见的比较器的实现方法

    在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用"=="来完成. 第二个方面:以对象的某一个属性的角度去比较. 从最新的JDK8而言,有三种实现对象比较的方法: 一.覆写Object类的equals()方法: 二.继承Comparable接口,并实现compareTo()方法: 三.定义一个单独的对象比较器,继承自Comparator接口

  • 浅谈java中异步多线程超时导致的服务异常

    在项目中为了提高大并发量时的性能稳定性,经常会使用到线程池来做多线程异步操作,多线程有2种,一种是实现runnable接口,这种没有返回值,一种是实现Callable接口,这种有返回值. 当其中一个线程超时的时候,理论上应该不 影响其他线程的执行结果,但是在项目中出现的问题表明一个线程阻塞,其他线程返回的接口都为空.其实是个很简单的问题,但是由于第一次碰到,还是想了一些时间的.很简单,就是因为阻塞的那个线 程没有释放,并发量一大,线程池数量就满了,所以其他线程都处于等待状态. 附上一段自己写的调

随机推荐