GVKun编程网logo

java.lang.NullPointerException - 如何处理空指针异常(java中的空指针异常一般怎么处理)

21

如果您对java.lang.NullPointerException-如何处理空指针异常和java中的空指针异常一般怎么处理感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解java.lang.N

如果您对java.lang.NullPointerException - 如何处理空指针异常java中的空指针异常一般怎么处理感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解java.lang.NullPointerException - 如何处理空指针异常的各种细节,并对java中的空指针异常一般怎么处理进行深入的分析,此外还有关于Android----java.lang.NullPointerException:---java.lang.NullPointerException:、C3P0 的 Exception in thread "Timer-6" java.lang.NullPointerException 如何解决、Exception in thread "main" java.lang.NullPointerException、Exception in thread "main" java.lang.NullPointerException到底哪里是空指向了啊?的实用技巧。

本文目录一览:

java.lang.NullPointerException - 如何处理空指针异常(java中的空指针异常一般怎么处理)

java.lang.NullPointerException - 如何处理空指针异常(java中的空指针异常一般怎么处理)

当应用程序试图null在需要对象的情况下使用时抛出。这些包括:

调用null对象的实例方法。
访问或修改null对象的字段。
把长度null当作一个数组。
像访问或修改null阵列一样访问或修改插槽。
投掷null就好像它是一个Throwable 价值。
应用程序应该抛出此类的实例来指示null对象的其他非法使用。 
NullPointerException对象可以由虚拟机构造,就像抑制被禁用和/或堆栈跟踪不可写一样。

为什么我们需要空值?

如前所述,nullJava是一种特殊的值。
它在编码某些设计模式(如空对象模式和单例模式)时非常有用。
空对象模式提供了一个对象作为缺少给定类型对象的代理。
Singleton模式确保只创建一个类的一个实例,并且旨在提供对象的全局访问点。

例如,最多创建一个类实例的示例方法是将其所有构造函数声明为private,然后创建一个返回该类的唯一实例的公共方法:

TestSingleton.java:

import java.util.UUID;

class Singleton {

     private static Singleton single = null;
     private String ID = null;

     private Singleton() {
          /* Make it private, in order to prevent the creation of new instances of
           * the Singleton class. */

          ID = UUID.randomUUID().toString(); // Create a random ID.
     }

     public static Singleton getInstance() {
          if (single == null)
               single = new Singleton();

          return single;
     }

     public String getID() {
          return this.ID;
     }
}

public class TestSingleton {
     public static void main(String[] args) {
          Singleton s = Singleton.getInstance();
          System.out.println(s.getID());
     }
}

在这个例子中,我们声明了一个Singleton类的静态实例。该实例在该getInstance方法内最多初始化一次。注意使用null启用唯一实例创建的值。

如何避免NullPointerException

为了避免这种情况NullPointerException,请确保在使用它们之前,所有对象都已正确初始化。注意,当你声明一个引用变量时,你真的创建了一个指向对象的指针。在向对象请求方法或字段之前,您必须验证指针是否为空。

另外,如果引发异常,请使用驻留在异常堆栈跟踪中的信息。执行的堆栈跟踪由JVM提供,以启用应用程序的调试。找到捕获异常的方法和行,然后确定哪个引用等于在特定行中为null。

在本节的其余部分中,我们将介绍一些处理上述例外的技术。但是,它们并没有消除这个问题,程序员在编写应用程序时应该小心。

1.字符串与文字的比较 
应用程序执行代码中的一个非常常见的情况涉及字符串变量和文字之间的比较。文字可以是一个字符串或Enum的元素。不要从空对象调用方法,而应考虑从文字中调用它。例如,观察以下情况:

String str = null;
if(str.equals(“Test”)){
     / *这里的代码将不会被触发,因为会抛出异常。* /
}

上面的代码片段会抛出一个NullPointerException。但是,如果我们从文字中调用方法,那么执行流程通常会继续:

String str = null;
if(“Test”.equals(str)){
     / *正确的用例。不会抛出异常。* /
}

2.检查方法的参数 
在执行你自己的方法的主体之前,一定要检查它的参数为空值。只有在正确检查了参数后,才继续执行该方法。否则,您可以抛出一个IllegalArgumentException并通知调用方法传递的参数有问题。

例如:

public static int getLength(String s){
     如果(s == null)
          抛出新的IllegalArgumentException(“参数不能为空”);

     return s.length();
}

3.优先使用String.valueOf()方法代替toString() 
当您的应用程序代码需要对象的字符串表示形式时,请避免使用该对象的toString方法。如果你的对象的引用等于null,NullPointerException则会抛出a。

相反,考虑使用静态String.valueOf方法,该方法不会抛出任何异常并打印”null”,以防函数的参数等于null。

4.使用三元运算符 
该ternary操作是非常有用的,可以帮助我们避免了NullPointerException。运营商的形式是:

布尔表达式?value1:value2;

首先,评估布尔表达式。如果表达式为true,则返回value1,否则返回value2。我们可以使用ternary运算符来处理空指针,如下所示:

String message =(str == null)?"":str.substring(0,10);

如果str引用为空,则消息变量将为空。否则,如果str指向实际数据,则消息将检索它的前10个字符。

5.创建返回空集合而不是null的方法 
一个非常好的技术是创建返回一个空集合的方法,而不是一个null值。你的应用程序的代码可以遍历空集合并使用它的方法和字段,而不会抛出一个NullPointerException。例如:

Example.java

public class Example {
     private static List<Integer> numbers = null;

     public static List<Integer> getList() {
          if (numbers == null)
               return Collections.emptyList();
          else
               return numbers;
     }
}

6.使用Apache的StringUtils类 
Apache的Commons Lang是一个为java.langAPI 提供帮助工具的库,比如字符串操作方法。提供字符串操作的示例类是StringUtils.java,它null静静地处理输入字符串。

你可以使用StringUtils.isNotEmpty, StringUtils.IsEmpty和StringUtils.equals方法,以避免NullPointerException。例如:

if(StringUtils.isNotEmpty(str)){ 
     System.out.println(str.toString()); 
}

7.使用contains(),containsKey(),containsValue()方法 
如果您的应用程序代码使用集合,例如Maps考虑使用包含containsKey和containsValue方法。例如,在地图中验证其存在之后,检索特定键的值:

Map <String,String> map = ... 
... 
String key = ... 
String value = map.get(key); 
的System.out.println(value.toString()); //如果值为null,则会抛出异常。

在上面的代码片段中,我们不检查密钥是否真的存在于内部Map,因此返回的值可以是null。最安全的方法如下:

Map <String,String> map = ... 
... 
String key = ... 
if(map.containsKey(key)){ 
     String value = map.get(key); 
     的System.out.println(value.toString()); //不会抛出异常。
}

8.检查外部方法的返回值 
在实践中使用外部库是很常见的。这些库包含返回引用的方法。确保返回的参考不是null。另外,请考虑阅读该方法的Javadoc,以便更好地理解其功能和返回值。

9.使用断言 
断言在测试代码时非常有用,并且可以被使用,以避免执行代码片断,从而导致错误NullPointerException。Java断言是用assert关键字实现的,并抛出一个AssertionError。

请注意,您必须显式启用JVM的断言标志,方法是使用–ea参数执行该标志。否则,断言将被完全忽略。

使用Java断言的示例示例如下:

public static int getLength(String s){ 
     / *确保String不为null。* / 
     assert(s!= null); 

     return s.length(); 
}

如果您执行上面的代码段并传递一个空参数getLength,则会出现以下错误消息:

Exception in thread "main" java.lang.AssertionError

最后,您可以使用测试框架Assert提供的类jUnit。

10.单元测试 
在测试代​​码的功能和正确性时,单元测试可能非常有用。花一些时间编写一些测试用例,验证NullPointerException应用程序的代码是否经历了特定的执行流程,否则将引发no 。

现有的NullPointerException安全方法

1.访问类的静态成员或方法 
当你的代码试图访问静态变量或类的方法时,即使对象的引用等于null,JVM也不会抛出一个NullPointerException。这是由于Java编译器在编译过程中将静态方法和字段存储在特殊位置。因此,静态字段和方法不与对象相关联,而与类的名称相关联。

例如,下面的代码不会抛出NullPointerException:

TestStatic.java:

class SampleClass { 

     public static void printMessage(){ 
          System.out.println(“Hello Java Geeks!”); 
     } 
} 

public class TestStatic { 
     public static void main(String [] args){ 
          SampleClass sc = null; 
          sc.printMessage(); 
     } 
}

注意,尽管SampleClass等于的实例null将会被正确执行。但是,对于静态方法或字段,最好以静态方式访问它们,比如SampleClass.printMessage()。

2.运营商的instanceof 
instanceof即使对象的引用等于,也可以使用该运算符null。在instanceof操作时,参考值等于为null,不抛出一个返回false NullPointerException。例如,考虑下面的代码片段:

String str = null;
if(str instanceof String)
     System.out.println("It''s an instance of the String class!");
else
     System.out.println("Not an instance of the String class!");

正如预期的那样,执行的结果是:

Not an instance of the String class!

这是一篇关于如何处理Java的教程NullPointerException。

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

 

C3P0 的 Exception in thread

C3P0 的 Exception in thread "Timer-6" java.lang.NullPointerException 如何解决

高春辉、王春生、朱峰:关于开源创业的 15 件小事

