仅layout使用继承TextView,报java.lang.NullPointerException

Android 2.3.3         
Eclipse Version: 3.7.0         
LogCat   

 AutoScrollTextView继承TextView,用于文字特殊效果显示,代码如下:

public class AutoScrollTextView extends TextView implements OnClickListener {
	……
	public void onDraw(Canvas canvas) {
		……
		canvas.drawText(text, temp_view_plus_text_length - step, y, paint);
		……
	}
	……
}

Activity中使用:
 

nokia = (AutoScrollTextView) findViewById(R.id.nokia);

Activity对应的layout :

		<com.jinhua.util.AutoScrollTextView
			android:id="@+id/nokia" android:text="nokia" android:layout_height="fill_parent"
			android:layout_width="40px" android:textColor="#999"
			android:layout_gravity="right" android:background="#333">
		</com.jinhua.util.AutoScrollTextView>

当Activity中取消使用AutoScrollTextView,而对应layout 未取消对应配置时,
LogCat 报错信息:

02-06 23:15:33.728: DEBUG/AndroidRuntime(1034): Shutting down VM
02-06 23:15:33.728: WARN/dalvikvm(1034): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): FATAL EXCEPTION: main
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): java.lang.NullPointerException
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.graphics.Canvas.drawText(Native Method)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at com.nokia.util.AutoScrollTextView.onDraw(AutoScrollTextView.java:181)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.View.draw(View.java:6880)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.View.draw(View.java:6883)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.widget.FrameLayout.draw(FrameLayout.java:357)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.ViewRoot.draw(ViewRoot.java:1522)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.os.Handler.dispatchMessage(Handler.java:99)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.os.Looper.loop(Looper.java:123)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at java.lang.reflect.Method.invokeNative(Native Method)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at java.lang.reflect.Method.invoke(Method.java:507)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-06 23:15:33.747: ERROR/AndroidRuntime(1034): at dalvik.system.NativeStart.main(Native Method)
02-06 23:15:33.797: WARN/ActivityManager(61): Force finishing activity com.nokia.tmall/.Ad

 
发生错误原因分析:

canvas.drawText(text, length, width, paint);

此处的paint为null,报错。

解决办法:在AutoScrollTextView.java中初始化paint,为其赋值。

 paint = getPaint();

 

### java.lang.NullPointerException 报错原因及修改方法 在Android开发中,`java.lang.NullPointerException` 是一种常见的运行时异常,通常发生在尝试调用一个空对象的引用时。根据提供的引用内容[^1]、[^2]和[^3],以下是对该问题的详细分析以及解决方法。 #### 1. 报错原因 `java.lang.NullPointerException` 的主要原因是程序试图对一个为 `null` 的对象进行操作。例如: - 调用了 `null` 对象的方法或访问其属性。 - 尝试将 `null` 对象作为参数传递给需要非空值的方法。 具体到字节码文件中的报错(如 `LayoutInflater.createViewFromTag`),可能的原因包括: - XML 文件中定义的视图组件未正确初始化。 - 在代码中尝试操作尚未创建的对象。 - 使用了 `addHeaderView` 或 `setAdapter` 方法时,传入的参数为 `null`。 - 编译过程中某些资源文件路径缺失,导致生成的字节码文件中存在无效引用[^3]。 #### 2. 修改方法 以下是针对 `java.lang.NullPointerException` 的常见修改方法: ##### (1) 检查XML布局文件 确保所有在XML中定义的视图组件均已正确初始化,并且没有拼写错误或无效的标签。例如,在以下代码中,如果 `R.id.textView` 不存在于当前布局文件中,则会导致 `NullPointerException`: ```java TextView textView = findViewById(R.id.textView); textView.setText("Hello World"); // 如果 textView 为 null,则会抛出 NullPointerException ``` ##### (2) 验证对象是否为 `null` 在调用对象的方法之前,始终验证其是否为 `null`。例如: ```java if (textView != null) { textView.setText("Hello World"); } else { Log.e("Error", "TextView is null"); } ``` ##### (3) 处理 `addHeaderView` 和 `setAdapter` 当使用 `ListView` 的 `addHeaderView` 或 `setAdapter` 方法时,确保传入的视图和适配器均已被正确初始化。例如: ```java View headerView = LayoutInflater.from(context).inflate(R.layout.header_view, listView, false); listView.addHeaderView(headerView); MyAdapter adapter = new MyAdapter(dataList); if (adapter != null) { listView.setAdapter(adapter); } else { Log.e("Error", "Adapter is null"); } ``` ##### (4) 检查编译过程中的资源文件 如果问题出现在编译阶段(如 `destinationDir=null`),检查项目中的资源文件路径是否正确。例如,确保 `build.gradle` 文件中的配置无误: ```gradle android { ... buildTypes { release { ... destinationDir = file("path/to/destination") // 确保路径有效 } } } ``` ##### (5) 使用调试工具定位问题 当报错指向字节码文件时,可以通过以下方式定位问题: - 启用调试模式并查看完整的堆栈跟踪信息。 - 使用 Android Studio 的断点调试功能逐步检查变量值。 - 添加日志输出以捕获异常发生前的状态。 #### 3. 示例代码 以下是一个示例代码片段,展示如何避免 `NullPointerException`: ```java public void setupListView(List<String> dataList, ListView listView) { if (dataList == null || dataList.isEmpty()) { Log.w("Warning", "Data list is empty or null"); return; } if (listView == null) { Log.e("Error", "ListView is null"); return; } View headerView = LayoutInflater.from(listView.getContext()).inflate(R.layout.header_view, listView, false); if (headerView != null) { listView.addHeaderView(headerView); } else { Log.e("Error", "Header view is null"); } MyAdapter adapter = new MyAdapter(dataList); if (adapter != null) { listView.setAdapter(adapter); } else { Log.e("Error", "Adapter is null"); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值