精华内容
下载资源
问答
  • 主要介绍了Java异常退出条件的判断示例代码,涉及常见异常退出条件等相关内容,具有一定参考价值,需要的朋友可以了解下。
  • Java 进程异常退出问题排查现象收到报警邮件,提示 tn_25 上的服务不可用了。登录到 tn_25 服务器,发现 Java 进程已经不在了。追查在 /var/log/messages 文件中找到了以下信息:Sep 28 14:09:38 localhost kernel: ...

    Java 进程异常退出问题排查

    现象

    收到报警邮件,提示 tn_25 上的服务不可用了。登录到 tn_25 服务器,发现 Java 进程已经不在了。

    追查

    在 /var/log/messages 文件中找到了以下信息:

    Sep 28 14:09:38 localhost kernel: Out of memory: Kill process 133003 (java) score 232 or sacrifice child

    Sep 28 14:09:38 localhost kernel: Killed process 133003 (java) total-vm:37324000kB, anon-rss:22862892kB, file-rss:0kB, shmem-rss:0kB

    Sep 28 14:09:40 localhost systemd: tomcat@procurement.service: main process exited, code=killed, status=9/KILL

    procurement 正是我们的服务。以上信息说明,我们的 Java 服务由于内存不足,被 linux 系统给 kill 掉了。

    内存占用情况

    服务启动前内存占用情况:

    [root@tn_25 ~]# free -g

    total used free shared buff/cache available

    Mem: 62 39 19 2 3 19

    Swap: 31 31 0

    服务启动后的内存占用情况:

    free -g

    total used free shared buff/cache available

    Mem: 62 52 6 2 3 6

    Swap: 31 31 0

    swap 已经被用完,说明本机的内存严重不足。需要查看本机都有哪些服务占用内存,进行规划。

    技术交流

    42e1274b8af00aa6b98a5ce9d1810905.gif

    展开全文
  • Java异常退出条件的判断示例代码发布于 2020-4-28|复制链接摘记: 无论是功能性代码还是算法性代码,程序都是一系列流程的合集既然是流程就分为:一般流程和异常流程;一般流程保证了基本功能;异常流程则是对程序...

    Java异常退出条件的判断示例代码

    发布于 2020-4-28|

    复制链接

    摘记: 无论是功能性代码还是算法性代码,程序都是一系列流程的合集

    既然是流程就分为:一般流程和异常流程;

    一般流程保证了基本功能;

    异常流程则是对程序稳定性的保证,不能因为一些非法输入,项目就挂了;

    注意,布尔表达式的先后顺序,有时不可以交换

    ```java

    i ..

    无论是功能性代码还是算法性代码,程序都是一系列流程的合集 既然是流程就分为:一般流程和异常流程;

    一般流程保证了基本功能;

    异常流程则是对程序稳定性的保证,不能因为一些非法输入,项目就挂了;

    注意,布尔表达式的先后顺序,有时不可以交换

    ```java

    if (null == instance || instance.isEmpty())

    ```

    0. 常见异常退出条件

    参数为空;

    表示长度,表示索引的整型为负数,或者超出待索引数组或容器的范围;

    1. String 的 startsWith 函数

    首先来看 String 类为 startsWith 函数提供的对外接口,有如下形式的俩中函数重载:

    ```java

    public Boolean startsWith(String prefix, int toffset);

    public Boolean startsWith(String prefix) {

    starsWith(prefix, 0);

    // 调用的是双参的实现

    }

    ```

    传递进来的参数的含义分别为,prefix:待匹配的字符串,toffset 当前字符串开始比较时的偏移,对于参数应当满足:

    toffset >= 0;

    this.value.length >= prefix.length + toffset

    也就是:

    ```java

    char[] ta = value;

    int pc = prefix.length;

    if ((toffset value.length-pc))

    {

    // 负数形式的偏移,

    // 偏移加前缀的长度大于此字符串的长度;

    return false;

    }

    ```

    完整源码如下:

    ```java

    public Boolean startsWith(String prefix, int toffset) {

    char ta[] = value;

    int to = toffset;

    char pa[] = prefix.value;

    int po = 0;

    int pc = prefix.value.length;

    // Note: toffset might be near -1>>>1.

    if ((toffset value.length - pc)) {

    return false;

    }

    while (--pc >= 0) {

    if (ta[to++] != pa[po++]) {

    return false;

    }

    }

    return true;

    }

    ```

    展开全文
  • 无论是功能性代码还是算法性代码,程序都是一系列流程的合集既然是流程就分为:一般流程和异常流程;... 常见异常退出条件参数为空;表示长度,表示索引的整型为负数,或者超出待索引数组或容器...

    无论是功能性代码还是算法性代码,程序都是一系列流程的合集

    既然是流程就分为:一般流程和异常流程;

    一般流程保证了基本功能;

    异常流程则是对程序稳定性的保证,不能因为一些非法输入,项目就挂了;

    注意,布尔表达式的先后顺序,有时不可以交换

    if (null == instance || instance.isEmpty())

    0. 常见异常退出条件

    参数为空;

    表示长度,表示索引的整型为负数,或者超出待索引数组或容器的范围;

    1. String 的 startsWith 函数

    首先来看 String 类为 startsWith 函数提供的对外接口,有如下形式的俩中函数重载:

    public Boolean startsWith(String prefix, int toffset);

    public Boolean startsWith(String prefix) {

    starsWith(prefix, 0);

    // 调用的是双参的实现

    }

    传递进来的参数的含义分别为,prefix:待匹配的字符串,toffset 当前字符串开始比较时的偏移,对于参数应当满足:

    toffset >= 0;

    this.value.length >= prefix.length + toffset

    也就是:

    char[] ta = value;

    int pc = prefix.length;

    if ((toffset < 0) || (toffset > value.length-pc))

    {

    // 负数形式的偏移,

    // 偏移加前缀的长度大于此字符串的长度;

    return false;

    }

    完整源码如下:

    public Boolean startsWith(String prefix, int toffset) {

    char ta[] = value;

    int to = toffset;

    char pa[] = prefix.value;

    int po = 0;

    int pc = prefix.value.length;

    // Note: toffset might be near -1>>>1.

    if ((toffset < 0) || (toffset > value.length - pc)) {

    return false;

    }

    while (--pc >= 0) {

    if (ta[to++] != pa[po++]) {

    return false;

    }

    }

    return true;

    }

    总结

    以上就是本文关于Java异常退出条件的判断示例代码的全部内容,洗完对大家有所帮助。感兴趣的朋友可以继续参阅本站:Java编程异常处理最佳实践【推荐】、Java编程中的检查型异常与非检查型异常分析等,有什么问题可以随时留言,小编会及时回复大家的。

    展开全文
  • Java异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮、易于调试。异常之所以是一种强大的调试手段,在于其回答了以下三个问题:什么出了错?在哪出的错?为什么出错?在有效使用异常...

    Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮、易于调试。

    异常之所以是一种强大的调试手段,在于其回答了以下三个问题:什么出了错?

    在哪出的错?

    为什么出错?

    在有效使用异常的情况下,异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出,如果你的异常没有回答以上全部问题,那么可能你没有很好地使用它们。

    有三个原则可以帮助你在调试过程中最大限度地使用好异常,这三个原则是:具体明确

    提早抛出

    延迟捕获

    为了阐述有效异常处理的这三个原则,本文通过杜撰个人财务管理器类JCheckbook进行讨论,JCheckbook用于记录及追踪诸如存取款,票据开具之类的银行账户活动。

    具体明确

    Java定义了一个异常类的层次结构,其以Throwable开始,扩展出Error和Exception,而Exception又扩展出RuntimeException.如图1所示.

    418b85d2c087b299f6290f4b745468e9.png

    图1.Java异常层次结构

    这四个类是泛化的,并不提供多少出错信息,虽然实例化这几个类是语法上合法的(如:newThrowable()),但是最好还是把它们当虚基类看,使用它们更加特化的子类。Java已经提供了大量异常子类,如需更加具体,你也可以定义自己的异常类。

    例如:java.iopackage包中定义了Exception类的子类IOException,更加特化确的是FileNotFoundException,EOFException和ObjectStreamException这些IOException的子类。

    捕获异常时尽量明确也很重要。

    例如:JCheckbook可以通过重新询问用户文件名来处理FileNotFoundException,对于EOFException,它可以根据异常抛出前读取的信息继续运行。

    如果抛出的是ObjectStreamException,则程序应该提示用户文件已损坏,应当使用备份文件或者其他文件。

    Java让明确捕获异常变得容易,因为我们可以对同一try块定义多个catch块,从而对每种异常分别进行恰当的处理。FileprefsFile=newFile(prefsFilename);

    try{

    readPreferences(prefsFile);

    }

    catch(FileNotFoundExceptione){

    //alerttheuserthatthespecifiedfile

    //doesnotexist

    }

    catch(EOFExceptione){

    //alerttheuserthattheendofthefile

    //wasreached

    }

    catch(ObjectStreamExceptione){

    //alerttheuserthatthefileiscorrupted

    }

    catch(IOExceptione){

    //alerttheuserthatsomeotherI/O

    //erroroccurred

    }

    JCheckbook通过使用多个catch块来给用户提供捕获到异常的明确信息。

    举例来说:如果捕获了FileNotFoundException,它可以提示用户指定另一个文件,某些情况下多个catch块带来的额外编码工作量可能是非必要的负担,但在这个例子中,额外的代码的确帮助程序提供了对用户更友好的响应。

    除前三个catch块处理的异常之外,最后一个catch块在IOException抛出时给用户提供了更泛化的错误信息.这样一来,程序就可以尽可能提供具体的信息,但也有能力处理未预料到的其他异常。

    有时开发人员会捕获范化异常,并显示异常类名称或者打印堆栈信息以求"具体"。

    千万别这么干!

    用户看到java.io.EOFException或者堆栈信息只会头疼而不是获得帮助。应当捕获具体的异常并且用"人话"给用户提示确切的信息。不过,异常堆栈倒是可以在你的日志文件里打印。记住,异常和堆栈信息是用来帮助开发人员而不是用户的。

    最后,应该注意到JCheckbook并没有在readPreferences()中捕获异常,而是将捕获和处理异常留到用户界面层来做,这样就能用对话框或其他方式来通知用户。这被称为"延迟捕获",下文就会谈到。

    提早抛出

    异常堆栈信息提供了导致异常出现的方法调用链的精确顺序,包括每个方法调用的类名,方法名,代码文件名甚至行数,以此来精确定位异常出现的现场。java.lang.NullPointerException

    atjava.io.FileInputStream.open(NativeMethod)

    atjava.io.FileInputStream.(FileInputStream.java:103)

    atjcheckbook.JCheckbook.readPreferences(JCheckbook.java:225)

    atjcheckbook.JCheckbook.startup(JCheckbook.java:116)

    atjcheckbook.JCheckbook.(JCheckbook.java:27)

    atjcheckbook.JCheckbook.main(JCheckbook.java:318)

    以上展示了FileInputStream类的open()方法抛出NullPointerException的情况。

    不过注意FileInputStream.close()是标准Java类库的一部分,很可能导致这个异常的问题原因在于我们的代码本身而不是JavaAPI。所以问题很可能出现在前面的其中一个方法,幸好它也在堆栈信息中打印出来了。

    不幸的是,NullPointerException是Java中信息量最少的(却也是最常遭遇且让人崩溃的)异常。它压根不提我们最关心的事情:到底哪里是null。所以我们不得不回退几步去找哪里出了错。

    通过逐步回退跟踪堆栈信息并检查代码,我们可以确定错误原因是向readPreferences()传入了一个空文件名参数。既然readPreferences()知道它不能处理空文件名,所以马上检查该条件:publicvoidreadPreferences(Stringfilename)

    throwsIllegalArgumentException{

    if(filename==null){

    thrownewIllegalArgumentException("filenameisnull");

    }//if

    //...performotheroperations...

    InputStreamin=newFileInputStream(filename);

    //...readthepreferencesfile...

    }

    通过提早抛出异常(又称"迅速失败"),异常得以清晰又准确。

    堆栈信息立即反映出什么出了错(提供了非法参数值),为什么出错(文件名不能为空值),以及哪里出的错(readPreferences()的前部分)。这样我们的堆栈信息就能如实提供:java.lang.IllegalArgumentException:filenameisnull

    atjcheckbook.JCheckbook.readPreferences(JCheckbook.java:207)

    atjcheckbook.JCheckbook.startup(JCheckbook.java:116)

    atjcheckbook.JCheckbook.(JCheckbook.java:27)

    atjcheckbook.JCheckbook.main(JCheckbook.java:318)

    另外,其中包含的异常信息("文件名为空")通过明确回答什么为空这一问题使得异常提供的信息更加丰富,而这一答案是我们之前代码中抛出的NullPointerException所无法提供的。

    通过在检测到错误时立刻抛出异常来实现迅速失败,可以有效避免不必要的对象构造或资源占用,比如文件或网络连接。同样,打开这些资源所带来的清理操作也可以省却。

    延迟捕获

    菜鸟和高手都可能犯的一个错是,在程序有能力处理异常之前就捕获它。Java编译器通过要求检查出的异常必须被捕获或抛出而间接助长了这种行为。自然而然的做法就是立即将代码用try块包装起来,并使用catch捕获异常,以免编译器报错。

    问题在于,捕获之后该拿异常怎么办?最不该做的就是什么都不做。

    空的catch块等于把整个异常丢进黑洞,能够说明何时何处为何出错的所有信息都会永远丢失。把异常写到日志中还稍微好点,至少还有记录可查。

    但我们总不能指望用户去阅读或者理解日志文件和异常信息。

    让readPreferences()显示错误信息对话框也不合适,因为虽然JCheckbook目前是桌面应用程序,但我们还计划将它变成基于HTML的Web应用。那样的话,显示错误对话框显然不是个选择。

    同时,不管HTML还是C/S版本,配置信息都是在服务器上读取的,而错误信息需要显示给Web浏览器或者客户端程序。readPreferences()应当在设计时将这些未来需求也考虑在内。适当分离用户界面代码和程序逻辑可以提高我们代码的可重用性。

    在有条件处理异常之前过早捕获它,通常会导致更严重的错误和其他异常。

    例如,如果上文的readPreferences()方法在调用FileInputStream构造方法时立即捕获和记录可能抛出的FileNotFoundException,代码会变成下面这样:publicvoidreadPreferences(Stringfilename){

    //...

    InputStreamin=null;

    //DONOTDOTHIS!!!

    try{

    in=newFileInputStream(filename);

    }

    catch(FileNotFoundExceptione){

    logger.log(e);

    }

    in.read(...);

    //...}

    上面的代码在完全没有能力从FileNotFoundException中恢复过来的情况下就捕获了它。如果文件无法找到,下面的方法显然无法读取它。

    如果readPreferences()被要求读取不存在的文件时会发生什么情况?当然,FileNotFoundException会被记录下来,如果我们当时去看日志文件的话,就会知道。

    然而当程序尝试从文件中读取数据时会发生什么?既然文件不存在,变量in就是空的,一个NullPointerException就会被抛出。

    调试程序时,本能告诉我们要看日志最后面的信息。那将会是NullPointerException,非常让人讨厌的是这个异常非常不具体。错误信息不仅误导我们什么出了错(真正的错误是FileNotFoundException而不是NullPointerException),还误导了错误的出处。

    真正的问题出在抛出NullPointerException处的数行之外,这之间有可能存在好几次方法的调用和类的销毁。我们的注意力被这条小鱼从真正的错误处吸引了过来,一直到我们往回看日志才能发现问题的源头。

    既然readPreferences()真正应该做的事情不是捕获这些异常,那应该是什么?看起来有点有悖常理,通常最合适的做法其实是什么都不做,不要马上捕获异常。

    把责任交给readPreferences()的调用者,让它来研究处理配置文件缺失的恰当方法,它有可能会提示用户指定其他文件,或者使用默认值,实在不行的话也许警告用户并退出程序。

    把异常处理的责任往调用链的上游传递的办法,就是在方法的throws子句声明异常。在声明可能抛出的异常时,注意越具体越好。这用于标识出调用你方法的程序需要知晓并且准备处理的异常类型。例如,“延迟捕获”版本的readPreferences()可能是这样的:publicvoidreadPreferences(Stringfilename)

    throwsIllegalArgumentException,

    FileNotFoundException,IOException{

    if(filename==null){

    thrownewIllegalArgumentException("filenameisnull");

    }//if

    //...

    InputStreamin=newFileInputStream(filename);

    //...

    }

    技术上来说,我们唯一需要声明的异常是IOException,但我们明确声明了方法可能抛出FileNotFoundException。IllegalArgumentException不是必须声明的,因为它是非检查性异常(即RuntimeException的子类)。然而声明它是为了文档化我们的代码(这些异常也应该在方法的JavaDocs中标注出来)。

    当然,最终你的程序需要捕获异常,否则会意外终止。

    但这里的技巧是在合适的层面捕获异常,以便你的程序要么可以从异常中有意义地恢复并继续下去,而不导致更深入的错误;要么能够为用户提供明确的信息,包括引导他们从错误中恢复过来。如果你的方法无法胜任,那么就不要处理异常,把它留到后面捕获和在恰当的层面处理。

    结论

    经验丰富的开发人员都知道,调试程序的最大难点不在于修复缺陷,而在于从海量的代码中找出缺陷的藏身之处。只要遵循本文的三个原则,就能让你的异常协助你跟踪和消灭缺陷,使你的程序更加健壮,对用户更加友好。

    展开全文
  • 无论是功能性代码还是算法性代码,程序都是一系列流程的合集既然是流程就分为:一般流程和异常流程;... 常见异常退出条件参数为空;表示长度,表示索引的整型为负数,或者超出待索引数组或容器...
  • LogCat告诉我threadid=11 thread eixiting with uncaught exception (group=0x4134d2a0)但是没有“引起”通常会发生什么,所以我实际上可以捕获异常.当它崩溃(随机)时会被写入我的控制台[201...
  • 这就需要错误源能够通过某种方式,把适当的信息传递给某个接收者,该接收者将知道如何正确的处理这个问题,这就是Java的错误报告机制 —— 异常机制。该机制使得程序把在正常执行过程中做什么事的代码与出了问题怎.....
  • 错误为: # # An unexpected error has been detected by Java Runtime Environment: # # SIGSEGV (0xb) at pc=0xb68f219b, pid=3402, tid=3075876608 ...# Java VM: Java HotSpot(TM) Client VM (11.3-b02 mixe
  • Java进程异常退出

    千次阅读 2018-10-28 13:03:24
    今天,内网测试服务器A总是运行一段时间就服务器进程自行退出了,给出了“Java Result :137”这样的错误码。上网查了一下这个137,感觉没有啥有价值的东西。一开始怀疑项目中的JNI调用崩溃到底层,但是没有看到core...
  • IDA调试阻止java线程异常退出最近在使用IDA调试分析某款产品遇见了一个头痛的问题,因为程序核心功能在native层实现的,所以主要的侧重点是分析so文件,但是在分析的时候总是出现java线程异常,导致程序异常退出,...
  • Eclipse平时使用正常,but突然有一天无法打开,加载后突然闪退。在网上查了很多的解决方法,为了以后需要,现在归纳...(2)不行的话,重写Eclipse.ini文件,加入以下内容:-vm=D:\Program Files\Java\jdk1.5.0_06\bin...
  • java程序异常退出排查

    千次阅读 2019-04-20 10:05:38
    由于公司线上的一个服务近期一直异常退出,按照往常经验,内存溢出!启动参数加个打印内存溢出时配置,然后坐等下一次内存溢出出现,再分析一下hprof 具体请 点击查看 添加配置信息 -XX:+HeapDumpOnOutOfMemoryError...
  • 系统core和java虚拟机异常退出日志设置
  • 之前有同事说他的程序里的线程时常莫名退出,日志中没有任何异常信息。目前我知道的可以获取线程异常信息的方法主要有1、Future>和ScheduledFuture>的get()方法2、JAVA1.5之后支持的UncaughtExceptionHandler1...
  • 之前有同事说他的程序里的线程时常莫名退出,日志中没有任何异常信息。目前我知道的可以获取线程异常信息的方法主要有1、Future>和ScheduledFuture>的get()方法2、JAVA1.5之后支持的UncaughtExceptionHandler1...
  • 现在唯一的问题是如何重新抛出异常?只是做一个抛出paramThrowable? 回答我的最后一个问题:Eclipse不会让我扔没有周围的try / catch,这导致我明白,我想要的不是一个重新抛出,而是一个killProcess().问题解决了.
  • 结果 thread in Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero at com.example.pig.service.thread.ThreadTest.lambda$main$0(ThreadTest.java:13) at java.lang.Thread.run(Thread....
  • sudo dmesg -T | grep “(java)”
  • 问题现象:1.2016-4-14 11:09 左右生产环境有个java进程异常终止,终止时进程的CPU,内存,都没有异常情况。问题定位:1.异常停止后,查看message日志发现, 进程coredump,并生成了coredump文件,由于操作系统设置了不生成...
  • at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java....
  • java异常_Java异常

    2020-11-14 05:36:49
    异常发生时,是任其自生自灭,立即退出终止,还是输出错误给用户?用函数返回值作为执行状态?。Java提供了更加优秀的解决办法:异常处理机制。异常处理机制能让程序在异常发生时,按照代码的预先设定异常处理逻辑,...
  • 一种实现方式是(metaq是...3.下次文件启动时,先判断临时文件是否存在,如果存在,则起线程对异常信息进行处理 liunx下kill -9不会使shutdownhook执行,eclipse调试下直接关闭也不会执行。使用kill -15可以使...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,461
精华内容 984
关键字:

java异常退出

java 订阅