这个问题如何解决  经常在 debug 项目的时候进入的了短点  很烦很烦  
[DEBUG]Exception in thread "Timer-6" java.lang.NullPointerException
at com.mchange.v2.log.log4j.Log4jMLog$Log4jMLogger.isLoggable(Log4jMLog.java:255)
at com.mchange.v2.resourcepool.BasicResourcePool$CullTask.run(BasicResourcePool.java:1934)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)

Exception in thread

Exception in thread "main" java.lang.NullPointerException

/**
 * 功能:约瑟夫问题
 */
package com.sole;


public class Demo04{


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CycLink cyclink = new CycLink();

cyclink.setLen(5);
cyclink.createLink();
cyclink.showList();
}


}


class Child{
int num;
Child nextChild = null;

public Child( int num ){
this.num = num;
}
}


//环形链表
class CycLink{
//先定义一个指向链表第一个小孩的引用,不能动
Child firstChild = null;
Child temp = null;
int len = 0; //表示有几个小孩

//设置链表大小
public void setLen( int len ){
this.len = len;
}

//初始化环形链表
public void createLink(){
for(  int i =0; i<=len; i++ ){
if( i == 1 ){
//创建第一个小孩
Child ch = new Child( i );
this.firstChild = ch;
this.temp = ch;
}else {

if( i == len ){
Child ch = new Child( i );
temp.nextChild = ch;
temp = ch;
temp.nextChild = this.firstChild;
}else{
//继续创建小孩
Child ch = new Child( i );
temp.nextChild = ch;
temp = ch;
}
}
}
}


//打印环形链表
public void showList(){
Child temp = this.firstChild;
do{
System.out.println( temp.num );
temp = temp.nextChild;
}while( temp != this.firstChild );
}


}

总是出现这个错误,找不出来,请高手帮忙指点

Exception in thread

Exception in thread "main" java.lang.NullPointerException到底哪里是空指向了啊?

  1. import java.util.*;
  2. class Word{
  3. private String enWord;
  4. private LinkedList<String> chParaphrase=new LinkedList<String>();
  5. public Word(String enWord){
  6. this.enWord=enWord;
  7. }
  8. public String getWord(){
  9. return enWord;
  10. }
  11. public void setParaphrase(String paraphrase){
  12. chParaphrase.add(paraphrase);
  13. }
  14. public String getParaphrase(){
  15. String retParaphrase="";
  16. Iterator<String> it=chParaphrase.iterator();
  17. while(it.hasNext()){
  18. retParaphrase+=it.next();
  19. retParaphrase+="\r\n";
  20. }
  21. return retParaphrase;
  22. }
  23. }
  24. class En2ChDict{
  25. Word[] word=new Word[5];
  26. HashMap<String,Word> hm=new HashMap<String,Word>();
  27. public En2ChDict(){
  28. word[0]=new Word("good");
  29. word[0].setParaphrase("n.善行,好处");
  30. word[0].setParaphrase("a.好的,优良的,上等的");
  31. word[0].setParaphrase("[p1].商品");
  32. word[1]=new Word("bad");
  33. word[1].setParaphrase("a.坏的");
  34. for(int i=0;i<word.length;i++){
  35. hm.put(word[i].getWord().toLowerCase(),word[i]);
  36. }
  37. }
  38. public String queryWord(String enWord){
  39. Word word=hm.get(enWord.toLowerCase());
  40. String chParaphrase;
  41. if(word!=null){
  42. chParaphrase=word.getParaphrase();
  43. }else{
  44. chParaphrase="未找到该单词!\r\n";
  45. }
  46. return chParaphrase;
  47. }
  48. }
  49. public class TestWord{
  50. public static void main(String args[])throws Exception{
  51. En2ChDict ecd=new En2ChDict();
  52. String enWord;
  53. while(true){
  54. enWord=new Scanner(System.in).next();
  55. if(enWord.equals("-1")){
  56. break;
  57. }
  58. System.out.println(ecd.queryWord(enWord));
  59. }
  60. }
  61. }
  62. 执行的时候提示:
  63. Exception in thread "main" java.lang.NullPointerException
  64.         at En2ChDict.<init>(TestWord.java:38)
  65.         at TestWord.main(TestWord.java:56)

今天的关于java.lang.NullPointerException - 如何处理空指针异常java中的空指针异常一般怎么处理的分享已经结束,谢谢您的关注,如果想了解更多关于Android----java.lang.NullPointerException:---java.lang.NullPointerException:、C3P0 的 Exception in thread "Timer-6" java.lang.NullPointerException 如何解决、Exception in thread "main" java.lang.NullPointerException、Exception in thread "main" java.lang.NullPointerException到底哪里是空指向了啊?的相关知识,请在本站进行查询。

本文标签: