首页 > 其他分享 >idea在continue的breakpoint不起作用

idea在continue的breakpoint不起作用

时间:2022-10-08 13:55:05浏览次数:44  
标签:java L1 breakpoint idea continue L0 LINENUMBER public

1,背景

调试代码的时候遇到continue处的breakpoint不起作用,故记录一下过程。

2,分析过程

2.1,复现

public class test {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            if (i ==  5) {
                System.out.println(i);
                continue;
            }
        }
    }
}

image

程序直接执行完并结束,断点未起作用

2.2,分析

check了一下代码的字节码

// class version 52.0 (52)
// access flags 0x21
public class test {

  // compiled from: test.java

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 8 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Lcom/test; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 11 L0
    ICONST_0
    ISTORE 1
   L1
   FRAME APPEND [I]
    ILOAD 1
    BIPUSH 10
    IF_ICMPGE L2
   L3
    LINENUMBER 12 L3
    ILOAD 1
    ICONST_5
    IF_ICMPNE L4
   L5
    LINENUMBER 13 L5
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ILOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println (I)V
   L4
    LINENUMBER 11 L4
   FRAME SAME
    IINC 1 1
    GOTO L1
   L2
    LINENUMBER 17 L2
   FRAME CHOP 1
    RETURN
   L6
    LOCALVARIABLE i I L1 L2 1
    LOCALVARIABLE args [Ljava/lang/String; L0 L6 0
    MAXSTACK = 2
    MAXLOCALS = 2
}

通过字节码发现一个问题,并没有找到LINENUMBER 13,就好像这行代码并没写过一样。难道continue字段消失了?
将代码稍微调整一下:

public class test {

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            if (i ==  5) {
                continue;
            } else {
                System.out.println(i);
            }
        }
    }
}

image
可以发现断点生效了,然后check一下字节码:

// class version 52.0 (52)
// access flags 0x21
public class test {

  // compiled from: test35.java

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 8 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Ltest; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 11 L0
    ICONST_0
    ISTORE 1
   L1
   FRAME APPEND [I]
    ILOAD 1
    BIPUSH 10
    IF_ICMPGE L2
   L3
    LINENUMBER 12 L3
    ILOAD 1
    ICONST_5
    IF_ICMPNE L4
   L5
    LINENUMBER 13 L5
    GOTO L6
   L4
    LINENUMBER 15 L4
   FRAME SAME
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ILOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println (I)V
   L6
    LINENUMBER 11 L6
   FRAME SAME
    IINC 1 1
    GOTO L1
   L2
    LINENUMBER 18 L2
   FRAME CHOP 1
    RETURN
   L7
    LOCALVARIABLE i I L1 L2 1
    LOCALVARIABLE args [Ljava/lang/String; L0 L7 0
    MAXSTACK = 2
    MAXLOCALS = 2
}

可以发现 出现了 LINENUMBER 13 L5的内容了。

所以为什么会有这种差异呢?其实就是javac编译期对代码做了优化,示例中的代码的continue逻辑是可以去掉的,然后javac编译时会做这个优化,因此断点调试时无法断点,并不是因为continue具有特殊性。

3,结论

不得不佩服java编译器的强大,在断点gson代码的时候发现断点continue一直未生效,还以为是找错地方了,原来是因为断点打在了可有可无的continue上了。

标签:java,L1,breakpoint,idea,continue,L0,LINENUMBER,public
From: https://www.cnblogs.com/cord/p/16768716.html

相关文章

  • Demo23_or循环与while循环的区别 break与continue的区别
    //for循环与while循环的区别break与continue的区别packagecom.HuanXin.JiBen_JieGou_4;publicclassDemo12_break_continue{publicstaticvoidmain(String[]arg......
  • Demo22_关于continue
    /continue的理解packagecom.HuanXin.JiBen_JieGou_4;publicclassDemo11_continue{publicstaticvoidmain(String[]args){intA=0;while(A<10......
  • idea主题
    https://blog.csdn.net/JJS_XiaoBai/article/details/116164621?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-1161646......
  • IDEA2022 提示:更新 TKK 失败,请检查网络连接
    IDEA提示:更新TKK失败,请检查网络连接经过一圈的网上冲浪发现大家说的都是如下图那样的但实际idea2022版本中我并没有发现有这个勾选框也尝试过卸载插件,重启idea及电......
  • docker搭建yapi接口文档系统、Idea中上传接口、在线调用
    一、前言在我们后端开发中,必不可少的是接口的交接,有很多种方式,常见的就是swagger,不过这个侵入性太强了。还有就是接口文档的框架,比如今天小编带大家一起搭建的yapi,在公司......
  • 免费申请和使用IntelliJ IDEA商业版License指南
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demosIntelliJIDEA是广受Java开发者喜爱的工具,其商业版的价格十分......
  • idea远程连接云服务器,并将本地代码部署在云端进行运算
    电脑内存和显存过小,需要在云服务器进行运算我的模型,由于一直在自己的电脑上写的代码,于是之间迁移代码到云服务器,只要通过ssh链接到云端后,将python解释器使用云端的解释器就......
  • IDEA中使用Eclipse快捷键
    IDEA中使用Eclipse快捷键1.*断点快捷键说明Ctrl+Shift+B在光标处打断点/取消断点Ctrl+Alt+B忽略所有断点Alt+Shift+Q激活断点1.*调试执行功......
  • 解决IntelliJ Idea与Tomcat10关于Servlet5.0不匹配的问题
    在学习Mybatis的时候,创建了一个JavaWeb程序来做试验。出现了以下错误,在网上查了很多,最后在网上发现是Idea里面的Serlvet4.0与Tomcat10不匹配的问题。jakarta.servlet.S......
  • 解决IDEA输出中文乱码问题
    问题描述(中国人加油,真痛苦)无法正确输出中文字符:(请正确分辨自己是哪一种乱码问题!)  解决方法1、最容易想到File->Settings->FileEncodings下设置编码格式为UTF......