今天在写程序时,想到一个问题,当我的程序出异常的时候,控制台输出信息中,明确指出了出现异常的位置,并详细列举了函数的调用层次关系,它是怎么做到的。

竟然想到了这个问题,就去查看了源代码,不过没点几下,就遇到了native本地方法,只好作罢。于是又去网上找了这方面的资料,最后找到了一点这方面的东西,不过它给出的只是API,却并没有对代码做什么解释。代码如下

public class Test {
public static int getLineNumber() {
return Thread.currentThread().getStackTrace()[2].getLineNumber();
} public static String getFileName() {
return Thread.currentThread().getStackTrace()[2].getFileName();
} public static void main(String args[]) {
System.out.println("[" + getFileName() + ":" + getLineNumber() + "]" + "Hello World!");
}
}

这程序中为什么要取数组中的第二个呢?原帖没有给出解释。

接着,我自己去写了一段代码进行测试,代码如下

class StackTraceDemo
{
public static void main(String[] args)
{
System.out.println(findLocation(2));
System.out.println();
System.out.println(findAllLocation());
} public static String findAllLocation()
{
StringBuilder locations = new StringBuilder();
StackTraceElement elements [] = Thread.currentThread().getStackTrace(); for(int i=0;i<elements.length;i++){
locations.append(findLocation(i) +"\n");
} return locations.toString();
} public static String findLocation(int level)
{
StackTraceElement element = Thread.currentThread().getStackTrace()[level];
return "File: "+element.getFileName()+" Line: "+element.getLineNumber()+" Method: "+element.getMethodName();
}
}

程序运行得到这样的结果:

File: StackTraceDemo.java Line: 5 Method: main





File: Thread.java Line: 1567 Method: getStackTrace

File: StackTraceDemo.java Line: 24 Method: findLocation

File: StackTraceDemo.java Line: 16 Method: findAllLocation

从这个结果中来看,之所以前面那个程序选取第二个元素,是因为Java程序运行时函数入栈是在数组的起始位置入栈,其它的栈元素后移。这是我的个人之见,我也不敢确定自己所想是否正确,欢迎有别的看法的人或知道原理的人留言指点交流。

Java线程运行轨迹-代码追踪与定位的更多相关文章

  1. Java中运行javascript代码

    Java中运行javascript代码 1.Java 代码 2.JS代码 2.1demoWithParams.js 2.2demoWithListParams.js 原文作者:russle 原文地址: ...

  2. Java线程池ExecutorService 代码备忘

    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5)创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待 p ...

  3. iOS 后台运行执行代码(例如定位)

  4. app 自动化测试 Appium+Java可以运行的代码

    地址:http://www.cnblogs.com/sunny-sl/p/6520465.html

  5. java 线程安全不线程不安全

    经常看到一些类,有的说线程安全,有的说线程不安全,顿时懵逼. 线程安全不安全,主要是在多线程执行的情况下,如果由于线程之间抢占资源而造成程序的bug即为线程不安全,下面就拿arraylist 和Vec ...

  6. java线程详解(一)

    1,相关概念简介 (1)进程:是一个正在执行的程序.每一个进程执行都有一个执行的顺序,该顺序就是一个执行路径,或者叫一个控制单元.用于分配空间. (2)线程:就是进程中一个独立的控制单元,线程在控制着 ...

  7. 漫谈并发编程(二):java线程的创建与基本控制

    java线程的创建 定义任务           在java中使用任务这个名词来表示一个线程控制流的代码段,用Runnable接口来标记一个任务,该接口的run方法为线程运行的代码段. public ...

  8. 并发编程(十二)—— Java 线程池 实现原理与源码深度解析 之 submit 方法 (二)

    在上一篇<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法.这篇文章是接着上一篇文章 ...

  9. Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

随机推荐

  1. JavaScript DOM-Ready 机制

    IE9开始和其他现代浏览器可以通过绑定DOMContentLoaded事件:IE9之前的的浏览器需要绑定onreadystatechange事件并等待readyState为"complete ...

  2. zoj 3656

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4879 代码: #include<cstdio> #inc ...

  3. python 3 操作 excel

    看到一篇很好的python读写excel方式的对比文章: 用Python读写Excel文件 关于其他版本的excel,可以通过他提供的链接教程进行学习. XlsxWriter: https://git ...

  4. 全国各城市Uber客服联系方式(电话、邮箱、微博)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  5. .htaccess文件的妙用

    .htaccess是Apache HTTP Server系统级别的配置文件,通常用来实现主机本身以外的一些功能的,比如说重定向.Gzip.以及访问限制等等………… 1.重定向(301跳转) 相信这个功 ...

  6. fastjson 的简单说明及使用

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发. 各个版本jar包下载地址:https://repo1.maven.org/maven2/ ...

  7. Phonegap(Cordova)3.4 + Android 环境搭建

               PhoneGap是一个用基于HTML.CSS和JavaScript的,创建移动跨平台移动应用程序的高速开发平台. 它使开发人员可以利用iPhone,Android,WP7等多 ...

  8. xslt语法之---基础语法

    1. XSLT常用元素: 1.1 <xsl:template>:创建模板     Match属性的作用是使模板和XML元素相关联 <xsl:template match=" ...

  9. mailsend - Send mail via SMTP protocol from command line

    Introduction mailsend is a simple command line program to send mail via SMTP protocol. I used to sen ...

  10. 利用MutationObserver对页面元素的改变进行监听

    'use strict'; let MutationObserver = window.MutationObserver || window.WebKitMutationObserver || win ...