GVKun编程网logo

当Java中没有指针时,为什么Java具有“ NullPointerException”?(java没有指针为什么会有空指针异常)

7

关于当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没有指针为什么会有空指针异常)

当Java中没有指针时,为什么Java具有“ NullPointerException”?(java没有指针为什么会有空指针异常)

NullPointerException如果在Java中没有指针这样的概念,为什么会得到一个异常调用?

答案1

小编典典

是的,这是我在学习Java
LOL时学到的第一批烦人的东西之一。正如paxdiablo所提到的,它实际上应该称为NullReferenceException,NoObjectException或DereferenceException。引用甚至不必在内部表示为指针,并且您不必关心。“大多数虚拟机包括Sun的使用句柄,而不是指针。句柄是指向指针的指针,因此谁知道它们是如何使用它的呢?”
哦,微软的Java VM实际上确实使用了指针而不是句柄。

Android----java.lang.NullPointerException:---java.lang.NullPointerException:

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

博主链接:https://blog.csdn.net/qq_42618969/article/details/81141895

 

 

 

 

页面布局常用:

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

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修复它有同样的问题和解决方法&#x3002;

解决方法是:

从https://codeload.github.com/srccodes/hadoop-common-2.2.0-bin/zip/master下载编译好&#x7684;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

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-如何在Java中有效处理空指针

Java NullPointerException是未经检查的异常,并且进行了扩展RuntimeExceptionNullPointerException不会强制我们使用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可能会出现在代码中的任何位置,但是我根据自己的经验准备了最常出现的地点清单。

  1. 在未初始化的对象上调用方法
  2. 方法中传递的参数是 null
  3. 调用toString()对象的方法是null
  4. if不检查null相等性的情况下比较块中的对象属性
  5. 对于像Spring这样的依赖注入的框架来说,配置不正确
  6. synchronized在一个对象上使用null
  7. 链接的语句,即单个语句中的多个方法调用

这不是详尽的清单。还有其他几个地方和原因。如果您还可以回忆起其他任何内容,请发表评论。它也会帮助其他人(初学者)。

 

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 &amp;&amp; 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中有效处理空指针的相关信息,请在本站寻找。

本文标签: