2 xukun245 xukun245 于 2014.11.14 02:31 提问

java能否动态的在程序中获得出错的值(入参)

现在想对项目中的日志进行改造.方便出问题时的解决效率.(出问题时每次都要对错误进行复现.尤其是流程很长的时候.花了大量的时间和精力).
举个简单的例子.
public class 人 {
private String 身高;
private String 体重;
private int 年龄;
public String get身高() {
return 身高;
}
public void set身高(String 身高) {
this.身高 = 身高;
}
public String get体重() {
return 体重;
}
public void set体重(String 体重) {
this.体重 = 体重;
}
public int get年龄() {
return 年龄;
}
public void set年龄(int 年龄) {
this.年龄 = 年龄;
}
public static void main(String[] args) {
try {
人 r = new 人();
r.set体重("100KG");
r.set年龄( 0/0 );
r.set身高("1.7885".substring(0,4));
System.out.println(r.get体重());
System.out.println(r.get年龄());
r=null;
System.out.println(r.get身高());
} catch (Exception e) {
e.printStackTrace();
}
}
}
如果基本功足够一眼就能看到0/0在运行时会出错的.r=null之后get身高也会报空指针.
在第一次运行时控制台输出了错误
java.lang.ArithmeticException: / by zero
at test.人.main(人.java:29)
人.java文件中的29行,main方法中出了错误.错误原因是 by zero 除数不能为0.
我想问一下能否通过线程或者反射之类的获取到当时运行时的错误值并输出出来.比如
出错方法名 /(PS:算数运算符不知道能不能称之为方法..除法?),出错值 0;
java.lang.ArithmeticException: / by zero
at test.人.main(人.java:29)
这样.
如果我们把0/0改为0/1.在继续运行
100KG
0
java.lang.NullPointerException
at test.人.main(人.java:34)
空指针了.这时候我想要的输出格式是
出错方法名 get身高 出错值 null 或者是
出错方法名 System.out.println 出错值 null
java.lang.NullPointerException
at test.人.main(人.java:34
只举了两个很基础的例子 但在实际项目运行中.这种因为数据错误而导致的下标越界,空指针之类的错误很常见.每次使用前都没有进行if(xx!=null)或if(xx!=null&&xx.size()>0)之类的判断.碰到正常数据即使不判断也不会出问题.一旦出现异常没有判断就会出错.然后我们就要在开发环境检查出错时这字段存的是什么.然后在去找.这字段在哪个流程中存入了不该存的值.

我的目的是完全不用通过开发环境复现 只需要看当时的ERR日志就清楚的知道运行时这个出错的值是什么.(如果是dao在保存对象时出错就用反射打印对象的全部get方法来看)然后在通过搜索info日志去找流程中哪里对这个值改动过(在操作dao的时候输出每个字段的全部信息,输出sql语句).很快就通过日志来确定错误地点.而不是反复的复测.跟踪断点.(debug模式)去找问题.

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Java 注解入门实例 && 注解传参
参考 概念:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法 JDK内置系统注解: @Override 用于修饰此方法覆盖了父类的方法; @Deprecated 用于修饰已经过时的方法; @Suppvisewarnings 用于通知java编译器禁止特定的编译警告。 注解按照运行机制划分 源码注解:注解只在源码中存在,编译成.class文件就不存在了; 编译时
Java如何在方法中修改传入参数的值
今天看到一张帖子,楼主问Java如何在方法中修改传入参数的值。 之前也经常被这个问题困扰,C++可以用指针或引用来实现,但是Java怎么办? 先来举个例子吧,比如int i = 5,你把i做参数。java是复制一个它的值过去,所以在方法里改的只是复制品。 再如s = "want to change",这句其实只做了一件事,就是把s指向了新的String对象"want to change",而
java编写多个入参
面试官提问:如果要你编写程序计算1~10000之间的和,怎么写该程序? 首先你想到不定参数求和的方法  add_01(int a, int... list),通过这个方法进行求和 public static int add_01(int a, int... list) { int sum = 0; for (int i : list) { if (i >= a) {
Java 函数的参数引用,通过传入参数带回函数运行结果
Java没有指针,在需要由参数直接带回结果的情况下,较C语言相比有一点差别,C任何类型可通过指针传递,在Java中,需要自定义一个类,而类可以通过函数的参数返回结果。   public class testParameter { public testParameter() { } public static void main(String[] args)
Java如何获取方法参数中的名称
在有些场景下,我们有可能想在程序中获取一个方法的参数的名称。 但是,对于Java这样的“编译”型语言来说,并没有直接的API可以调用。 其实很容易理解,当Java源代码被编译成字节码后,方法的签名可能不会被保存下来,也就无从获取方法的参数名称了。 虽然官方没有提供直接的解决方案,但是民间偏方还是有的。 思路就是:字节码解析,通过解析class文件,获取方法签名
使用Java、hibernate validator注解校验入参,格式化出参(入参)
在项目执行真正业务代码前,一般都需要对于前端的入参值进行一轮的判断,而一般的做法是写if语句进行值的判断,如下例子public boolean insertOneUser(String name, int age) { if (name == null || name == "") { System.out.println("请输入名称"); return false; } ...
注意pointcut的入参的表达式名称
今天为了这个问题调了一上午 当package=beforeprocessor时,而我在ponitcut里使用另外一个包(习惯性动作 自己也忘记了) package beforeprocessor; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning
反射_通过反射获取带参带返回值成员方法并使用
package cn.itcast_04; import java.lang.reflect.Constructor; import java.lang.reflect.Method; /* * 需求:通过反射获取成员方法 */ public class ReflectDemo { public static void main(String[] args) throws Excepti
前端抓包工具
前端抓包工具:不需安装,解压双击运行,在浏览器中获得请求,然后再该工具的嗅探模块中TextView中获得入参base64码的入参参数,方便快捷。
java如何获取方法参数名
在java中,可以通过反射获取到类、字段、方法签名等相关的信息,像方法名、返回值类型、参数类型、泛型类型参数等,但是不能够获取方法的参数名。在实际开发场景中,有时需要根据方法的参数名做一些操作,比如像spring-mvc中,@RequestParam、@PathVariable注解,如果不指定相应的value属性,默认就是使用方法的参数名做为HTTP请求的参数名,它是怎么做到的呢? 在这样情况下