关于当Java中没有指针时,为什么Java具有“NullPointerException”?和java没有指针为什么会有空指针异常的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Andro
关于当Java中没有指针时,为什么Java具有“ NullPointerException”?和java没有指针为什么会有空指针异常的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android----java.lang.NullPointerException:---java.lang.NullPointerException:、Hadoop – 线程“main”中的exceptionjava.lang.NullPointerException、Java Array数组错误 Exception in thread "main" java.lang.NullPointerException、Java NullPointerException-如何在Java中有效处理空指针等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- 当Java中没有指针时,为什么Java具有“ NullPointerException”?(java没有指针为什么会有空指针异常)
- Android----java.lang.NullPointerException:---java.lang.NullPointerException:
- Hadoop – 线程“main”中的exceptionjava.lang.NullPointerException
- Java Array数组错误 Exception in thread "main" java.lang.NullPointerException
- Java NullPointerException-如何在Java中有效处理空指针
当Java中没有指针时,为什么Java具有“ NullPointerException”?(java没有指针为什么会有空指针异常)
NullPointerException
如果在Java中没有指针这样的概念,为什么会得到一个异常调用?
答案1
小编典典是的,这是我在学习Java
LOL时学到的第一批烦人的东西之一。正如paxdiablo所提到的,它实际上应该称为NullReferenceException,NoObjectException或DereferenceException。引用甚至不必在内部表示为指针,并且您不必关心。“大多数虚拟机包括Sun的使用句柄,而不是指针。句柄是指向指针的指针,因此谁知道它们是如何使用它的呢?”
哦,微软的Java VM实际上确实使用了指针而不是句柄。
Android----java.lang.NullPointerException:---java.lang.NullPointerException:
2021-03-06 13:26:12.274 8544-8544/com.example.helloworld E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.helloworld,PID: 8544
java.lang.NullPointerException:: Unable to start activity ComponentInfo{com.example.helloworld/com.example.helloworld.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.CheckBox.setonCheckedchangelistener(android.widget.CompoundButton$OnCheckedchangelistener)' on a null object reference
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:3897)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4076)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8349)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.CheckBox.setonCheckedchangelistener(android.widget.CompoundButton$OnCheckedchangelistener)' on a null object reference
at com.example.helloworld.MainActivity.setListener(MainActivity.java:161)
at com.example.helloworld.MainActivity.onCreate(MainActivity.java:138)
at android.app.Activity.performCreate(Activity.java:8085)
at android.app.Activity.performCreate(Activity.java:8073)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1320)
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:3870)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4076)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8349)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
2021-03-06 13:26:12.282 8544-8544/com.example.helloworld I/Process: Sending signal. PID: 8544 SIG: 9
检查一下xml文件定义的checkBox的id和在activity里获取的id是否一致
问题出在运行时找不到对应的checkBox
Process: com.example.helloworld,PID: 21319
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.helloworld/com.example.helloworld.MoreActivity}: java.lang.illegalaccessexception: java.lang.class<com.example.helloworld.MoreActivity> is not accessible from java.lang.class<android.app.AppComponentFactory>
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:3815)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4076)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8349)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
Caused by: java.lang.illegalaccessexception: java.lang.class<com.example.helloworld.MoreActivity> is not accessible from java.lang.class<android.app.AppComponentFactory>
at java.lang.class.newInstance(Native Method)
at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:41)
at android.app.Instrumentation.newActivity(Instrumentation.java:1264)
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:3800)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4076)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8349)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
这是在清单文件没有注册activity
所有的activity类都必须是public 的 不然清单文件找不到,所以就无法运行
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference;
这和问题一是一样的,因为找不到对应的id
博主链接:
页面布局常用:
android:id 为控件指定相应的ID
android:text 指定控件的文本,置尽量使用strings.xml
android:grivity 指定控件的基本位置 ,比如举重,居右,
android:padding 指定控件的内边距,控件当中的内容
android:singleLine 如果设置为真的话,则将控件的内容在同一行当中显示
android:layout_above 将该空间的底部至于给定ID的空间之上
android:layout_below: 将该控件的顶部至于给定ID的控件之下
android:layout_toLeftOf: 将该控件的右边缘和给定ID的控件的左 边缘对其
android:layout_toRightOf 将该控件的左边缘和给定的ID的控件的右边缘对齐
android:layout_alignBaseLine 该控件的baseline和给定ID的控件的Baseline对齐
android:layout_alignBottom 将该控件的底部边缘与给定ID控件的底部边缘
android:layout_alignLeft 将该控件左边缘与给定ID控件的左边缘对齐
android:layout_alignRight 将该控件的右边缘与给定ID控件的右边缘对齐
android:layout_alignTop 将给定控件的顶部边缘与给定ID控件的顶部对齐
android:alignParentBottom 如果该值为true 则将该控件的底部和父控件的底部对齐
android:layout_alignParentLeft 如果该值为true则将该控件的左边与父控件的左边对齐
android:layout_alignParentRight 如果该值为true则将该控件的右边与父控件的右边对齐
android:layout_alignParentTop 将控件的顶部与父控件的顶部对齐
android:layout_centerHorizontal 如果值为真,该控件将被至于水平方向的中央
android:layout_centerInParent 将被至于父控件水平方向和垂直都居中
android:layout_centerVertical 将被至于垂直方向的中央
第一类:属性值为true或false
android:layout_centerHrizontal 水平居中
android:layout_centerVertical 垂直居中
android:layout_centerInparent 相对于父元素完全居中
android:layout_alignParentBottom 贴紧父元素的下边缘
android:layout_alignParentLeft 贴紧父元素的左边缘
android:layout_alignParentRight 贴紧父元素的右边缘
android:layout_alignParentTop 贴紧父元素的上边缘
android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物
第二类:属性值必须为id的引用名“@id/id-name”
android:layout_below 在某元素的下方
android:layout_above 在某元素的的上方
android:layout_toLeftOf 在某元素的左边
android:layout_toRightOf 在某元素的右边
android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐
第三类:属性值为具体的像素值,如30dip,40px
android:layout_marginBottom 离父控件底边缘的距离
android:layout_marginLeft 离父控件左边缘的距离
android:layout_marginRight 离父控件右边缘的距离
android:layout_marginTop 离父控件上边缘的距离
EditText的android:hint
设置EditText为空时输入框内的提示信息。
android:gravity
android:gravity属性是对该view 内容的限定.比如一个button 上面的text. 你可以设置该text 在view的靠左,靠右等位置.以button为例,android:gravity=”right”则button上面的文字靠右
android:layout_gravity
android:layout_gravity是用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,
android:layout_gravity=”right”则button靠右
android:layout_alignParentRight
使当前控件的右端和父控件的右端对齐。这里属性值只能为true或false,默认false。
padding和margin的区别:
所以padding是定义控件自己的内容和控件边缘之间的距离,padding有填充填料的意思,而margin是在说控件的四个边缘之外的距离,指的是和别的控件之间的距离,margin有边缘,页面留白的意思
原文链接:https://blog.csdn.net/qq_28296925/article/details/51115132
Hadoop – 线程“main”中的exceptionjava.lang.NullPointerException
我试图通过本教程使用Apache Hadoop for Windows Platform: http : //www.codeproject.com/Articles/757934/Apache-Hadoop-for-Windows-Platform? fid= 1858035 ,eclipse部分。 一切都很好,直到最后一步。 运行程序时,我得到:log4j:警告没有appender可以发现logging(org.apache.hadoop.metrics2.lib.MutableMetricsFactory)。
log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Exception in thread "main" java.lang.NullPointerException at java.lang.ProcessBuilder.start(UnkNown Source) at org.apache.hadoop.util.Shell.runcommand(Shell.java:445) at org.apache.hadoop.util.Shell.run(Shell.java:418) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:650) at org.apache.hadoop.util.Shell.execCommand(Shell.java:739) at org.apache.hadoop.util.Shell.execCommand(Shell.java:722) at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:631) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:421) at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:277) at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:125) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:348) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1285) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1282) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(UnkNown Source) at org.apache.hadoop.security.UserGroupinformation.doAs(UserGroupinformation.java:1548) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1282) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1303) at Recipe.main(Recipe.java:82)
代码是:
import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericoptionsParser; import com.google.gson.Gson; public class Recipe { public static class TokenizerMapper extends Mapper<Object,Text,IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); Gson gson = new Gson(); public void map(Object key,Text value,Context context ) throws IOException,InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoretokens()) { word.set(itr.nextToken()); context.write(word,one); } Roo roo=gson.fromJson(value.toString(),Roo.class); if(roo.cookTime!=null) { word.set(roo.cookTime); } else { word.set("none"); } context.write(word,one); } } public static class IntSumReducer extends Reducer<Text,IntWritable,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key,Iterable<IntWritable> values,InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key,result); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); @SuppressWarnings("deprecation") Job job = new Job(conf,"Recipe"); job.setJarByClass(Recipe.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setoutputKeyClass(Text.class); job.setoutputValueClass(IntWritable.class); //FileInputFormat.addInputPath(job,new Path(otherArgs[0])); //FileOutputFormat.setoutputPath(job,new Path(otherArgs[1])); FileInputFormat.addInputPath(job,new Path("hdfs://127.0.0.1:9000/in")); FileOutputFormat.setoutputPath(job,new Path("hdfs://127.0.0.1:9000/output")); System.exit(job.waitForCompletion(true) ? 0 : 1); // job.submit(); } } class Id { public String oid; } class Ts { public long date ; } class Roo { public Id _id ; public String name ; public String ingredients ; public String url ; public String image ; public Ts ts ; public String cookTime; public String source ; public String recipeYield ; public String datePublished; public String prepTime ; public String description; }
只有当我尝试通过Eclipse运行时才会发生这种情况。 通过CMD它很好:
javac -classpath C:hadoop-2.3sharehadoopcommonhadoop-common-2.3.0.jar;C:hadoop-2.3sharehadoopcommonlibgson-2.2.4.jar;C:hadoop-2.3sharehadoopcommonlibcommons-cli-1.2.jar;C:hadoop-2.3sharehadoopmapreducehadoop-mapreduce-client-core-2.3.0.jar;Recipe.java jar -cvf Recipe.jar *.class hadoop jar c:HworkRecipe.jar Recipe /in /out
任何想法我怎么能解决这个问题?
不能在NDK标签
Eclipse符号的问题§
通过Windows桌面快捷方式运行Eclipse JVM参数
将Eclipse安装移到用户configuration文件之外的文件夹中?
执行MVN安装时出现未知主机错误
让工作区可以点击以在其上启动Eclipse?
Eclipse问题不断打开旧版本/副本的文件
有谁知道如何configurationeclipse不要复制字体的颜色/背景做CTRL-C
在Hadoop环境中configurationEclipse(在Windows上)(在具有SUSE Linux Enterprise Server 11的VM上)
javaw.exe进程在Windows 64消耗更多的内存?
我从这里http://qnalist.com/questions/4994960/run-spark-unit-test-on-windows-7修复它有同样的问题和解决方法。
解决方法是:
从https://codeload.github.com/srccodes/hadoop-common-2.2.0-bin/zip/master下载编译好的winutils.exe
直接将这个存档提取到d:winutil , d:winutilbin应该被创建
添加System.setProperty("hadoop.home.dir","d:\winutil\"); 在实例化Job之前将代码添加到代码中(例如,作为main方法的第一行)
总结
以上是小编为你收集整理的Hadoop – 线程“main”中的exceptionjava.lang.NullPointerException全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
Java Array数组错误 Exception in thread "main" java.lang.NullPointerException
Array数组必须指定length
比如,
public class test{
private String name;
private String pwd;
private String[] account=new String[3];
public test(String a, String b,String c,String d,String f){
name=a;
pwd=b;
account[0]=c;
account[1]=d;
account[2]=f;
//这地方不报空指针才怪
account[3]=f;
}
public static void main(String[] args){
test newTest = new test("1","2","2","2","2");
System.out.print(newTest.account[0]);
}
}
Java NullPointerException-如何在Java中有效处理空指针
Java NullPointerException是未经检查的异常,并且进行了扩展RuntimeException
。NullPointerException不会强制我们使用catch块来处理它。
1.为什么在代码中出现NullPointerException
NullPointerException是代码中您尝试访问/修改尚未初始化的对象的情况。从本质上讲,它意味着对象引用变量没有指向任何地方,并且不指向任何内容或为“ null ”。一个抛出空指针异常的示例Java程序。
package
com.howtodoinjava.demo.npe;
public
class
SampleNPE
{
public
static
void
main(String[] args)
{
String s =
null
;
System.out.println( s.toString() );
// ''s'' is un-initialized and is null
}
}
|
2. Java NullPointerException通常发生的常见位置
好吧,由于各种原因,NullPointerException可能会出现在代码中的任何位置,但是我根据自己的经验准备了最常出现的地点清单。
- 在未初始化的对象上调用方法
- 方法中传递的参数是
null
- 调用
toString()
对象的方法是null
- 在
if
不检查null
相等性的情况下比较块中的对象属性 - 对于像Spring这样的依赖注入的框架来说,配置不正确
synchronized
在一个对象上使用null
- 链接的语句,即单个语句中的多个方法调用
这不是详尽的清单。还有其他几个地方和原因。如果您还可以回忆起其他任何内容,请发表评论。它也会帮助其他人(初学者)。
3.避免Java NullPointerException的最佳方法
3.1。三元运算符
如果不为null,则此运算符将得出左侧的值,否则将评估右侧。它具有如下语法:
布尔表达式?value1:value2;
如果expression计算为true,则整个表达式将返回value1,否则返回value2。它更像if-else构造,但是更有效和更具表现力。为了防止NullPointerException(NPE),请像以下代码一样使用此运算符:
字符串str =(参数==空)“ NA”:参数;
3.2。使用Apache Commons StringUtils进行字符串操作
Apache commons lang是用于各种操作之王的几个实用程序类的集合。其中之一是StringUtils.java。使用StringUtils.isNotEmpty()验证作为参数传递的字符串是否为空或空字符串。如果不为null或为空;然后进一步使用它。
其他类似的方法是StringUtils。IsEmpty()和StringUtils.equals()。他们在javadocs中声称,如果StringUtils.isNotBlank()抛出NPE,则API中存在错误。
if
(StringUtils.isNotEmpty(obj.getvalue())){
String s = obj.getvalue();
....
}
3.3。很早检查方法参数是否为空
您应该始终将输入验证置于方法的开头,以使其余代码不必处理输入错误的可能性。因此,如果有人传递空值,那么事情将在堆栈中早点破裂,而不是在较深的位置(根本问题很难识别)中破裂。
在大多数情况下,针对快速故障行为是一个不错的选择。
3.4。考虑原始而不是对象
当对象引用指向无内容时,将发生空问题。因此,尽可能多地使用原语始终是安全的,因为它们不会受到空引用的影响。所有原语都必须附加一些默认值,因此请当心。
3.5。仔细考虑链接方法调用
虽然链式语句很容易在代码中查看,但它们不是NPE友好的。一条分散在多行中的语句将为您提供堆栈跟踪中第一行的行号,无论它出现在何处。
ref.method1().method2().method3().methods4();
这种链式语句将仅打印“ 行号xyz中发生了NullPointerException”。调试这样的代码确实很难。避免此类呼叫。
3.6。使用String.valueOf()而不是toString()
如果必须打印任何对象的字符串表示形式,请不要使用object.toString()。这是NPE的非常软的目标。而是使用String.valueOf(object)。
即使object在第二种方法中为null,它也不会给出异常,并且将输出null来输出流。
3.7。避免从方法中返回null
避免NPE的一个很棒的技巧是返回空字符串或空集合,而不是返回null。在您的应用程序中一致地执行此操作。您会注意到,如果这样做,则不需要进行大量的空检查。
例如:
List<string> data =
null
;
@SuppressWarnings
(
"unchecked"
)
public
List getDataDemo()
{
if
(data ==
null
)
return
Collections.EMPTY_LIST;
//Returns unmodifiable list
return
data;
}
使用上述方法的用户即使错过了空检查,也不会看到难看的NPE。
3.8。不鼓励传递空参数
我已经看到一些方法声明,其中方法需要两个或多个参数。如果参数之一作为null传递,则方法以某种不同的方式起作用。避免这种情况。
相反,您应该定义两种方法;一个带有单个参数,第二个带有两个参数。强制传递参数。当您在方法内部编写应用程序逻辑时,这很有帮助,因为您可以确保方法参数不会为null。因此,您不会放置不必要的假设和断言。
3.9。在“安全”非空字符串上调用String.equals(String)
代替在下面的代码中编写字符串比较
public
class
SampleNPE {
public
void
demoEqualData(String param) {
if
(param.equals(
"check me"
)) {
// some code
}
}
}
像这样写上面的代码。即使参数作为null传递,这也不会在NPE中引起。
public
class
SampleNPE {
public
void
demoEqualData(String param) {
if
(
"check me"
.equals(param))
// Do like this
{
// some code
}
}
}
4.可用的NullPointerException安全操作
4.1。运算符实例
instanceof运算符是NPE安全的。因此,instanceof null总是返回false。它不会导致NullPointerException。如果您记住这一事实,则可以消除混乱的条件代码。
// Unnecessary code
if
(data !=
null
&& data
instanceof
InterestingData) {
}
// Less code. Better!!
if
(data
instanceof
InterestingData) {
}
4.2。访问类的静态成员
如果您要处理静态变量或静态方法,则即使您的引用变量指向null,也不会得到null指针异常,因为静态变量和方法调用是在编译时根据类名绑定的,并且与对象无关
MyObject obj =
null
;
String attrib = obj.staticAttribute;
//no NullPointerException because staticAttribute is static variable defined in class MyObject
5.如果必须在某些地方允许NullPointerException怎么办
Joshua bloch在有效的Java中说:“可以说,所有错误的方法调用都可以归结为非法论点或非法状态,但是其他例外通常用于某些种类的非法论据和状态。如果调用者在某个参数中传递了null,而该参数禁止使用null值,则约定NullPointerException
将抛出而不是IllegalArgumentException
。
因此,如果必须NullPointerException
在代码的某些地方允许使用,则请确保使它们比通常具有更多的信息性。看下面的例子:
package
com.howtodoinjava.demo.npe;
public
class
SampleNPE {
public
static
void
main(String[] args) {
// call one method at a time
doSomething(
null
);
doSomethingElse(
null
);
}
private
static
String doSomething(
final
String param) {
System.out.println(param.toString());
return
"I am done !!"
;
}
private
static
String doSomethingElse(
final
String param) {
if
(param ==
null
) {
throw
new
NullPointerException(
" :: Parameter ''param'' was null inside method ''doSomething''."
);
}
System.out.println(param.toString());
return
"I am done !!"
;
}
}
这两个方法调用的输出是这样的:
Exception in thread
"main"
java.lang.NullPointerException
at com.howtodoinjava.demo.npe.SampleNPE.doSomething(SampleNPE.java:
14
)
at com.howtodoinjava.demo.npe.SampleNPE.main(SampleNPE.java:
8
)
Exception in thread
"main"
java.lang.NullPointerException: :: Parameter
''param''
was
null
inside method
''doSomething''
.
at com.howtodoinjava.demo.npe.SampleNPE.doSomethingElse(SampleNPE.java:
21
)
at com.howtodoinjava.demo.npe.SampleNPE.main(SampleNPE.java:
8
)
显然,第二个堆栈跟踪更有用,并且使调试容易。
关于当Java中没有指针时,为什么Java具有“ NullPointerException”?和java没有指针为什么会有空指针异常的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Android----java.lang.NullPointerException:---java.lang.NullPointerException:、Hadoop – 线程“main”中的exceptionjava.lang.NullPointerException、Java Array数组错误 Exception in thread "main" java.lang.NullPointerException、Java NullPointerException-如何在Java中有效处理空指针的相关信息,请在本站寻找。
本文标签: