精华内容
下载资源
问答
  • 问题描述某天收到生产环境error日志...但是tail查看最新的异常信息只有这些,好忧伤:... ...java.lang.NullPointerExceptionjava.lang.NullPointerExceptionjava.lang.NullPointerExceptionjava.lang.NullPointerEx...

    问题描述

    某天收到生产环境error日志告警(对error.log监控,超过一定大小就会给开发人员发送告警短信)。但是tail查看最新的异常信息只有这些,好忧伤:

    ... ...

    java.lang.NullPointerException

    java.lang.NullPointerException

    java.lang.NullPointerException

    java.lang.NullPointerException

    java.lang.NullPointerException

    java.lang.NullPointerException

    ... ...

    后来有个同事从error.log前面开始看起,能看到完整的异常栈信息,大致如下,这样的信息就能够准确的定位问题:

    ... ...

    java.lang.NullPointerException

    at com.afei.juc.WithNPESimulate.run(NPEMain.java:21)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

    at java.lang.Thread.run(Thread.java:745)

    java.lang.NullPointerException

    at com.afei.juc.WithNPESimulate.run(NPEMain.java:21)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

    at java.lang.Thread.run(Thread.java:745)

    ... ...

    那么前面那段只有简单的java.lang.NullPointerException,没有详细异常栈信息的原因是什么呢?这需要从一个JVM参数说起。

    原因分析

    JVM中有个参数:OmitStackTraceInFastThrow,字面意思是省略异常栈信息从而快速抛出,那么JVM是如何做到快速抛出的呢?JVM对一些特定的异常类型做了Fast Throw优化,如果检测到在代码里某个位置连续多次抛出同一类型异常的话,C2会决定用Fast Throw方式来抛出异常,而异常Trace即详细的异常栈信息会被清空。这种异常抛出速度非常快,因为不需要在堆里分配内存,也不需要构造完整的异常栈信息。相关的源码的JVM源码的graphKit.cpp文件中,相关源码如下:

    //------------------------------builtin_throw----------------------------------

    void GraphKit::builtin_throw(Deoptimization::DeoptReason reason, Node* arg) {

    bool must_throw = true;

    ... ...

    // 首先判断条件是否满足

    // If this particular condition has not yet happened at this

    // bytecode, then use the uncommon trap mechanism, and allow for

    // a future recompilation if several traps occur here.

    // If the throw is hot(表示在代码某个位置重复抛出异常), try to use a more complicated inline mechanism

    // which keeps execution inside the compiled code.

    bool treat_throw_as_hot = false;

    if (ProfileTraps) {

    if (too_many_traps(reason)) {

    treat_throw_as_hot = true;

    }

    // (If there is no MDO at all, assume it is early in

    // execution, and that any deopts are part of the

    // startup transient, and don't need to be remembered.)

    // Also, if there is a local exception handler, treat all throws

    // as hot if there has been at least one in this method.

    if (C->trap_count(reason) != 0

    && method()->method_data()->trap_count(reason) != 0

    && has_ex_handler()) {

    treat_throw_as_hot = true;

    }

    }

    // If this throw happens frequently, an uncommon trap might cause

    // a performance pothole. If there is a local exception handler,

    // and if this particular bytecode appears to be deoptimizing often,

    // let us handle the throw inline, with a preconstructed instance.

    // Note: If the deopt count has blown up, the uncommon trap

    // runtime is going to flush this nmethod, not matter what.

    // 这里要满足两个条件:1.检测到频繁抛出异常,2. OmitStackTraceInFastThrow为true,或StackTraceInThrowable为false

    if (treat_throw_as_hot

    && (!StackTraceInThrowable || OmitStackTraceInFastThrow)) {

    // If the throw is local, we use a pre-existing instance and

    // punt on the backtrace. This would lead to a missing backtrace

    // (a repeat of 4292742) if the backtrace object is ever asked

    // for its backtrace.

    // Fixing this remaining case of 4292742 requires some flavor of

    // escape analysis. Leave that for the future.

    ciInstance* ex_obj = NULL;

    switch (reason) {

    case Deoptimization::Reason_null_check:

    ex_obj = env()->NullPointerException_instance();

    break;

    case Deoptimization::Reason_div0_check:

    ex_obj = env()->ArithmeticException_instance();

    break;

    case Deoptimization::Reason_range_check:

    ex_obj = env()->ArrayIndexOutOfBoundsException_instance();

    break;

    case Deoptimization::Reason_class_check:

    if (java_bc() == Bytecodes::_aastore) {

    ex_obj = env()->ArrayStoreException_instance();

    } else {

    ex_obj = env()->ClassCastException_instance();

    }

    break;

    }

    ... ...

    }

    说明:OmitStackTraceInFastThrow和StackTraceInThrowable都默认为true,所以条件(!StackTraceInThrowable || OmitStackTraceInFastThrow)为true,即JVM默认开启了Fast Throw优化。如果想关闭这个优化,很简单,配置-XX:-OmitStackTraceInFastThrow,StackTraceInThrowable保持默认配置-XX:+OmitStackTraceInFastThrow即可。

    另外,根据这段源码的switch .. case ..部分可知,JVM只对几个特定类型异常开启了Fast Throw优化,这些异常包括:

    NullPointerException

    ArithmeticException

    ArrayIndexOutOfBoundsException

    ArrayStoreException

    ClassCastException

    问题验证

    为了验证这个问题,笔者写了下面这段代码:

    /**

    * @author afei

    * @version 1.0.0

    * @since 2018年06月08日

    */

    class WithNPE extends Thread{

    private static int count = 0;

    @Override

    public void run() {

    try{

    System.out.println(this.getClass().getSimpleName()+"--"+(++count));

    String str = null;

    // 制造空指针NPE

    System.out.println(str.length());

    }catch (Throwable e){

    e.printStackTrace();

    }

    }

    }

    public class FastThrowMain {

    public static void main(String[] args) throws InterruptedException {

    WithNPE withNPE = new WithNPE();

    ExecutorService executorService = Executors.newFixedThreadPool(20);

    for (int i=0; i

    executorService.execute(withNPE);

    // 稍微sleep一下, 是为了不要让异常抛出太快, 导致控制台输出太快, 把有异常栈信息冲掉, 只留下fast throw方式抛出的异常

    Thread.sleep(2);

    }

    }

    }

    运行部分日志如下:

    WithNPE--6686

    ... ...

    java.lang.NullPointerException

    at com.afei.juc.WithNPE.run(FastThrowMain.java:21)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

    at java.lang.Thread.run(Thread.java:745)

    java.lang.NullPointerException

    at com.afei.juc.WithNPE.run(FastThrowMain.java:21)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

    at java.lang.Thread.run(Thread.java:745)

    java.lang.NullPointerException

    at com.afei.juc.WithNPE.run(FastThrowMain.java:21)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

    at java.lang.Thread.run(Thread.java:745)

    WithNPE--6687

    WithNPE--6688

    WithNPE--6689

    java.lang.NullPointerException

    java.lang.NullPointerException

    java.lang.NullPointerException

    WithNPE--6690

    WithNPE--6691

    WithNPE--6692

    java.lang.NullPointerException

    java.lang.NullPointerException

    java.lang.NullPointerException

    ... ...

    从这段日志可知,抛出了几千次带有详细异常栈信息的异常后,只会抛出java.lang.NullPointerException这种没有详细异常栈信息只有异常类型的异常信息。这就是Fast Throw优化后抛出的异常。如果我们配置了-XX:-OmitStackTraceInFastThrow,再次运行,就不会看到Fast Throw优化后抛出的异常,全是包含了详细异常栈的异常信息。

    配置JVM参数关闭Fast Throw后,即使抛出了2w+次异常,依然全是包含了详细异常栈的异常信息,日志如下:

    WithNPE--20719

    WithNPE--20720

    java.lang.NullPointerException

    at com.afei.juc.WithNPE.run(FastThrowMain.java:21)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

    at java.lang.Thread.run(Thread.java:745)

    java.lang.NullPointerException

    at com.afei.juc.WithNPE.run(FastThrowMain.java:21)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

    at java.lang.Thread.run(Thread.java:745)

    展开全文
  • 类型为“Learun.Application.Mapping.UT_FI_PaymentApplyDetailMap”的表达式不能...)”的类型为“System.Data.Entity.ModelConfiguration.EntityTypeConfiguration`1[Learun.Application.IM.IMContactsEntity]”的参数
  • java.lang.Exception:索引中丢失IN或OUT参数::2atcom.easymap.management.apiimpl.OrganizationManagerImpl.findOrganizationsByLevel(UnknownSource)attest.Test_OrganizationManage...java.lang.Exception: 索引中...

    java.lang.Exception:索引中丢失IN或OUT参数::2atcom.easymap.management.apiimpl.OrganizationManagerImpl.findOrganizationsByLevel(UnknownSource)attest.Test_OrganizationManage...

    java.lang.Exception: 索引中丢失 IN 或 OUT 参数:: 2

    atcom.easymap.management.apiimpl.OrganizationManagerImpl.findOrganizationsByLevel(Unknown Source)

    at test.Test_OrganizationManager.testfindOrganizationsByLevel(Test_OrganizationManager.java:22)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

    at java.lang.reflect.Method.invoke(Unknown Source)

    at junit.framework.TestCase.runTest(TestCase.java:168)

    at junit.framework.TestCase.runBare(TestCase.java:134)

    at junit.framework.TestResult$1.protect(TestResult.java:110)

    at junit.framework.TestResult.runProtected(TestResult.java:128)

    at junit.framework.TestResult.run(TestResult.java:113)

    at junit.framework.TestCase.run(TestCase.java:124)

    at junit.framework.TestSuite.runTest(TestSuite.java:232)

    at junit.framework.TestSuite.run(TestSuite.java:227)

    at org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:76)

    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)

    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)

    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)

    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)

    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

    展开

    展开全文
  • 下面本公众号文章分类目录,点击标题文字可打开分类文章列表:CAD安装卸载异常、退出文件及输入输出基本操作技巧各种设置及相关问题界面和显示相关问题快捷键视图设置和调整选择及组坐标系、坐标输入对象捕捉图层...

    f40915ac39ceb950bf72cb74b79f4c96.gif

    下面是本公众号文章分类目录,点击标题文字可打开分类文章列表:

    CAD安装卸载  异常、退出  文件及输入输出  基本操作技巧  各种设置及相关问题  界面和显示相关问题  快捷键  视图设置和调整  选择及组  坐标系、坐标输入  对象捕捉  图层管理   颜色  线型  字体和文字  标注、引线  二维绘图  多段线   表格   图块、属性块、动态块  填充   复制粘贴  三维建模  图形编辑修改  布局和视口  外部参照  光栅图像  打印输出  查询面积等数据  心得及综合技巧  CAD工具及插件  CAD图库及相关资源   二维练习图  三维练习 CAD基础练习图(1-30) CAD基础练习图(31-64) CAD基础练习图(65-100) 

    在之前一些文章中,在输入命令和快捷键的时候又是会在前面加一个"-",有人问为什么要在命令前加一个负号,到底是什么意思?

    为了适应操作和二次开发程序调用的需要,很多CAD命令提供了两种模式:对话框模式和命令行模式。对话框模式将重要选项一次显示出来,可以同时设置多个参数,操作比较简单,绘图编辑的时候通常使用这种模式,而在程序里调用时,希望能连续进行操作且不弹出任何界面,通常会使用命令行模式。但这也不是绝对的,绘图编辑的时候,有时也可以使用命令行模式,有些参数可能在对话框中找不到,可能用命令行模式调用,还有一些情况使用命令行模式操作速度会更快。

    下面我们简单看一下几个命令的对话框模式和命令行模式有什么区别?

    1、填充

    输入H或HATCH回车,会弹出填充对话框或显示填充面板,可以设置图案、比例等大量参数,如下图所示。

    05a4f3f1173372b8dcf61b7ea4334003.png

    如果是用上下文命名面板,命令行也会弹出一些提示,也可以输入输入参数进行设置。如果弹出的是传统的对话框,命令行就不会有相关选项,只能在对话框进行设置了,如下图所示。

    b8b7355e33c061b219a4be7ae634bd64.png

    如果输入-H,回车,就不会弹出对话框或显示命令面板,命令行就会有更多参数,如下图所示。

    5b0b3235dfafaeb62dbb24ae0f3ae4d7.png

    命令行模式就需要先输入参数的关键字,回车,设置这些参数,对于填充图案比较麻烦的就是指定填充图案的名字。

    CAD填充需要了解的重要问题之一(填充图案)

    CAD填充需要了解的重要问题之二(填充比例))

    CAD填充需要了解的重点问题之三(边界篇)

    CAD填充需要了解的重要问题之四(其他)

    2、标注样式

    输入D或DIMSTYLE,回车,就会打开标注样式管理器,可以对新建、修改、比较标注样式,标注样式的参数就更复杂了,这些用命令行模式去操作的话显然不太方便,如下图所示。

    f386349c167bee751fe476416a6445cd.png

    输入-DIMSTYLE回车可以执行名命令行模式,可以看到选项跟对话框有比较大的区别,如下图所示。

    46094e7567143ca1355f7e8d86579e7a.png
    这里的选项跟对话框有很大差别,有些选项是对话框模式的补充,比如恢复选项对应的是菜单中的标注更新的命令,可以让被修改过的标注恢复成与标注样式一致的效果。

    CAD标注几个常见问题的原因和解决方法?

    CAD标注相关命令和特性?

    CAD设置标注样式的基本操作

    注意:这里无法输入-D,因为在别名文件中只定义了DIMSTYLE的快捷键是D,而没有定义-DIMSTYLE的快捷键是-D,而填充-H是定义成-HATCH的。

    前几天我们还介绍了外部参照的一些操作用命令行也很方便,如果感兴趣的可以看看其他有对话框的命令的命令行模式。另外可以看看CAD的别名文件,也就是大家通常说的快捷键PGP文件,看看有哪几个命令的命令行模式设置了快捷键,比如-G组,-B创建图块,重点试试这些命令的命令行模式,看看跟对话框模式有什么区别。

    CAD外部参照如何全部重载和绑定?

    9a3491f432d3f252c4cc47c7f78ccc65.png

    展开全文
  • Python index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与 python find() 方法一样,只不过如果str不在 string中会报一个异常。...

    61b6e1f4c6cb1f5119edc70ad5eb3a61.png

    Python index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与 python find() 方法一样,只不过如果str不在 string中会报一个异常。语法
    index()方法语法:

    str.index(str, beg=0, end=len(string))

    参数
    str -- 指定检索的字符串。
    beg -- 开始索引,默认为0。
    end -- 结束索引,默认为字符串的长度。返回值
    如果包含子字符串返回开始的索引值,否则抛出异常。实例
    以下实例展示了index()方法的实例:

    #!/usr/bin/python str1 = "this is string example....wow!!!"; str2 = "exam";  print str1.index(str2); print str1.index(str2, 10); print str1.index(str2, 40);
    以上实例输出结果如下:
    15 15 Traceback (most recent call last):   File "test.py", line 8, in    print str1.index(str2, 40); ValueError: substring not found shell returned 1
    

    原文至:

    python index函数是什么意思www.py.cn
    c6cd34800a85eba596d01c93177ae1fd.png
    展开全文
  • 重写 Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也面向对象...
  • java中System.exit(0);是什么意思

    千次阅读 2017-12-14 01:54:19
    System一个Java类,调用exit(0)方法终止虚拟机也就是退出你的Java程序,括号里面的是参数,进程结束的返回值。 给你参考吧,这比说的好。 public static void exit(int status)终止当前正在运行的 Java 虚拟机。...
  • 堆栈类peek()方法peek()方法在java.util包中可用。peek()方法用于从此Stack中返回顶部元素,并且它不删除就检索元素。peek()方法一种非静态方法,...参数:它不接受任何参数。返回值:该方法的返回类型为Object...
  • 参数必须有值,如果没有则抛出异常
  • exit方法用于中断正在运行之中的java虚拟机,其中包含的整形参数用来表示状态码。惯例来说,非零的状态码表示异常终止。零状态码表示正常终止整个程序。
  • Java中的方法覆盖(Overriding)和方法重载(Overload)是什么意思? 方法重写的原则: 重写方法的方法名称、参数列表必须与原方法的相同,返回类型可以相同也可以是原类型的子类型(从Java SE5开始支持)。 重写方法不能...
  • 1、Java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况(例如,参数数量、参数类型、不同的参数顺序)。 2、重载不能通过访问权限、返回值类型和抛出的异常类型来进行重载。 覆盖...
  • 基本语法格式为:raise[exceptionName[(reason)]]其中,用 [] 括起来的为可选参数,其作用指定抛出的异常名称,以及异常信息的相关描述。如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 ...
  • 这些高级特性基本上没用处,但是对于那些要着手写框架或者写大型项目的高手来说,这些特性就比较有用了,比如说tornado里面的异常捕获时就有用到__class__来定位类的名称,还有高度灵活传参数的时候用到__dict__来...
  • 异常

    2021-04-09 13:49:15
    什么是异常 实际工作中,遇到的情况不可能非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能空的...
  • 用Python操作字符串之rindex()方法的使用rindex()方法返回所在的...语法以下rindex()方法的语法:str.rindex(str, beg=0 end=len(string))参数str -- 此选项指定要搜索的字符串。beg -- 这开始索引,默认情况下...
  • 什么是JSR-303 JSRJava Specification Requests的缩写,意思是Java规范提案,指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务,JSR...
  • Java中throws IOException什么意思

    万次阅读 2018-12-19 11:19:01
    throws IOExceptionJava中的throws语句。...语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......} public void doA(int a) throws  Exception1,Exception3{......} 举例: ...
  • 方法重写子类重新定义父类的方法 方法重载发生在同一个类里两个或多个方法的方法名相同但是参数列表...重写方法不能比原方法抛出更多的异常 final修饰的方法无法重写的 private修饰的方法无法重写的 static修
  • 什么是JSR-303 JSRJava Specification Requests的缩写,意思是Java规范提案,指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务,...
  • jdk1.5的新特性:变长变量。 其实这种定义就类似一个数据的定义,可以不用给它的长度加以限制,可以传入任意多个参数。 比用数据更灵活一些,不会出现一些...)等,参数个数没有限制,类型前面规定的String类型。...
  • $# 传入脚本的参数个数; $0: 脚本自身的名称; $1: 传入脚本的第一个参数 $2: 传入脚本的第二个参数; #@:传入脚本的所有参数; $?:上一条命令执行后的状态,结果为0表示执行正常...=:应该不等于的意思???? ...
  • Java异常

    2021-04-06 17:49:52
    什么是异常 实际工作中,遇到的情况不可能非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能空的...
  • 异常处理

    2021-04-12 19:59:32
    什么是异常 实际工作中,遇到的情况不可能非常完美的。比如:写一个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取的数据库的数据,可能数据库空的...
  • Java异常机制

    2021-03-01 13:39:50
    异常机制 Exception ...检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如打开一个不存在的文件时,一个异常就发生了,这些异常在编译时不能被简单的忽略。测试岗
  • 异常学习-java

    2020-12-19 16:47:18
    最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。 运行时异常: 运行时异常时可能被程序员避免的异常。...
  • Day17 异常

    2021-03-25 15:40:54
    什么是异常 实际工作中,遇到的情况不可能非常完美的。比如,写的某个模块,用户输入不一定符合我们的要求、我们的程序要打开某个文件,这个文件可能不存在或者文件格式不对,我们要读取数据库的数据,数据可能...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 159
精华内容 63
关键字:

参数异常是什么意思