java中有没有更好方法,在"."语句前,检查空指针?

z13759561330 2014-11-18 11:56:06
在C语言中可以用个宏。
在java中有没有方便点的办法。
大家先看一下我的办法:
先定义一个范型方法
public static <T extends Object> T validateNullPointer(T object) {
//FILE_LINE_FUNC(),获取validateNullPointer()调用点的文件名、行号、方法名信息
if (object == null) {
throw new NullPointerException(FILE_LINE_FUNC()
+ "NullPointerException");
}
return object;
}

在"."语句时:
Debug.validateNullPointer(crashPath).exists()


大家来看一下还有没有什么更好的办法?
...全文
354 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
z13759561330 2014-12-05
  • 打赏
  • 举报
回复
关键在FILE_LINE_FUNC()方法:

下面贴出完整源代码:

package com.zjg.youhuodong;


import java.text.SimpleDateFormat;
import java.util.Date;


public final class Debug {


private Debug() {
// TODO 自动生成的构造函数存根
}


private static StackTraceElement getStackTraceElement(int level) {
StackTraceElement[] traceElement = (new Exception()).getStackTrace();
level = Math.min(Math.max(level, 2), traceElement.length - 1);
return ((new Exception()).getStackTrace())[level];
}


public static final int THROW_PLACE = 2;
public static final int ONE_LEVEL_CALL_PLACE = 3;


public static <T extends Object> T validateNullPointer(T object) {
//FILE_LINE_FUNC(),获取validateNullPointer()调用点的文件名、行号、方法名信息
if (object == null) {
throw new NullPointerException(FILE_LINE_FUNC()
+ "NullPointerException");
}
return object;
}


public static String FILE_LINE_FUNC(int level) {
StackTraceElement traceElement = getStackTraceElement(level);
return new StringBuffer("[").append("FILE:")
.append(traceElement.getFileName()).append("|").append("LINE:")
.append(traceElement.getLineNumber()).append("|")
.append("FUNC:").append(traceElement.getMethodName())
.append("]").toString();
}


public static String FILE_LINE_FUNC() {
StackTraceElement traceElement = getStackTraceElement(ONE_LEVEL_CALL_PLACE);
return new StringBuffer("[").append("FILE:")
.append(traceElement.getFileName()).append("|").append("LINE:")
.append(traceElement.getLineNumber()).append("|")
.append("FUNC:").append(traceElement.getMethodName())
.append("]").toString();
}


public static String CLASS(int level) {
return getStackTraceElement(level).getClassName();
}


public static String CLASS() {
return getStackTraceElement(ONE_LEVEL_CALL_PLACE).getClassName();
}


public static String FILE(int level) {
return getStackTraceElement(level).getFileName();
}


public static String FILE() {
return getStackTraceElement(ONE_LEVEL_CALL_PLACE).getFileName();
}


public static String FUNC(int level) {
return getStackTraceElement(level).getMethodName();
}


public static String FUNC() {
return getStackTraceElement(ONE_LEVEL_CALL_PLACE).getMethodName();
}


public static int LINE(int level) {
return getStackTraceElement(level).getLineNumber();
}


public static int LINE() {
return getStackTraceElement(ONE_LEVEL_CALL_PLACE).getLineNumber();
}


public static String TIME() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
.format(new Date());
}
}

不知还有没有更好的方法?
z13759561330 2014-12-05
  • 打赏
  • 举报
回复
对啊,就是自定义了一个抛出的异常类型,传递了更高一级的调用点信息。
tony4geek 2014-11-19
  • 打赏
  • 举报
回复
语法可以找类似的插件检查,比如你 定义一个 没赋值的类似这样都可以检查出来。
唐三角 2014-11-19
  • 打赏
  • 举报
回复
Debug.validateNullPointer(crashPath).exists() crashPath.exists() 的执行效果有什么区别呢? 最终不都是抛出 NullPointerException 么? 或者说,你希望能够自定义 抛出的异常类型? 抛出自定义的异常之后,你接着打算怎么干呢?
Coder_D 2014-11-19
  • 打赏
  • 举报
回复
引用 3 楼 z13759561330 的回复:
[quote=引用 1 楼 wanghualeilei 的回复:] 定义切面 切面里判断
不懂啊,能详细说说吗?[/quote] 就是AOP,面向切面编程,spring用过吗?spring的事务管理就是一个例子,你把需要在业务前后做判断的代码块看成一个切面,统一一个方法在进入切面和从切面出来的时候执行
放纵的青春 2014-11-19
  • 打赏
  • 举报
回复
引用 4 楼 z13759561330 的回复:
[quote=引用 2 楼 djy18178 的回复:] java里面变量校验都是得自己写的 都是外部传过来的变量 则可以单独提取出来校验
就是项目大了,代码多,不知那里会冒出个空指针,毕竟人非圣贤,再好的代码结构也比不上从语言机制层面上预防。[/quote] 语言机制并不能控制你这个空值带来的破坏效果
放纵的青春 2014-11-19
  • 打赏
  • 举报
回复
引用 4 楼 z13759561330 的回复:
[quote=引用 2 楼 djy18178 的回复:] java里面变量校验都是得自己写的 都是外部传过来的变量 则可以单独提取出来校验
就是项目大了,代码多,不知那里会冒出个空指针,毕竟人非圣贤,再好的代码结构也比不上从语言机制层面上预防。[/quote] 鲁棒性 java 空指针不会让你的程序中断的 如果你的异常处理机制做的足够好的话
boybaozi 2014-11-18
  • 打赏
  • 举报
回复
引用 1 楼 wanghualeilei 的回复:
定义切面 切面里判断
同问
z13759561330 2014-11-18
  • 打赏
  • 举报
回复
引用 2 楼 djy18178 的回复:
java里面变量校验都是得自己写的 都是外部传过来的变量 则可以单独提取出来校验
就是项目大了,代码多,不知那里会冒出个空指针,毕竟人非圣贤,再好的代码结构也比不上从语言机制层面上预防。
z13759561330 2014-11-18
  • 打赏
  • 举报
回复
引用 1 楼 wanghualeilei 的回复:
定义切面 切面里判断
不懂啊,能详细说说吗?
放纵的青春 2014-11-18
  • 打赏
  • 举报
回复
java里面变量校验都是得自己写的 都是外部传过来的变量 则可以单独提取出来校验
wanghualeilei 2014-11-18
  • 打赏
  • 举报
回复
定义切面 切面里判断

50,545

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