精华内容
下载资源
问答
  • java.lang.NullPointerException出现的几种原因以及解决

    万次阅读 多人点赞 2019-07-03 21:18:40
    java.lang.NullPointerException出现的几种原因: 1、字符串变量未初始化 2、接口类型的对象没有用具体的类初始化,比如: Map map // 会报错 Map map = new Map(); //则不会报错了 3、当一个对象的值为空时,...

    java.lang.NullPointerException出现的几种原因:

    1、字符串变量未初始化
    2、接口类型的对象没有用具体的类初始化,比如:
    Map map // 会报错
    Map map = new Map(); //则不会报错了
    3、当一个对象的值为空时,你没有判断为空的情况。
    4、字符串与文字的比较,文字可以是一个字符串或Enum的元素,如下会出现异常
    String str = null;
    if(str.equals(“Test”)){
    //这里的代码将不会被触发,因为会抛出java.lang.NullPointerException异常。
    }
    5、优先使用String.valueOf()方法代替toString()
    当程序代码需要对象的字符串表示形式时,请避免使用该对象的toString方法。如果你的对象的引用等于null,NullPointerException则会抛出,使用静态String.valueOf方法,该方法不会抛出任何异常并打印"null"
    6、class被声明了类型, 默认 class = null; 这样在调用class中方法的时候系统只能给你个空指针异常, 给其实例化就好了:class = new Class();
    7、返回null,方法的返回值不要定义成为一般的类型,而是用数组。这样如果想要返回null的时候就能避免许多不必要的NullPointerException

    在这里插入图片描述
    总之,NullPointerException由RuntimeException派生出来,是一个运行时异常。其意指可能会在运行的时候才会被抛出,一个变量是null,及只有其名,没有实值内容,也没分配内存,当你要去取他的长度,对他进行操作就会出现NullPointException,所以声明变量时最好给它分配好内存空间,给予赋值,例如拿该变量与一个值比较时,要么先做好该异常的处理要么给它进行判断先: if (str !=null && str “”){ …}
    判断一个String的实例s是否等于“a”时,不要写成s.equals(“a”),这样容易抛NullPointerException,而写成"a".equals(s)就可以避免这个问题,不过对变量先进行判空后再进行操作更好,尽量避免返回null,方法的返回值不要定义成为一般的类型,用数组。这样如果想要返回null的时候,就返回一个没有元素的数组。就能避免许多不必要的NullPointerException

    下图为异常分布图:
    在这里插入图片描述

    展开全文
  • java.lang.OutOfMemoryError:GC overhead limit exceeded

    万次阅读 多人点赞 2017-09-11 16:36:20
    简单来说,java.lang.OutOfMemoryError: GC overhead limit exceeded发生的原因是,当前已经没有可用内存,经过多次GC之后仍然没能有效释放内存。

    java.lang.OutOfMemoryError这个错误是比较经典的错误了,经过JDK不断的迭代,服务器硬件的不断升级。。。总之,社会在发展,时代在进步。很多错误已经消失在时代的浪潮中。我也是很久没有见过这个错误了,以至于都以为在Java的世界中不会再碰到这个错误。结果,就在最疏忽的时候碰到了TA,真是,心中一万只神兽奔袭而过,狠狠的践踏了我这颗上了年纪的心脏啊。

    吐槽完毕,言归正传。

    Java刚刚出现的年代,有一个相比于其他语言的优势就是,内存回收机制。不需要明确的调用释放内存的API,java就自动完成,这个过程就是Garbage Collection,简称GC。这对以懒著称的程序猿们来说,绝对是重大利好。但是,凡事有利必有弊,可以肯定的是,Java语言是人创造的,GC也是人编写的代码,绝对不是机器自动完成的。也就是说,GC的过程是另外一群程序猿根据可能出现的情况,预设了GC条件,把符合回收条件的内存空间释放出来。一旦被占用的内存空间不符合释放的条件,GC没办法清理,那就会适时出现java.lang.OutOfMemoryError。这个错误就是提醒我们这群程序猿,写GC程序的程序猿不知道这种情况怎么处理,为了安全也不便处理,谁使用Java就自己看着解决吧。

    说起来,java.lang.OutOfMemoryError有几种分类的,这次碰到的是java.lang.OutOfMemoryError: GC overhead limit exceeded,下面就来说说这种类型的内存溢出。

    简单来说,java.lang.OutOfMemoryError: GC overhead limit exceeded发生的原因是,当前已经没有可用内存,经过多次GC之后仍然没能有效释放内存。

    1. 原因

    众所周知,JVM的GC过程会因为STW,只不过停顿短到不容易感知。当引起停顿时间的98%都是在进行GC,但是结果只能得到小于2%的堆内存恢复时,就会抛出java.lang.OutOfMemoryError: GC overhead limit exceeded这个错误。Plumbr给出一个示意图:

    java.lang.OutOfMemoryError: GC overhead limit exceeded

    这个错误其实就是空闲内存与GC之间平衡的一个限制,当经过几次GC之后,只有少于2%的内存被释放,也就是很少的空闲内存,可能会再次被快速填充,这样就会触发再一次的GC。这就是一个恶性循环了,CPU大部分的时间在做GC操作,没有时间做具体的业务操作,可能几毫秒的任务需要几分钟都无法完成,整个应用程序就形同虚设了。

    2. 示例

    Plumbr上找的一个例子,这里直接给出。

    class Wrapper {
      public static void main(String args[]) throws Exception {
        Map map = System.getProperties();
        Random r = new Random();
        while (true) {
          map.put(r.nextInt(), "value");
        }
      }
    }
    

    然后设定堆内存是100m,比如java -Xmx100m -XX:+UseParallelGC Wrapper。不同的系统环境可能需要设置不同的堆内存大小,否则会产生不同的OOM错误。其实也算是好理解,因为java.lang.OutOfMemoryError: GC overhead limit exceeded需要有两个条件:98%的时间和2%的内存。如果这两个条件有一个没有达到,结果Map对象扩容,那就可能出现java.lang.OutOfMemoryError: Java heap space这个错误。

    3. 解决方法

    3.1 JVM参数

    JVM给出一个参数避免这个错误:-XX:-UseGCOverheadLimit

    但是,这个参数并不是解决了内存不足的问题,只是将错误发生时间延后,并且替换成java.lang.OutOfMemoryError: Java heap space

    3.2 堆内存

    还有一个偷懒的方法是:增大堆内存。既然堆内存少了,那就增加堆内存即可。

    但是,这个方法也不是万能的。因为程序里可能有内存泄露。这个时候即使再增大堆内存,也会有用完的时候。

    所以前两个方法都只是治标不治本而已。

    3.3 终极方法

    其实还是有一个终极方法的,而且是治标治本的方法,就是找到占用内存大的地方,把代码优化了,就不会出现这个问题了。

    怎么找到需要优化的代码呢?就是通过heap dump生产jvm快照,通过分析快照找到占用内存大的对象,从而找到代码位置。

    通过设置-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump参数来生产快照,然后通过VisualVM或者MAT等工具分析快照内容进行定位。通过这个参数是将发生OOM时的堆内存所有信息写入快照文件,也就是说,如果此时堆内存中有敏感信息的话,那就可能造成信息泄漏了。


    个人主页: http://www.howardliu.cn

    个人博文: java.lang.OutOfMemoryError:GC overhead limit exceeded

    CSDN主页: http://blog.csdn.net/liuxinghao

    CSDN博文: java.lang.OutOfMemoryError:GC overhead limit exceeded

    展开全文
  • import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.web.bind.WebDataBinder; import org.spring...

    关注微信公众号“假装正经的程序员”,回复“日期转换”即可获取解决方案

    发生这一错误的主要原因是Controller类中需要接收的是Date类型,但是在页面端传过来的是String类型,最终导致了这个错误。

    这里提供两种解决方案,一种是局部转换,一种是全局转换。

    <form action="login.do" method="post">
    		<input type="text" name="birthday" value="2017-07-12 22:04:00">
    		<input type="submit" value="提交">
    	</form>


    一.局部转换

    @Controller
    public class UserController{
    	
    	@RequestMapping(value="/login.do")
    	public String login(String username,Date birthday){
    		System.out.println("________");
    		return "";
    	}
    
            //只需要加上下面这段即可,注意不能忘记注解
    	@InitBinder
    	public void initBinder(WebDataBinder binder, WebRequest request) {
    		
    		//转换日期
    		DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    		binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));// CustomDateEditor为自定义日期编辑器
    	}
    }


    二.全局转换

    1.创建CustomDate类实现WebBindingInitializer

    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import org.springframework.beans.propertyeditors.CustomDateEditor;
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.support.WebBindingInitializer;
    import org.springframework.web.context.request.WebRequest;
    
    /**
     * @作者:JackHisen(GWD)
     * @项目名:shoppingmall
     * @时间:2017-7-12 下午10:39:10
     * @version 1.0
     */
    public class CustomDate implements WebBindingInitializer{
    
    	@Override
    	public void initBinder(WebDataBinder binder, WebRequest request) {
    		// TODO Auto-generated method stub
    		//转换日期
    		DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    		binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
    	}
    }


    2.在Spring-MVC.xml中配置日期转换

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    	<context:component-scan base-package="com.gwd.shopping" use-default-filters="false">
    		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    	</context:component-scan>
    	
    	<!-- 日期转换 -->
    	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    		<property name="webBindingInitializer">
    			<bean class="com.gwd.shopping.core.web.CustomDate"/>
    		</property>
    	</bean>
    	
    	<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    		<property name="prefix" value="/WEB-INF/back_page/"/>
    		<property name="suffix" value=".jsp"/>
    	</bean>
    </beans>

    展开全文
  • java.lang.UnsupportedOperationException解决方法

    万次阅读 多人点赞 2018-11-03 17:00:09
    在项目中对List进行操作时报错java.lang.UnsupportedOperationException,后来发现操作的List是由数组转换而成的,通过看源码发现问题,并写测试程序如下。 代码块: public class ListTest { public static void...

    在项目中对List进行操作时报错java.lang.UnsupportedOperationException,后来发现操作的List是由数组转换而成的,通过看源码发现问题,并写测试程序如下。 
    代码块:

    public class ListTest {
        public static void main(String[] args) {
            String[] array = {"1","2","3","4","5"};
            List<String> list = Arrays.asList(array);
            list.add("6");
        }
    }

    执行结果:

    Exception in thread "main" java.lang.UnsupportedOperationException
        at java.util.AbstractList.add(AbstractList.java:148)
        at java.util.AbstractList.add(AbstractList.java:108)
        at com.atguigu.test.ListTest.main(ListTest.java:11)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

    发生问题的原因如下: 
    调用Arrays.asList()生产的List的add、remove方法时报异常,这是由Arrays.asList() 返回的是Arrays的内部类ArrayList, 而不是java.util.ArrayList。Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,remove、add等方法AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。java.util.ArrayList重新了这些方法而Arrays的内部类ArrayList没有重新,所以会抛出异常。解决方法如下:

    public class ListTest {
        public static void main(String[] args) {
            String[] array = {"1","2","3","4","5"};
            List<String> list = Arrays.asList(array);
            List arrList = new ArrayList(list);
            arrList.add("6");
        }
    }

     


    Arrays源码:

       public static <T> List<T> asList(T... a) {
            return new ArrayList<>(a);
        }
    
        /**
         * @serial include
         */
        private static class ArrayList<E> extends AbstractList<E>
            implements RandomAccess, java.io.Serializable
        {
            private static final long serialVersionUID = -2764017481108945198L;
            private final E[] a;
    
            ArrayList(E[] array) {
                a = Objects.requireNonNull(array);
            }
    
            @Override
            public int size() {
                return a.length;
            }
    
            @Override
            public Object[] toArray() {
                return a.clone();
            }
    
            @Override
            @SuppressWarnings("unchecked")
            public <T> T[] toArray(T[] a) {
                int size = size();
                if (a.length < size)
                    return Arrays.copyOf(this.a, size,
                                         (Class<? extends T[]>) a.getClass());
                System.arraycopy(this.a, 0, a, 0, size);
                if (a.length > size)
                    a[size] = null;
                return a;
            }
    
            @Override
            public E get(int index) {
                return a[index];
            }
    
            @Override
            public E set(int index, E element) {
                E oldValue = a[index];
                a[index] = element;
                return oldValue;
            }
    
            @Override
            public int indexOf(Object o) {
                E[] a = this.a;
                if (o == null) {
                    for (int i = 0; i < a.length; i++)
                        if (a[i] == null)
                            return i;
                } else {
                    for (int i = 0; i < a.length; i++)
                        if (o.equals(a[i]))
                            return i;
                }
                return -1;
            }
    
            @Override
            public boolean contains(Object o) {
                return indexOf(o) != -1;
            }
    
            @Override
            public Spliterator<E> spliterator() {
                return Spliterators.spliterator(a, Spliterator.ORDERED);
            }
    
            @Override
            public void forEach(Consumer<? super E> action) {
                Objects.requireNonNull(action);
                for (E e : a) {
                    action.accept(e);
                }
            }
    
            @Override
            public void replaceAll(UnaryOperator<E> operator) {
                Objects.requireNonNull(operator);
                E[] a = this.a;
                for (int i = 0; i < a.length; i++) {
                    a[i] = operator.apply(a[i]);
                }
            }
    
            @Override
            public void sort(Comparator<? super E> c) {
                Arrays.sort(a, c);
            }
        }
    AbstractList源码:
    
     /**
         * {@inheritDoc}
         *
         * <p>This implementation always throws an
         * {@code UnsupportedOperationException}.
         *
         * @throws UnsupportedOperationException {@inheritDoc}
         * @throws ClassCastException            {@inheritDoc}
         * @throws NullPointerException          {@inheritDoc}
         * @throws IllegalArgumentException      {@inheritDoc}
         * @throws IndexOutOfBoundsException     {@inheritDoc}
         */
        public void add(int index, E element) {
            throw new UnsupportedOperationException();
        }
    

    码字不易,如果看懂了,期待五连点赞⬇⬇⬇⬇⬇

    展开全文
  • java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String问题背景 接口中参数为 Map问题分析 以 Map// 示例:模拟将Integer存入Map,取出后强制转为String public static void main...
  • 博客来源: 进行类转换的时候,Integer转换为long是出错 ... java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long at com.example.demo.MainActivity$4.onClick(Ma...
  • java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long问题描述:报错信息:Error querying database. Cause: java.sql.SQLException: java.lang.ClassCastException: java.math....
  • java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double 原因:xml文件中 是double 儿实体类中是string类型 解决方法:改成同一种类型
  • java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String  at java.lang.Iterable.forEach(Iterable.java:75)  at org.springframework.http.converter.FormHttpMessageC...
  • mybatis中Date参数传入报异常:java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String; 异常信息如下: org.mybatis.spring.MyBatisSystemException: nested exception is org....
  • java.lang.IllegalArgumentException: Can not set final [B field java.lang.String.value to java.lang.String at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(U....
  • 错误如下:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long at com.xz.app.controller.CyInforController.listCyinfor(CyInforController.java:149) at sun.reflect....
  • 2020-10-28 21:33:17 |DEBUG |main |DirectJDKLog.java:175 |org.apache.tomcat.util.compat.Jre9Compat |...java.lang.ClassNotFoundException: java.lang.reflect.InaccessibleObjectException 升级JDK版本 9及以上
  • 用List<String> list 接收的list,获取list长度,循环得到 list.get(i),想得到集合中的...java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.String at io.renren.modules.equip...
  • 最近在Linux上的eclipse中运行java程序出现了这样的错误,弄了很久用了以下三种方法终后终于成功运行了,分享下,希望能帮助到... java.lang.NoClassDefFoundError: org/apache/commons/configuration/Configurat...
  • java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer异常 这个异常非常容易理解,String类型的数据转换为Integer,出错了。 如果发生这个异常,仔细检查你在应该填写数字的地方...
  • android报错 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass() 基本上是fragment add的时候重复了
  • java.lang.IllegalArgumentException 如何解决这个异常

    万次阅读 多人点赞 2018-07-18 16:03:47
    很多人说这个异常是spring版本和jdk版本不一致导致的,其实不然你可以运行一下这一段代码 public static void main(String[] args) { String timeStamp = "1531782000000";//直接是时间戳 ...
  • @[TOC](解决 java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader ‘bootstrap’)) ...
  • springBoot 2.0 添加 日志级别,启动报错: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'logging.level' to ...java.lang.String, java.lang.String&...
  • java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 问题背景 接口中参数为 Map<String,Object>取出某 KEY 值时,强制将其转为 String ,出现上述异常 问题分析 以 Map&...
  • java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
  • java.lang.ClassCastException: cannot assign instance of java.lang.Integer to field ...
  • 从map中获取对象提示错误java.lang.Doublecannot be cast to java.lang.String,这个错误很明显是类型转换错误 解决方案: 1.直接使用tosting的方式 String str = entry.value().toString(); 2.使用String类的...
  • 今天java后台报错:java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String 出错代码:allMap.put(entry.getKey() + "_"+date.replace("-", ""), entry.getValue()); 这行,entry...
  • 在做第三封登陆,取用户信息时,出现了错误java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String指示下面这行里有错误,类型转换错误 String qqicon = sp.getString("qqicon"...
  • 注意:阅读本文,需要对java虚拟机有一定的了解 名词解释 StackOverflowError:栈溢出错误 OutOfMemoryError:内存溢出错误 栈溢出 如果一个线程在计算时所需要用到栈大小 &amp;amp;amp;...
  • 问题:java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.Object android.content.Context.getSystemService(java.lang.String)’ on a null object reference at android.view....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,109,303
精华内容 443,721
关键字:

java.lang

java 订阅