public class NullPointTest { public static void main(String[] args) { //fruitService.getAppleService() 可能为空,会导致空指针问题 fruitService.getAppleService().getWeight().equals("OK"); } }
1.3 Equals方法左边的空指针问题
public class NullPointTest { public static void main(String[] args) { String s = null; if (s.equals("666")) { //s可能为空,会导致空指针问题 System.out.println("公众号:捡田螺的小男孩,666"); } } }
1.4 ConcurrentHashMap 这样的容器不支持 Key,Value 为 null。
public class NullPointTest { public static void main(String[] args) { Map map = new ConcurrentHashMap<>(); String key = null; String value = null; map.put(key, value); } }
1.5 集合,数组直接获取元素
public class NullPointTest { public static void main(String[] args) { int [] array=null; List list = null; System.out.println(array[0]); //空指针异常 System.out.println(list.get(0)); //空指针一场 } }
1.6 对象直接获取属性
public class NullPointTest { public static void main(String[] args) { User user=null; System.out.println(user.getAge()); //空指针异常 } }
public class DoubleTest { public static void main(String[] args) { System.out.println(0.1+0.2); System.out.println(1.0-0.8); System.out.println(4.015*100); System.out.println(123.3/100);
char[] chars = new char[10]; String content = ""; try (FileInputStream fileInputStream = new FileInputStream("jay.txt"); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, Charset.forName("GBK"))) { int count; while ((count = inputStreamReader.read(chars)) != -1) { content += new String(chars, 0, count); } } System.out.println(content); } }
5. Integer缓存的坑
public class IntegerTest {
public static void main(String[] args) { Integer a = 127; Integer b = 127; System.out.println("a==b:"+ (a == b));
Integer c = 128; Integer d = 128; System.out.println("c==d:"+ (c == d)); } }
运行结果:
a==b:true c==d:false
为什么Integer值如果是128就不相等了呢?「编译器会把 Integer a = 127 转换为 Integer.valueOf(127)。」 我们看下源码。
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
public class ArrayAsListTest { public static void main(String[] args) { int[] array = {1, 2, 3}; List list = Arrays.asList(array); System.out.println(list.size()); } }
运行结果:
1
Arrays.asList源码如下:
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
9.2 Arrays.asList 返回的 List 不支持增删操作。
public class ArrayAsListTest { public static void main(String[] args) { String[] array = {"1", "2", "3"}; List list = Arrays.asList(array); list.add("5"); System.out.println(list.size()); } }
运行结果:
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at object.ArrayAsListTest.main(ArrayAsListTest.java:11)
Arrays.asList 返回的 List 并不是我们期望的 java.util.ArrayList,而是 Arrays 的内部类 ArrayList。内部类的ArrayList没有实现add方法,而是父类的add方法的实现,是会抛出异常的呢。
9.3 使用Arrays.asLis的时候,对原始数组的修改会影响到我们获得的那个List
public class ArrayAsListTest { public static void main(String[] args) { String[] arr = {"1", "2", "3"}; List list = Arrays.asList(arr); arr[1] = "4"; System.out.println("原始数组"+Arrays.toString(arr)); System.out.println("list数组" + list); } }
public class ArrayListTest { public static void main(String[] args) { List<String> list = new ArrayList<String>(1); list.add("公众号:捡田螺的小男孩"); String[] array21 = (String[])list.toArray();//类型转换异常 } }
因为返回的是Object类型,Object类型数组强转String数组,会发生ClassCastException。解决方案是,使用toArray()重载方法toArray(T[] a)
Exception in thread "main" 反序列化的类型是否为Integer:true java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long at object.JSONTest.main(JSONTest.java:24)
ExecutorService executor = Executors.newFixedThreadPool(10); for (int i = 0; i < Integer.MAX_VALUE; i++) { executor.execute(() -> { try { Thread.sleep(10000); } catch (InterruptedException e) { //do nothing } }); }
「IDE指定JVM参数:-Xmx8m -Xms8m :」
运行结果:
我们看下源码,其实newFixedThreadPool使用的是无界队列!
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
public class LinkedBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { ...
/** * Creates a {@code LinkedBlockingQueue} with a capacity of * {@link Integer#MAX_VALUE}. */ public LinkedBlockingQueue() { this(Integer.MAX_VALUE); } ... }